一鍵進入二次元!用Python將自拍轉換為卡通風格
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。
如今,畫素描或創作漫畫并不一定要手動完成,許多應用程序可以把你的照片轉換成卡通圖片。這并不像你想象中那么難,只需幾行代碼就能實現想要的效果。
有一個名為OpenCV的庫,為計算機視覺應用提供了通用基礎設施,并對機器學習算法進行了優化。它可用于識別物體、檢測并生成高分辨率圖像。本教程將展示如何利用OpenCV在Python中賦予圖像卡通效果。教程中將使用Google Colab來編寫并運行代碼。
要想制造出卡通效果,需要注意兩點:邊緣和調色板。這就是照片和卡通圖片之間的區別。要調整這兩個要點,將通過四個主要步驟:
- 載入圖像
- 創建邊緣蒙版
- 減少調色板
- 將邊緣蒙版與經過顏色處理的圖像結合起來
在開始之前,別忘了在筆記本中導入所需的庫,尤其是cv2和NumPy。
- defread_file(filename):
- img = cv2.imread(filename)
- cv2_imshow(img)
- return img
1. 載入圖像
第一個步驟是載入圖片。定義read_file函數,其中包含cv2_imshow,來載入我們在Google Colab中選擇的圖片。
- defread_file(filename):
- img = cv2.imread(filename)
- cv2_imshow(img)
- return img
調用創建的函數來載入圖像:
- uploaded = files.upload()
- filename = next(iter(uploaded))
- img = read_file(filename)
我選擇將下面這張圖變為卡通圖片:
2. 創建邊緣蒙版
常見的卡通效果強調圖像中邊緣的厚度。可以通過cv2.adaptiveThreshold() 函數來檢測圖像中的邊緣。我們可以將egde_mask函數定義為:
- defedge_mask(img, line_size,blur_value):
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- gray_blur = cv2.medianBlur(gray,blur_value)
- edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, line_size,blur_value)
- return edges
在該函數中,我們將圖像轉換成灰度圖像,然后使用cv2.medianBlur來減少模糊的灰度圖像的噪點。模糊值越大,意味著圖像中出現的黑色噪點越少。接著,應用adaptiveThreshold函數,定義邊緣的線條粗細。線條越粗,意味著圖像中強調的邊緣越厚。
定義完函數后,調用函數就可以看到結果了。
- line_size = 7
- blur_value = 7edges = edge_mask(img, line_size, blur_value)
- cv2_imshow(edges)
邊緣蒙版檢測
3. 減少調色板
在顏色方面,照片和素描的主要區別是它們各自的顏色數量。素描的顏色比照片少。因此,我們使用顏色量化來減少照片中的顏色數量。
要進行顏色量化,我們應用OpenCV庫提供的K均值聚類算法。為了在接下來的步驟中使用更方便,可以定義color_quantization函數如下:
- defcolor_quantization(img, k):
- # Transform theimage
- data = np.float32(img).reshape((-1, 3))
- # Determinecriteria
- criteria = (cv2.TERM_CRITERIA_EPS+ cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)
- # ImplementingK-Means
- ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
- center = np.uint8(center)
- result = center[label.flatten()]
- resultresult = result.reshape(img.shape)
- return result
可以調整k值來確定想要應用到圖像的顏色數量:
- total_color = 9
- img = color_quantization(img, total_color)
在本例中,圖像的k值設置為9。結果如下所示:
顏色量化后
完成顏色量化后,可以通過雙邊濾波來降低圖像中的噪點。這會使圖像變得稍微模糊,且銳度降低。
- blurred = cv2.bilateralFilter(img, d=7, sigmaColor=200,sigmaSpace=200)
這里有三個參數,你可以根據自己的喜好進行調整。
- d —每個像素鄰域的直徑。
- sigmaColor —該參數的值越大,表示半等色的區域越大。
- sigmaSpace –該參數的值越大,意味著較遠的像素只要其顏色足夠接近,就會相互影響。
使用雙邊濾波后
4. 將邊緣蒙版與經過顏色處理的圖像相結合
最后一步是將我們之前創建的邊緣蒙版與經過顏色處理的圖像相結合。要做到這一點,需要使用cv2.bitwise_and函數。
- cartoon = cv2.bitwise_and(blurred, blurred, mask=edges)
這就是原圖的“卡通版”:
最終效果
現在你可以開始創建屬于自己的卡通效果啦。除了調整我們上面使用的參數值,你還可以從OpenCV中添加另一個函數來給你的照片添加特殊效果,庫中還有很多可以探索的東西。嘗試愉快!