1. 程式人生 > >三行代碼把女朋友照片變成了素描圖片!人生苦短,愛python多一些

三行代碼把女朋友照片變成了素描圖片!人生苦短,愛python多一些

python -o 取圖 tco 兩層 學習教程 以及 == 很多

我們知道圖片除了最普通的彩×××,還有很多類型,比如素描,卡通,黑白等等,今天就介紹如何使用python和opencv來實現圖片變素描圖。

首先將彩×××轉換成灰度圖;

對灰度圖進行求其反色的操作;

對第2步得到的結果采用一個高斯模糊的操作;

采用顏色亮化(color dodge)的技術將第一步的灰度圖和第三步操作後的圖片進行混合。

事先準備,首先是安裝好 opencv,可以直接通過 pip 進行安裝:

pip install opencv-python

接著準備一張圖片,最好是顏色鮮明一點的圖片,方便對比轉換的效果。

技術分享圖片

如果大家想找一個Python學習環境,可以加入我們的Python學習圈:784758214 ,自己是一名高級python開發工程師,這裏有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、django、人工智能、機器學習等。送給正在學習python的小夥伴!每天會準時的講一些項目實戰案例,分享一些學習的方法和需要註意的小細節,,這裏是python學習者聚集地

技術分享圖片

上面的代碼是讀取圖片後,再通過調用 cv2.cvtColor 函數將圖片轉換成灰度圖,實際上我們可以直接在讀取圖片時候就直接轉換圖片,即:

img_gray = cv2.imread(‘example.jpg‘, cv2.IMREAD_GRAYSCALE)

這裏調用 cv2.imread 函數時,設置了 cv2.IMREAD_GRAYSCALE 的標誌,表示加載灰度圖。在imread 函數中是設置了三種標誌,分別是

技術分享圖片

技術分享圖片

其實就是原本比較暗的地方變光亮了,而比較亮的地方變暗了。

第三步:高斯模糊

高斯模糊操作是一個有效減少圖片噪音以及對圖片進行平滑操作的方法,在數學上等價於對圖像采用高斯核進行卷積的操作。我們可以直接調用 cv2.GaussianBlur 來實現高斯模糊操作,這裏需要設置參數 ksize ,表示高斯核的大小, sigmaX 和 sigmaY 分別表示高斯核在 X 和 Y 方向上的標準差。

技術分享圖片

在現代圖像編輯工具,比如 PS 可以實現上述說的兩種技術。比如對於顏色亮化技術,給定一張圖片 A 和 蒙版 B,那麽實現做法如下所示:

(B[idx] == 255)?B[idx]:min(255, ((A[idx] << 8) / (255-B[idx])))

通過 python 代碼實現上述公式,那麽原始代碼如下所示:

技術分享圖片

上述代碼雖然實現了這個功能,但是很明顯會非常耗時,中間采用了一個兩層循環,計算復雜度是 O(w*h) ,也就是如果圖片的寬和高的乘積越大,耗時就越長,所以就有了升級版的代碼版本:

def dodgeV2(image, mask):

return cv2.divide(image, 255 - mask, scale=256)

運行上述代碼,得到的最終結果如下所示:

技術分享圖片

效果看起來還可以,除了右下角部分對於原圖中黑色區域處理得不是很好。

而另一種技術—-暗化操作的代碼如下所示:

def burnV2(image, mask):

return 255 - cv2.divide(255 - image, 255 - mask, scale=256)

效果如下圖所示:

技術分享圖片

完整版代碼如下所示:

技術分享圖片

最後,還有一種更加快速的實現,代碼如下所示,僅需四行代碼即可實現轉換成素描圖的效果。

def rgb_to_sketch_v2(src_image_name):

img_gray = cv2.imread(src_image_name, 0)

img_blur = cv2.GaussianBlur(img_gray, (21, 21), 0, 0)

img_blend = cv2.divide(img_gray, img_blur, scale=256)

img_result = cv2.cvtColor(img_blend, cv2.COLOR_GRAY2BGR)

用一個女演員的照片來看看這個轉換的效果:

技術分享圖片

好像。。昂,,還是彩色的好看

三行代碼把女朋友照片變成了素描圖片!人生苦短,愛python多一些