1. 程式人生 > >將圖片轉換為素描圖

將圖片轉換為素描圖

用OpenCV、Python一張RGB顏色的影象經過下面四個步驟就能夠生成出一張素描圖:

  1. 將RGB圖轉化為灰度圖。
  2. 灰度圖進行反色操作。
  3. 將步驟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

來實現高斯模糊操作,引數ksize表示高斯核的大小。sigmaX和sigmaY分別表示高斯核在 X 和 Y 方向上的標準差。

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)