訂閱
糾錯
加入自媒體

如何利用OpenCV為Python中的圖像提供卡通效果?

正如你可能知道的,素描或創(chuàng)建一個卡通并不總是需要手動完成。如今,許多應用程序可以把你的照片變成卡通照片。但是如果我告訴你,你可以用幾行代碼創(chuàng)造屬于自己的效果呢?有一個名為OpenCV的庫,它為計算機視覺應用程序提供了一個公共基礎設施,并優(yōu)化了機器學習算法。它可以用來識別物體,檢測和產(chǎn)生高分辨率的圖像。本文,將向你展示如何利用OpenCV為Python中的圖像提供卡通效果。使用google colab來編寫和運行代碼。你可以在這里訪問Google Colab中的完整代碼https://colab.research.google.com/drive/1lV5oJ_hI8PsSV1WDVWWfL18-tMm4vnxe?usp=sharing要創(chuàng)造卡通效果,我們需要注意兩件事:邊緣和調(diào)色板。這就是照片和卡通的區(qū)別所在。為了調(diào)整這兩個主要部分,我們將經(jīng)歷四個主要步驟:加載圖像創(chuàng)建邊緣蒙版減少調(diào)色板結(jié)合邊緣蒙版和彩色圖像在開始主要步驟之前,不要忘記導入notebook中所需的庫,尤其是cv2和NumPy。import cv2
import numpy as np
# required if you use Google Colab
from google.colab.patches import cv2_imshow
from google.colab import files

1. 加載圖像第一個主要步驟是加載圖像。定義read_file函數(shù),其中包括cv2_imshow以在Google Colab中加載所選圖像。def read_file(filename):
 img = cv2.imread(filename)
 cv2_imshow(img)
 return img

調(diào)用創(chuàng)建的函數(shù)來加載圖像。uploaded = files.upload()
filename = next(iter(uploaded))
img = read_file(filename)

我選擇了下面的圖片來轉(zhuǎn)化成卡通圖片。

2. 創(chuàng)建邊緣蒙版通常,卡通效果強調(diào)圖像中邊緣的厚度。我們可以使用 cv2.a(chǎn)daptiveThreshold() 函數(shù)檢測圖像中的邊緣?傊,我們可以將 egde_mask函數(shù)定義為:def edge_mask(img, line_size, blur_value):
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 gray_blur = cv2.medianBlur(gray, blur_value)
 edges = cv2.a(chǎn)daptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, line_size, blur_value)
 return edges

在該函數(shù)中,我們將圖像轉(zhuǎn)換為灰度圖像。然后,利用cv2.medianBlur對模糊灰度圖像進行去噪處理。模糊值越大,圖像中出現(xiàn)的黑色噪聲就越少。然后,應用自適應閾值函數(shù),定義邊緣的線條尺寸。較大的線條尺寸意味著圖像中強調(diào)的較厚邊緣。定義函數(shù)后,調(diào)用它并查看結(jié)果。line_size = 7
blur_value = 7
edges = edge_mask(img, line_size, blur_value)
cv2_imshow(edges)

3. 減少調(diào)色板照片和圖畫之間的主要區(qū)別——就顏色而言——是每一張照片中不同顏色的數(shù)量。圖畫的顏色比照片的顏色少。因此,我們使用顏色量化來減少照片中的顏色數(shù)目。色彩量化為了進行顏色量化,我們采用OpenCV庫提供的K-Means聚類算法。為了在接下來的步驟中更容易實現(xiàn),我們可以如下定義color_quantization 函數(shù)。def color_quantization(img, k):
# Transform the image
 data = np.float32(img).reshape((-1, 3))
# Determine criteria
 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)
# Implementing K-Means
 ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
 center = np.uint8(center)
 result = center[label.flatten()]
 result = result.reshape(img.shape)
 return result

我們可以調(diào)整k值來確定要應用于圖像的顏色數(shù)。total_color = 9

img = color_quantization(img, total_color)

在本例中,我使用9作為圖像的k值。結(jié)果如下所示。

雙邊濾波器在進行顏色量化之后,我們可以使用雙邊濾波器來降低圖像中的噪聲。它會給圖像帶來一點模糊和銳度降低的效果。blurred = cv2.bilateralFilter(img, d=7,
sigmaColor=200,sigmaSpace=200)

有三個參數(shù)可根據(jù)你的首選項進行調(diào)整:d:每個像素鄰域的直徑sigmaColor:參數(shù)值越大,表示半等色區(qū)域越大。sigmaSpace:參數(shù)的值越大,意味著更遠的像素將相互影響,只要它們的顏色足夠接近。

4. 結(jié)合邊緣蒙版和彩色圖像最后一步是將我們之前創(chuàng)建的邊緣蒙版與彩色處理圖像相結(jié)合。為此,請使用cv2.bitwise_and函數(shù)。cartoon = cv2.bitwise_and(blurred, blurred, mask=edges)
我們可以在下面看到原始照片的“卡通版”。

現(xiàn)在你可以開始來創(chuàng)建你自己的卡通效果。除了在我們上面使用的參數(shù)中調(diào)整值之外,你還可以從OpenCV添加另一個函數(shù)來為你的照片提供特殊效果。代碼庫里還有很多東西我們可以探索。很高興嘗試!

圖片標題

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號