沈陽看男科哪家醫(yī)院好廣州seo排名收費

一、說明
????????在當今世界,我們被圖像和視頻所包圍。從社交媒體到廣告,圖像已成為一種強大的交流媒介。但是你有沒有想過,如果你能把你的照片變成卡通會發(fā)生什么?想象一下,為您最喜歡的照片創(chuàng)建動畫版本,或者將肖像轉換為異想天開的插圖。
????????在本文中,我們將探討如何使用 Python 中的 OpenCV 庫將圖像轉換為卡通。OpenCV 是一個功能強大的計算機視覺庫,為圖像和視頻處理提供了廣泛的功能,包括邊緣檢測、顏色轉換和過濾。我們將使用這些工具在給定的圖像上創(chuàng)建卡通效果。
????????為此,我們將首先導入必要的模塊并加載輸入圖像。接下來,我們將對圖像應用一系列轉換,包括邊緣檢測、顏色量化和雙邊濾波。最后,我們將結合這些轉換,在輸入圖像上創(chuàng)建卡通效果。在整篇文章中,我們將提供有關如何使用 OpenCV 實現(xiàn)每個轉換的分步說明。在本文結束時,您將清楚地了解如何使用 OpenCV 在任何輸入圖像上創(chuàng)建卡通效果。因此,讓我們深入了解如何使用OpenCV將圖像轉換為卡通!
二、導入必要的庫?
import cv2
import numpy as np
import os
2.1 代碼說明:
import cv2
導入 OpenCV 庫,該庫為圖像和視頻處理提供了廣泛的功能。import numpy as np
導入 NumPy 庫,這是一個流行的庫,用于在 Python 中處理數(shù)組和矩陣。import os
導入操作系統(tǒng)模塊,該模塊提供了一種與文件系統(tǒng)交互的方法。
總的來說,這段代碼導入了在 Python 中使用 OpenCV 執(zhí)行圖像處理的必要模塊。
2.2 在 Python 中使用 OpenCV 顯示輸入圖像:
img = cv2.imread('original_picture.jpg')
cv2.imshow("original", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
原始圖片
2.3 代碼說明:
cv2.imread('original_picture.jpg')
將名為“original_picture.jpg”的輸入圖像加載到名為 的變量中。這是您想要的圖片的名稱。img
cv2.imshow("original", img)
?在標題為“原始”的窗口中顯示輸入圖像。cv2.waitKey(0)
等待按鍵。參數(shù) 0 表示程序將無限期等待,直到按下某個鍵。cv2.destroyAllWindows()
?關閉所有打開的窗口。
三、使用 K 均值聚類進行顏色量化:
def color_quantization(img, k):
# Transform the imagedata = np.float32(img).reshape((-1, 3))# Determine criteriacriteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)# Implementing K-Meansret, 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
3.1 功能說明:
- 該函數(shù)采用兩個參數(shù) — 輸入圖像和聚類數(shù)。
img
k
- 輸入圖像首先使用 NumPy 庫轉換為像素值的二維數(shù)組。
- 為 K-Means 聚類分析算法確定一組條件,包括聚類中心的最大迭代次數(shù)和最小變化。
- K 均值聚類分析算法使用 cv2.kmeans() 函數(shù)應用于數(shù)據,具有指定數(shù)量的聚類和條件。如果變量發(fā)生變化,該函數(shù)將生成具有不同數(shù)量顏色簇的新量化圖像。較小的值 將導致具有較少顏色的量化圖像,而較大的值 將導致具有更多顏色的量化圖像。
k
k
k
- 生成的聚類中心使用 NumPy 函數(shù)轉換為 8 位整數(shù)。
np.uint8()
- 原始圖像被展平為像素值的一維數(shù)組,每個像素被分配到其最近的聚類中心。
- 然后將生成的像素值數(shù)組重新塑造回原始輸入圖像的形狀。
- 生成的量化圖像作為函數(shù)的輸出返回。
3.2 創(chuàng)建邊緣遮罩:
def edge_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
3.3 功能說明:
- 該函數(shù)有三個參數(shù)——輸入圖像、蒙版中線條的大小和應用于灰度圖像的模糊程度。如果變量發(fā)生變化,掩碼中線條的大小也會相應更改。較小的值將導致更細的線條,而較大的值將導致較粗的線條。
img
line_size
blur_value
line_size
- 首先使用該函數(shù)將輸入圖像轉換為灰度。
cv2.cvtColor()
- 然后使用具有指定 .如果變量發(fā)生變化,應用于灰度圖像的模糊級別將發(fā)生變化。較小的值將導致較少的模糊,而較大的值將導致更多的模糊。
cv2.medianBlur()
blur_value
blur_value
- 通過使用該功能對模糊的灰度圖像應用自適應閾值來創(chuàng)建邊緣遮罩。這種自適應閾值方法根據每個像素周圍局部鄰域中像素值的平均值計算每個像素的閾值。
cv2.adaptiveThreshold()
- 生成的邊緣掩碼作為函數(shù)的輸出返回。
四、從圖像生成鉛筆素描:
line_size = 7
blur_value = 7edges = edge_mask(img, line_size, blur_value)
cv2.imwrite('pencil_sketch.jpg', edges)
cv2.imshow('pencil sketch', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
鉛筆素描
4.1 代碼說明:
- 代碼首先將 和 的值設置為 7。如果 和 的值發(fā)生變化,則生成的鉛筆素描將受到影響。較小的 值將導致線條越細,而較大的值將導致線條變粗。同樣,較小的 值將導致較少的模糊,而較大的值將導致更多的模糊,這可能會影響鉛筆草圖的整體外觀。
line_size
blur_value
line_size
blur_value
line_size
blur_value
- 使用具有指定和 的函數(shù)從輸入圖像生成邊緣掩碼。
img
edge_mask()
line_size
blur_value
- 生成的邊緣遮罩使用該函數(shù)保存為名為“pencil_sketch.jpg”的新圖像文件。
cv2.imwrite()
- 然后使用該函數(shù)顯示鉛筆素描圖像。
cv2.imshow()
- 程序等待使用該函數(shù)的用戶按鍵。
cv2.waitKey(0)
- 最后,使用該功能關閉所有打開的窗口。
cv2.destroyAllWindows()
4.2 從圖像生成卡通:
total_color = 9
img = color_quantization(img, total_color)
cv2.imwrite('cartoonize.jpg', img)
cv2.imshow('Cartoonize', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
卡通化圖片
4.3 代碼說明:
- 代碼首先將值設置為 9。如果值發(fā)生變化,則生成的卡通圖像將受到影響。較小的 值將導致較少的顏色,而較大的值將導致更多的顏色,這可能會影響卡通圖像的整體外觀。
total_color
total_color
total_color
- 調用該函數(shù)以將輸入圖像中的顏色數(shù)減少到指定的 。
color_quantization()
img
total_color
- 生成的圖像被保存為一個名為“cartoonize.jpg”的新圖像文件使用該功能。
cv2.imwrite()
- 然后使用該功能顯示卡通圖像。
cv2.imshow()
- 程序等待使用該函數(shù)的用戶按鍵。
cv2.waitKey(0)
- 最后,使用該功能關閉所有打開的窗口。
cv2.destroyAllWindows()
五、對圖像應用雙邊濾鏡:
bilateral = cv2.bilateralFilter(img, 15, 75, 75)
# Save the output.
cv2.imwrite('blur.jpg', bilateral)
img = cv2.imread('blur.jpg')
cv2.imshow("Blur", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
雙邊濾波
5.1 代碼說明:
- 代碼首先使用該函數(shù)將雙邊篩選器應用于輸入圖像。篩選器大小設置為 15,西格瑪顏色和西格瑪空間的值均設置為 75。
img
cv2.bilateralFilter()
- 更改雙邊濾鏡的內核大小、西格瑪顏色和西格瑪空間的值將影響應用于圖像的模糊級別。較小的內核大小和 sigma 值將導致較少的模糊,而較大的值將導致更多的模糊。更改這些值可能會更改生成的模糊圖像的整體外觀。
- 生成的模糊圖像被保存為一個名為“blur.jpg”的新圖像文件,使用該功能。
cv2.imwrite()
- 然后使用該函數(shù)將模糊的圖像加載回內存并分配給變量。
cv2.imread()
img
5.2 總輸出:
5.3 另一種方式:
import cv2
import numpy as np# Load the input image
img = cv2.imread('input_image.jpg')# Apply bilateral filter to smooth the image
img_smooth = cv2.bilateralFilter(img, 9, 75, 75)# Convert the image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Apply edge detection to the grayscale image
edges = cv2.Canny(gray, 100, 200)# Apply color quantization to the smoothed image
img_quant = cv2.cvtColor(img_smooth, cv2.COLOR_BGR2RGB)
Z = img_quant.reshape((-1,3))
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img_quant.shape))# Combine the edges and color quantization to create the cartoon effect
cartoon = cv2.bitwise_and(res2, res2, mask=edges)# Display the output image and save it
cv2.imshow('Cartoon', cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()
????????總之,使用 OpenCV 將圖像轉換為卡通是一種有趣且創(chuàng)造性的方式,可以為您的照片賦予新的生命。在本文中,我們討論了如何使用 OpenCV 通過應用各種圖像處理技術(如顏色量化、邊緣檢測和雙邊過濾)將圖像轉換為卡通。通過結合這些技術,我們能夠從普通照片中制作出風格化的卡通圖像。
????????雖然本文中提供的代碼是一個很好的起點,但有很多方法可以自定義轉換過程以獲得不同的結果。嘗試不同的參數(shù)值或應用其他圖像處理技術有助于創(chuàng)建獨特且個性化的卡通風格圖像。有了一點創(chuàng)造力和一些圖像處理技術的知識,可能性是無窮無盡的。