激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - OpenCV圖片漫畫效果的實現示例

OpenCV圖片漫畫效果的實現示例

2020-08-18 10:45Steven·簡談 Python

這篇文章主要介紹了OpenCV圖片漫畫效果的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

我們隨手拍攝的照片,很難達到攝影師的水準,因此不管是手機上還是電腦內,都有一些軟件可以添加特效讓照片更好看,手機拍攝時也有即時的美化效果。不過我比較好奇漫畫特效,但是一直在網上看到別人的成品而找不到針對性的軟件,因此只有自己實現一下,雖然跟專業的還有差距,但效果還不錯。

本次使用 OpenCV,采用 Python 實現。

對比現實中的畫畫,一般是先畫出邊緣輪廓使整體規劃好,再填充顏色使其完整,因此在這里我們也采用這種方式。不過對圖片直接操作與從零開始著筆不一樣,要將原始圖片進行兩次不同的處理,再將處理后的兩個圖片疊加。

邊緣輪廓

漫畫中不管是人物還是風景,刻畫的細節有限,因此需要把重要以及有特色的部分體現出來,數量要適當。

輪廓通過四步操作:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 通道,用于后續合并
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2BGR)

這里通過二值化的方式將輪廓提取出來,采用自適應閾值二值化函數,基于像素周圍的小區域確定像素的閾值,可以將有區別的部分的界限提取出來,恰如漫畫對象中黑色粗體輪廓,且細節得當。因閾值處理只能針對灰度圖像,因此需要先將彩色圖像轉換為單通道的灰度圖像,且為了去除描繪對象內部的冗余細節,還要對圖像進行平滑處理,使顏色過度得緩慢一些,畢竟漫畫中顏色的應用沒有現實生活中那么復雜,這樣得出的輪廓就比較好。

看一下效果:

OpenCV圖片漫畫效果的實現示例

對比原圖:

OpenCV圖片漫畫效果的實現示例

將兩個重要的方法介紹一下:

中值濾波:cv2.medianBlur(img, ksize)
主要是后面的參數,代表內核區域的邊長,必須是大于1的奇數,如3、5、7……方法提取內核區域下所有像素的中值,并將中心元素替換為該中值

自適應閾值二值化:cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)

  • src: 輸入圖,只能輸入單通道圖像,通常來說為灰度圖
  • dst: 輸出圖
  • maxval: 當像素值超過了閾值(或者小于閾值,根據type來決定),所賦予的值
  • thresh_type: 閾值的計算方法,包含以下2種類型:cv2.ADAPTIVE_THRESH_MEAN_C; cv2.ADAPTIVE_THRESH_GAUSSIAN_C.
  • type:二值化操作的類型,與固定閾值函數相同,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV.
  • Block Size: 圖片中分塊的大小
  • C :閾值計算方法中的常數項

顏色填充

邊緣輪廓已經描繪好了,再添加顏料后就完整了。這里就比較簡單了,只需要將原圖片的顏色細致度降低些就行了。

代碼如下:

?
1
2
3
4
5
6
7
8
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)

顏色要比較平滑,不能像現實生活中這么細致,先采用圖像金字塔將分辨率降低,并采用雙邊濾波去除噪聲,可以平滑平面區域,同時保持邊緣清晰。分辨率降低后圖像會變小,因此最后要將圖像放大為原來的大小,雖然圖像金字塔有專門的方法可以將圖像放大,但是尺寸可能會有一兩點變化,合并過程中要兩個圖像完全一樣大,所以這里直接按尺寸放大。

看一下效果:

OpenCV圖片漫畫效果的實現示例

將兩個重要的方法介紹一下:

分辨率降低:cv2.pyrDown(src, dst=None, dstsize=None, borderType=None)
一般只需要輸入圖像就行了,它會直接將圖像長寬減半

雙邊濾波:cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])

  • src:輸入圖像
  • d:過濾時周圍每個像素領域的直徑
  • sigmaColor:在color space中過濾sigma。參數越大,臨近像素將會在越遠的地方mix。
  • sigmaSpace:在coordinate space中過濾sigma。參數越大,那些顏色足夠相近的的顏色的影響越大。

合并

?
1
2
3
4
img_cartoon = cv2.bitwise_and(img_copy, img_edge)
cv2.imshow("cartoon", img_cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.bitwise_and() 是對二進制數據進行“與”操作,即對圖像(灰度圖像或彩色圖像均可)每個像素值進行二進制“與”操作:1&1=1,1&0=0,0&1=0,0&0=0

最后結果:

OpenCV圖片漫畫效果的實現示例

到此這篇關于OpenCV圖片漫畫效果的實現示例的文章就介紹到這了,更多相關OpenCV 圖片漫畫內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_44613063/article/details/107901148

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 香蕉在线播放 | 网站毛片 | 国产精品av久久久久久久久久 | 国内精品伊人久久 | 久久久资源网 | 免费看搡女人无遮挡的视频 | 精品久久久久久亚洲精品 | 黄色av免费电影 | 一级做受毛片免费大片 | 免费毛片在线 | 欧美精品一区二区三区在线 | 成人毛片网站 | 免费a级片视频 | 国产精品观看在线亚洲人成网 | 日韩欧美电影在线观看 | 国产91丝袜在线播放 | 色综合久久久久久久久久久 | 特级黄色一级毛片 | 国产91影院 | 成人免费福利网站 | 欧美精品免费一区二区三区 | 精品国产一区在线 | 福利在线小视频 | 国产呦在线观看视频 | 精品一区二区久久久久久按摩 | 精品国产一区二区久久 | 日本免费大片免费视频 | 成人免费福利视频 | 激情小说激情电影 | 一级毛片在线看 | 国产一区二区视频网站 | 久草在线视频免费播放 | 国产色片在线观看 | 激情久久精品 | 国产美女爽到喷白浆的 | 99麻豆久久久国产精品免费 | 成人做爰s片免费看网站 | 一级毛片免费观看在线 | 337p粉嫩大胆噜噜噜亚瑟影院 | 巨根插入 | 最近中文字幕一区二区 |