將圖片轉換為素描圖
阿新 • • 發佈:2018-12-19
用OpenCV、Python一張RGB顏色的影象經過下面四個步驟就能夠生成出一張素描圖:
- 將RGB圖轉化為灰度圖。
- 灰度圖進行反色操作。
- 將步驟1中的灰度影象和步驟三中的模糊反色影象混合,這裡就用到亮化(Dodging)和暗化(burning)的技術。
1、在讀取圖片是可將直接讀取為灰度模式
img_gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
這裡呼叫cv2.imread
函式時,設定了cv2.IMREAD_GRAYSCALE
的標誌,表示載入灰度圖。在imread
函式中是設定了三種標誌,分別是
-
cv2.IMREAD_COLOR : 預設使用該種標識。載入一張彩色圖片,忽視它的透明度。
-
cv2.IMREAD_GRAYSCALE : 載入一張灰度圖。
-
cv2.IMREAD_UNCHANGED : 載入影象,包括它的Alpha 通道(Alpha 表示圖片的透明度)。
另外,如果覺得以上標誌太長,可以簡單使用 1,0,-1 代替,效果是相同的。
2、灰度圖反色影象可以通過將灰度圖每個畫素點取反得到,由於灰度圖的畫素點的在0-255之間,將其取反的話就是255-當前畫素點。
img_gray_inv = 255 - img_gray
3、之後進行高斯模糊,去除噪點。Gaussian blur能夠很有效地減少影象中的噪聲,能夠將影象變得更加平滑一點,在數學上等價於用高斯核來對影象進行卷積操作。我們可以通過cv2.GaussianBlur
4、高斯圖與第3步圖融合。
這一步驟自然就是需要得到最終的素描圖結果了。在傳統照相技術中,當需要對圖片某個區域變得更亮或者變暗,可以通過控制它的曝光時間,這裡就用到亮化(Dodging)和暗化(burning)的技術。
在現代影象編輯工具,比如 PS 可以實現上述說的兩種技術。比如對於顏色亮化技術,給定一張圖片 A 和 蒙版 B,那麼實現做法如下所示:
(B[idx] == 255)?B[idx]:min(255, ((A[idx] << 8) / (255-B[idx])))
完整程式碼如下:
#!/user/bin/env python
# _*_ utf-8 _*_
import cv2
def dodgeV2(imge,mask):
return cv2.divide(imge,255-mask,scale=256)
def burnV2(imge,mask):
return 255-cv2.divide(255-imge,255-mask,scale=256)
def rgb_sket(imgpath,imgsave):
img_rgb=cv2.imread(imgpath)
img_gray=cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)#取灰度圖
img_gray_inv=255-img_gray #取反
img_blur=cv2.GaussianBlur(img_gray_inv,ksize=(21,21),\
sigmaX=0,sigmaY=0)#高斯模糊
img_blend = dodgeV2(img_gray, img_blur)
cv2.imshow("Gray",img_gray)
cv2.imshow("Gray_inv",img_gray_inv)
cv2.imshow("picture",img_blend)
cv2.imwrite(imgsave,img_blend)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__=="__main__":
imgpath="D:/test.jpg"
imgsave="D:/result.jpg"
rgb_sket(imgpath,imgsave)