OpenCV圖片漫畫效果的實(shí)現(xiàn)示例
我們隨手拍攝的照片,很難達(dá)到攝影師的水準(zhǔn),因此不管是手機(jī)上還是電腦內(nèi),都有一些軟件可以添加特效讓照片更好看,手機(jī)拍攝時(shí)也有即時(shí)的美化效果。不過我比較好奇漫畫特效,但是一直在網(wǎng)上看到別人的成品而找不到針對性的軟件,因此只有自己實(shí)現(xiàn)一下,雖然跟專業(yè)的還有差距,但效果還不錯(cuò)。
本次使用 OpenCV,采用 Python 實(shí)現(xiàn)。
對比現(xiàn)實(shí)中的畫畫,一般是先畫出邊緣輪廓使整體規(guī)劃好,再填充顏色使其完整,因此在這里我們也采用這種方式。不過對圖片直接操作與從零開始著筆不一樣,要將原始圖片進(jìn)行兩次不同的處理,再將處理后的兩個(gè)圖片疊加。
邊緣輪廓
漫畫中不管是人物還是風(fēng)景,刻畫的細(xì)節(jié)有限,因此需要把重要以及有特色的部分體現(xiàn)出來,數(shù)量要適當(dāng)。
輪廓通過四步操作:
import cv2
img = cv2.imread("example.jpg")
img_copy = img
# 灰度處理
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 平滑操作,去除噪聲
img_blur = cv2.medianBlur(img_gray, 5)
# 通過閾值提取輪廓
img_edge = cv2.adaptiveThreshold(img_blur,
255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,
blockSize=9,
C=3)
# 將灰度圖片變成 3 通道,用于后續(xù)合并
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2BGR)
這里通過二值化的方式將輪廓提取出來,采用自適應(yīng)閾值二值化函數(shù),基于像素周圍的小區(qū)域確定像素的閾值,可以將有區(qū)別的部分的界限提取出來,恰如漫畫對象中黑色粗體輪廓,且細(xì)節(jié)得當(dāng)。因閾值處理只能針對灰度圖像,因此需要先將彩色圖像轉(zhuǎn)換為單通道的灰度圖像,且為了去除描繪對象內(nèi)部的冗余細(xì)節(jié),還要對圖像進(jìn)行平滑處理,使顏色過度得緩慢一些,畢竟漫畫中顏色的應(yīng)用沒有現(xiàn)實(shí)生活中那么復(fù)雜,這樣得出的輪廓就比較好。
看一下效果:

對比原圖:

將兩個(gè)重要的方法介紹一下:
中值濾波:cv2.medianBlur(img, ksize)
主要是后面的參數(shù),代表內(nèi)核區(qū)域的邊長,必須是大于1的奇數(shù),如3、5、7……方法提取內(nèi)核區(qū)域下所有像素的中值,并將中心元素替換為該中值
自適應(yīng)閾值二值化:cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)
- src: 輸入圖,只能輸入單通道圖像,通常來說為灰度圖
- dst: 輸出圖
- maxval: 當(dāng)像素值超過了閾值(或者小于閾值,根據(jù)type來決定),所賦予的值
- thresh_type: 閾值的計(jì)算方法,包含以下2種類型:cv2.ADAPTIVE_THRESH_MEAN_C; cv2.ADAPTIVE_THRESH_GAUSSIAN_C.
- type:二值化操作的類型,與固定閾值函數(shù)相同,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV.
- Block Size: 圖片中分塊的大小
- C :閾值計(jì)算方法中的常數(shù)項(xiàng)
顏色填充
邊緣輪廓已經(jīng)描繪好了,再添加顏料后就完整了。這里就比較簡單了,只需要將原圖片的顏色細(xì)致度降低些就行了。
代碼如下:
for _ in range(2)
# 降低分辨率
img_copy = cv2.pyrDown(img_copy)
for _ in range(5):
# 圖像平滑,保留邊緣
img_copy = cv2.bilateralFilter(img_copy, d=9, sigmaColor=9, sigmaSpace=7)
img_copy = cv2.resize(img_copy, (img.shape[1], img.shape[0]),
interpolation=cv2.INTER_CUBIC)
顏色要比較平滑,不能像現(xiàn)實(shí)生活中這么細(xì)致,先采用圖像金字塔將分辨率降低,并采用雙邊濾波去除噪聲,可以平滑平面區(qū)域,同時(shí)保持邊緣清晰。分辨率降低后圖像會變小,因此最后要將圖像放大為原來的大小,雖然圖像金字塔有專門的方法可以將圖像放大,但是尺寸可能會有一兩點(diǎn)變化,合并過程中要兩個(gè)圖像完全一樣大,所以這里直接按尺寸放大。
看一下效果:

將兩個(gè)重要的方法介紹一下:
分辨率降低:cv2.pyrDown(src, dst=None, dstsize=None, borderType=None)
一般只需要輸入圖像就行了,它會直接將圖像長寬減半
雙邊濾波:cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
- src:輸入圖像
- d:過濾時(shí)周圍每個(gè)像素領(lǐng)域的直徑
- sigmaColor:在color space中過濾sigma。參數(shù)越大,臨近像素將會在越遠(yuǎn)的地方mix。
- sigmaSpace:在coordinate space中過濾sigma。參數(shù)越大,那些顏色足夠相近的的顏色的影響越大。
合并
img_cartoon = cv2.bitwise_and(img_copy, img_edge)
cv2.imshow("cartoon", img_cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.bitwise_and() 是對二進(jìn)制數(shù)據(jù)進(jìn)行“與”操作,即對圖像(灰度圖像或彩色圖像均可)每個(gè)像素值進(jìn)行二進(jìn)制“與”操作:1&1=1,1&0=0,0&1=0,0&0=0
最后結(jié)果:

到此這篇關(guān)于OpenCV圖片漫畫效果的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)OpenCV 圖片漫畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用Selenium和cookie繞過驗(yàn)證碼實(shí)現(xiàn)登錄示例代碼
文章介紹了如何使用Selenium獲取登錄過程中的cookie信息,并通過抓包工具獲取cookie,通過示例展示了如何在Dsmall和CRM系統(tǒng)中實(shí)現(xiàn)免登陸操作,總結(jié)了兩種方法:一種是在獲取到cookie后直接添加到當(dāng)前會話中,另一種是將cookie存儲到本地文件并在后續(xù)請求中使用2025-01-01
Python如何一行輸入多個(gè)數(shù),并存入列表
這篇文章主要介紹了Python如何一行輸入多個(gè)數(shù),并存入列表,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
利用pandas進(jìn)行大文件計(jì)數(shù)處理的方法
今天小編就為大家分享一篇利用pandas進(jìn)行大文件計(jì)數(shù)處理的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
在python中使用SQLAlchemy查詢PostgreSQL視圖的流程步驟
作為軟件開發(fā)人員,查詢 PostgreSQL 視圖是一項(xiàng)常見任務(wù),使用視圖(代表SQL 查詢輸出的虛擬表)被認(rèn)為是處理關(guān)系數(shù)據(jù)庫時(shí)的有效方法,本文介紹如何在 Python 中使用 SQLAlchemy 查詢 PostgreSQL 視圖,需要的朋友可以參考下2023-09-09
Pycharm中安裝Pygal并使用Pygal模擬擲骰子(推薦)
這篇文章主要介紹了Pycharm中安裝Pygal并使用Pygal模擬擲骰子,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Python辦公自動(dòng)化之發(fā)送電子郵件和Outlook集成
Python辦公?動(dòng)化是利?Python編程語?來創(chuàng)建腳本和程序,以簡化、加速和?動(dòng)化?常辦公任務(wù)和?作流程的過程,本文主要介紹一下如何利用Python實(shí)現(xiàn)發(fā)送電子郵件和Outlook集成,需要的可以參考下2023-12-12
總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則
這篇文章主要介紹了總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則,本文講解了每個(gè)函數(shù)只做一件事、保持簡單、保持簡短、輸入使用參數(shù)、輸出使用return語句等內(nèi)容,需要的朋友可以參考下2015-06-06
使用Pandas和Matplotlib進(jìn)行數(shù)據(jù)清洗與可視化的實(shí)現(xiàn)步驟
在數(shù)據(jù)科學(xué)領(lǐng)域,數(shù)據(jù)清洗和可視化是構(gòu)建數(shù)據(jù)驅(qū)動(dòng)解決方案的重要步驟,本文將詳細(xì)介紹如何使用Pandas進(jìn)行數(shù)據(jù)清洗,并結(jié)合Matplotlib進(jìn)行可視化,文章通過實(shí)際代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-08-08
python腳本監(jiān)控Tomcat服務(wù)器的方法
這篇文章主要介紹了利用python腳本監(jiān)控Tomcat服務(wù)器的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07

