一文教你使用OpenCV為照片添加卡通效果
OpenCV 是一個(gè)用于實(shí)時(shí)計(jì)算機(jī)視覺(jué)應(yīng)用的 Python 庫(kù)。OpenCV 是開(kāi)源的,在圖像處理、機(jī)器學(xué)習(xí)和深度學(xué)習(xí)方面有著巨大的應(yīng)用。OpenCV 可用于對(duì)象檢測(cè)、分類(lèi)、筆跡分析等。
OpenCV 可以與 Numpy 等庫(kù)集成,用于各種數(shù)學(xué)計(jì)算。
計(jì)算機(jī)視覺(jué)的主要目的是理解圖像。
OpenCV:它是關(guān)于什么的?
使用 OpenCV,我們可以執(zhí)行許多任務(wù),例如-
讀取和寫(xiě)入圖像
圖像處理
捕獲和保存視頻
特征檢測(cè)
OpenCV 代表開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù)。它是使用 Python 用于計(jì)算機(jī)視覺(jué)的最流行的庫(kù)。OpenCV 可供所有人免費(fèi)使用,因此 OpenCV 可用于各種項(xiàng)目和應(yīng)用程序。
為我們的圖像賦予卡通效果
許多應(yīng)用程序和網(wǎng)站都提供了為圖像賦予卡通效果的工具。年輕一代喜歡這個(gè)功能,它在社交媒體上也很受歡迎。在這些應(yīng)用程序的情況下,我們只需上傳我們的圖像,然后就會(huì)返回具有所需效果的圖像。
但是,你有沒(méi)有想過(guò),它們是如何工作的?
為此,需要進(jìn)行多次圖像轉(zhuǎn)換。在執(zhí)行此操作時(shí)需要考慮的一些重要事項(xiàng)是邊緣和顏色數(shù)量。
讓我們繼續(xù)看看代碼。
import cv2
import numpy as np
import matplotlib.image as img
from matplotlib import pyplot as plt
我們將需要 OpenCV 和 NumPy。
現(xiàn)在,讓我們閱讀圖像。
#reading the image
img = cv2.imread("person.jpeg")
我們已經(jīng)將圖像作為輸入。
讓我們看看圖像數(shù)據(jù)類(lèi)型是什么。
#image type
type(img)
輸出: numpy.ndarray
因此,圖像基本上是一個(gè)多維的 NumPy 數(shù)組。
邊緣遮罩
在卡通效果中,通常非常強(qiáng)調(diào)圖像邊緣的厚度。
我們可以使用**cv2.a(chǎn)daptiveThreshold()**函數(shù)檢測(cè)邊緣。
在我們繼續(xù)處理邊緣之前,我們需要將圖像轉(zhuǎn)換為灰度。然后,使用 cv2.medianBlur函數(shù)來(lái)降低灰度圖像的噪聲。
讓我們繼續(xù)看看代碼:
#Create Edge Mask
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
line_size = 7
blur_value = 7
定義了線(xiàn)條大小和模糊值。為了強(qiáng)調(diào)較粗的邊緣,采用較大的線(xiàn)條尺寸。
讓我們得到邊緣。
edges = edge_mask(img, line_size, blur_value)
現(xiàn)在,我們保存圖像。
filename = 'edges.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, edges)
輸出:
我們可以看到檢測(cè)到了邊緣。
減少顏色數(shù)量
照片和草圖/卡通之間的主要區(qū)別在于不同顏色的數(shù)量。與高清照片相比,卡通素描的顏色要少得多。
因此,使用了一種名為顏色量化的方法。這將減少照片中的顏色數(shù)量。
K均值聚類(lèi)算法用于執(zhí)行該過(guò)程。“k”值根據(jù)我們需要的顏色數(shù)量進(jìn)行調(diào)整。
#colour quantization
#k value determines the number of colours in the image
total_color = 8
k=total_color
在這種情況下,k 的值取為 8。
# Transform the image
data = np.float32(img).reshape((-1, 3))
接下來(lái),圖像被轉(zhuǎn)換。
# Determine criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)
現(xiàn)在,我們實(shí)施 K 均值。
# 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)
讓我們保存圖像。
filename = 'colour.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, result)
輸出:
好的,現(xiàn)在我們看到了一些效果。
顏色量化完成后,我們現(xiàn)在可以減少圖像中的噪聲。雙邊濾波器可用于此任務(wù)。
生成的圖像會(huì)稍微模糊,圖像清晰度會(huì)降低。
blurred = cv2.bilateralFilter(result, d=10, sigmaColor=250,sigmaSpace=250)
讓我們保存圖像,看看它的外觀(guān)。
#saving the image
filename = 'blurred.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, blurred)
輸出:
完成后,現(xiàn)在我們做最后的卡通效果。
最終圖像
#blurred and edges
cartoon = cv2.bitwise_and(blurred, blurred, mask=edges)
現(xiàn)在,我們保存圖像。
filename = 'cartoon.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, cartoon)
讓我們看看圖像是什么樣子的。
輸出做得很好。圖像被賦予了有趣的效果。
OpenCV 可以進(jìn)行有趣的圖像轉(zhuǎn)換。
現(xiàn)在讓我們嘗試其他東西,這一次,我們也將使用輪廓。
應(yīng)用帶有輪廓的卡通效果
讓我們首先正確定義函數(shù)。
首先是顏色量化函數(shù)。
#Colour Quantization
def ColourQuantization(image, K=9):
Z = image.reshape((-1, 3))
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
compactness, label, center = cv2.kmeans(Z, K, None, criteria, 1, cv2.KMEANS_RANDOM_CENTERS)
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((image.shape))
return res2
這里,對(duì)于 K-Means,K 的值取為 9。
現(xiàn)在讓我們定義輪廓的函數(shù)。
#to get countours
def Countours(image):
contoured_image = image
gray = cv2.cvtColor(contoured_image, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(gray, 200, 200)
contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2:]
cv2.drawContours(contoured_image, contours, contourIdx=-1, color=6, thickness=1)
return contoured_image
在這個(gè)函數(shù)中,圖像首先被轉(zhuǎn)換為灰度,然后檢測(cè)邊緣。最后,還制作了輪廓。
現(xiàn)在,讓我們使用該函數(shù)。
使用了下圖。
image = cv2.imread("person1.jpeg")
coloured = ColourQuantization(image)
contoured = Countours(coloured)
final_image = contoured
在此之后,圖像被保存。
filename = 'cartoon_final.jpg'
# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, final_image)
輸出:
在這種情況下,輸出也很有趣。
通過(guò)改變各種參數(shù),可以修改卡通效果。
說(shuō)到用途,目前這類(lèi)處理方法主要用于社交媒體和藝術(shù)目的。人們可以對(duì)他們的圖像進(jìn)行有趣的編輯,并將它們發(fā)布到社交媒體上。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線(xiàn)會(huì)議】多物理場(chǎng)仿真助跑新能源汽車(chē)
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線(xiàn)會(huì)議
-
12月19日立即報(bào)名>> 【線(xiàn)下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線(xiàn)峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
推薦專(zhuān)題
- 1 【一周車(chē)話(huà)】沒(méi)有方向盤(pán)和踏板的車(chē),你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車(chē),還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開(kāi)啟變現(xiàn)競(jìng)速
- 6 海信給AI電視打樣,12大AI智能體全面升級(jí)大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 10 比蘋(píng)果偉大100倍!真正改寫(xiě)人類(lèi)歷史的智能產(chǎn)品降臨
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷(xiāo)售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷(xiāo)售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專(zhuān)家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市