Python實(shí)現(xiàn)將照片變成卡通圖片的方法【基于opencv】
本文實(shí)例講述了Python實(shí)現(xiàn)將照片變成卡通圖片的方法。分享給大家供大家參考,具體如下:
之前的文章介紹了使用Photoshop將照片變成卡通圖片,今次介紹用代碼來(lái)實(shí)現(xiàn)這項(xiàng)任務(wù),可以就此探查各種濾鏡的內(nèi)部機(jī)制。
制作環(huán)境:Windows10,Python2.7,Anaconda
任務(wù)描述:將D盤(pán)某文件夾中的所有圖片使用代碼進(jìn)行卡通化,然后保存到另一文件夾中。
如前文所述,卡通化的關(guān)鍵是強(qiáng)化邊緣與減少色彩,所以使用Photoshop進(jìn)行卡通化的時(shí)候就使用了照亮邊緣和干筆畫(huà)的濾鏡來(lái)處理。使用代碼處理圖片的時(shí)候也是在對(duì)邊緣和色彩上做文章。以下使用OpenCV庫(kù)來(lái)對(duì)照片處理,大致分為四步來(lái)完成。
1. 應(yīng)用雙邊濾波器來(lái)減少圖像的色彩
2. 將彩色圖像轉(zhuǎn)換為灰度,應(yīng)用中值濾波器減少圖像中的圖像噪點(diǎn)
3. 使用自適應(yīng)閾值處理灰度圖像創(chuàng)建輪廓
4. 將來(lái)自步驟1的彩色圖像與來(lái)自步驟3的輪廓疊加
第1步:減少圖像色彩
因?yàn)殡p邊濾波器平滑平坦區(qū)域同時(shí)能保持邊緣清晰,所以很適合于將RGB圖像轉(zhuǎn)換為卡通。雖然速度好像慢一些一個(gè)技巧是重復(fù)(例如,通過(guò)num_bilateral = 7七次)應(yīng)用小雙邊濾波器,而不是只用一次大雙邊濾波器。
import cv2 num_down = 2 # 縮減像素采樣的數(shù)目 num_bilateral = 7 # 定義雙邊濾波的數(shù)目 img_rgb = cv2.imread("img_example.jpg") # 用高斯金字塔降低取樣 img_color = img_rgb for _ in xrange(num_down): img_color = cv2.pyrDown(img_color) # 重復(fù)使用小的雙邊濾波代替一個(gè)大的濾波 for _ in xrange(num_bilateral): img_color = cv2.bilateralFilter(img_color, d=9, sigmaColor=9, sigmaSpace=7) # 升采樣圖片到原始大小 for _ in xrange(num_down): img_color = cv2.pyrUp(img_color)
cv2.bilateralFilter
中的三個(gè)參數(shù)控制像素鄰域的直徑(d)和顏色空間中的濾波器的標(biāo)準(zhǔn)偏差(sigmaColor)以及坐標(biāo)空間(sigmaSpace)。
第2步:轉(zhuǎn)換為灰度,并使用中值濾波器減少噪點(diǎn)
OpenCV在邊緣檢測(cè)方面提供了多種選擇,自適應(yīng)閾值處理的優(yōu)點(diǎn)是可以檢測(cè)圖像的每個(gè)小領(lǐng)域中最突出的特征,獨(dú)立于圖像的整體屬性。
應(yīng)用中值濾波器減少圖像的色彩。將原始的彩色圖片轉(zhuǎn)換為灰度圖片,接著應(yīng)用中值模糊來(lái)減少灰度圖像中的噪聲。
# 轉(zhuǎn)換為灰度并使其產(chǎn)生中等的模糊 img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY) img_blur = cv2.medianBlur(img_gray, 7)
第3步:創(chuàng)建輪廓
在降噪之后,就可以安全地應(yīng)用自適應(yīng)閾值來(lái)創(chuàng)建輪廓。 即使存在一些圖像噪聲,blockSize = 9的cv2.ADAPTIVE_THRESH_MEAN_C
算法也會(huì)確保將閾值應(yīng)用于9x9鄰域的平均值減去C = 2。
# 檢測(cè)到邊緣并且增強(qiáng)其效果 img_edge = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize=9, C=2)
第4步:合并輪廓與彩色圖片
最后一步是將經(jīng)處理的彩色圖像(img_color)與邊緣掩碼(img_edge)組合。至此,一個(gè)可以卡通化圖片的原始代碼就寫(xiě)好了。圖片效果有點(diǎn)理工的審美,不夠文藝,效果上輸給了Photoshop,但是在效率上扳回一城。
# 轉(zhuǎn)換回彩色圖像 img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) img_cartoon = cv2.bitwise_and(img_color, img_edge) # 顯示圖片 cv2.imshow("cartoon", img_cartoon)
最后將上述代碼封裝成函數(shù)。導(dǎo)入python的os模塊來(lái)方便文件處理。
# -*- coding: utf-8 -*- import cv2 import os def cartoonise(picture_name): imgInput_FileName = picture_name imgOutput_FileName = "D:\pythonpractice\CartoonImage\cartoon" + picture_name num_down = 2 #縮減像素采樣的數(shù)目 num_bilateral = 7 #定義雙邊濾波的數(shù)目 img_rgb = cv2.imread(imgInput_FileName) #讀取圖片 #用高斯金字塔降低取樣 img_color = img_rgb for _ in xrange(num_down): img_color = cv2.pyrDown(img_color) #重復(fù)使用小的雙邊濾波代替一個(gè)大的濾波 for _ in xrange(num_bilateral): img_color = cv2.bilateralFilter(img_color,d=9,sigmaColor=9,sigmaSpace=7) #升采樣圖片到原始大小 for _ in xrange(num_down): img_color = cv2.pyrUp(img_color) #轉(zhuǎn)換為灰度并且使其產(chǎn)生中等的模糊 img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY) img_blur = cv2.medianBlur(img_gray, 7) #檢測(cè)到邊緣并且增強(qiáng)其效果 img_edge = cv2.adaptiveThreshold(img_blur,255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize=9, C=2) #轉(zhuǎn)換回彩色圖像 img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB) img_cartoon = cv2.bitwise_and(img_color, img_edge) # 保存轉(zhuǎn)換后的圖片 cv2.imwrite(imgOutput_FileName, img_cartoon) ImageList = [] #建立空的List #循環(huán)讀取"D:\pythonpractice\Image"中的文件名 for filename in os.listdir(r"D:\pythonpractice\Image"): ImageList.append(filename) #將文件名添加到ImageList for i in ImageList: #循環(huán)讀取ImageList中的文件名,將其進(jìn)行卡通化處理 print("正在卡通化" + i) cartoonise(i)
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python圖片操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python+Opencv識(shí)別兩張相似圖片
- Python OpenCV之圖片縮放的實(shí)現(xiàn)(cv2.resize)
- python通過(guò)opencv實(shí)現(xiàn)批量剪切圖片
- opencv實(shí)現(xiàn)圖片模糊和銳化操作
- 使用Python-OpenCV向圖片添加噪聲的實(shí)現(xiàn)(高斯噪聲、椒鹽噪聲)
- python3讀取圖片并灰度化圖片的四種方法(OpenCV、PIL.Image、TensorFlow方法)總結(jié)
- python+opencv識(shí)別圖片中的圓形
- Python OpenCV實(shí)現(xiàn)圖片上輸出中文
- Python+OpenCV圖片局部區(qū)域像素值處理詳解
- 利用Opencv實(shí)現(xiàn)圖片的油畫(huà)特效實(shí)例
相關(guān)文章
python3爬蟲(chóng)獲取html內(nèi)容及各屬性值的方法
今天小編就為大家分享一篇python3爬蟲(chóng)獲取html內(nèi)容及各屬性值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python調(diào)整數(shù)組形狀如何實(shí)現(xiàn)
這篇文章主要介紹了Python調(diào)整數(shù)組形狀如何實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12Python調(diào)用騰訊API實(shí)現(xiàn)人臉身份證比對(duì)功能
這篇文章主要介紹了Python調(diào)用騰訊API進(jìn)行人臉身份證比對(duì),簡(jiǎn)單介紹了調(diào)用騰訊云API步驟,通過(guò)完整代碼展示與結(jié)果,需要的朋友可以參考下2022-04-04Python ''takes exactly 1 argument (2 given)'' Python error
這篇文章主要介紹了Python 'takes exactly 1 argument (2 given)' Python error的相關(guān)資料,需要的朋友可以參考下2016-12-12Django Form and ModelForm的區(qū)別與使用
這篇文章主要介紹了Django Form and ModelForm的區(qū)別與使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12