日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果

發(fā)布時間:2024/4/19 python 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

眾所周知,最近大熱的蔡徐坤蔡老師是一位非常全能的老師,喜歡唱、跳、Rap、籃球,但其實他還會用OpenCV!今天就讓我們跟著蔡老師一起用OpenCV實現(xiàn)素描效果吧!

OpenCV素描效果https://www.zhihu.com/video/1101816705877209088

1. 安裝Python版OpenCV

首先我們裝上Python版本的OpenCV,在命令行/終端輸入

pip install opencv-python

如果是已經(jīng)自帶Python2.7的系統(tǒng)(Mac等)記得加上3:

pip3 install opencv-python

2. 讀取圖片并顯示

首先截取視頻中的一幀圖像保存為cxk.jpg,放在代碼同一目錄下面。

接下來就讓我們新建一個Python文件開始寫吧!

首先導(dǎo)入OpenCV模塊:

import

接下來讀取并顯示cxk.jpg圖片

import

當(dāng)你運行這段代碼后就會彈出一個窗口顯示這張圖片啦,如下:

稍微解釋一下上面的代碼,我們利用cv2.imread('cxk.jpg')讀取了這張圖片,保存到img_origin這個變量里面。

接下來用cv2.imshow('origin', img_origin)將這張照片通過一個窗口顯示出來,并且這個窗口的名稱叫做origin。

然后我們用cv2.waitKey(0)來等待用戶的按鍵操作,waitKey(n)里的n表示等待多少毫秒的時間,超過這個時間程序就會繼續(xù)運行下去。我們把它設(shè)為0表示無限等待下去,也就是只要用戶沒有在這個窗口內(nèi)按下任何按鍵,程序就會一直停在這里。

最后,當(dāng)用戶按下任意按鍵,程序執(zhí)行cv2.destroyAllWindows(),把窗口都關(guān)掉,程序結(jié)束。

OK!我們繼續(xù)!

3. 彩色圖片轉(zhuǎn)成灰度圖

接下來我們要把彩色圖片轉(zhuǎn)換成灰度圖:

import

沒錯,將彩色RGB圖片轉(zhuǎn)換成灰度圖用

cv2.cvtColor(img_origin, cv2.COLOR_RGB2GRAY)

就可以啦。但是要注意這里我們用的是cv2.COLOR_RGB2GRAY,對于一些老版本的OpenCV或者其他模塊可能還是采用BGR的通道順序,也就是cv2.COLOR_BGR2GRAY,這里如果出問題了記得看看是不是彩色通道順序問題。

上面這段代碼執(zhí)行后我們就多了一個窗口,里面顯示的是灰色的蔡老師:

4. 對灰度圖進(jìn)行高斯模糊

接下來讓我們對這張灰度圖進(jìn)行高斯模糊:

import

在這里,我們用

cv2.GaussianBlur(img_gray, (5, 5), 0)

完成了圖像的高斯模糊,那么模糊效果是如何實現(xiàn)的呢?其實很簡單,我們從最簡單的模糊效果說起,假設(shè)圖片中有一塊區(qū)域如下:

我們要對中間5這個像素進(jìn)行模糊,最簡單的方式就是直接和周圍八個像素一起取平均值嘛!中間值=(8*1+5)/9=1.44444……

高斯模糊也是類似,只不過不是簡單的取平均值,而是通過高斯函數(shù)計算對應(yīng)的數(shù)值,有興趣的同學(xué)可以去了解,這里不多講啦。

那么我們在

cv2.GaussianBlur(img_gray, (5, 5), 0)

使用的(5,5)參數(shù)就表示高斯核的尺寸,這個核尺寸越大圖像越模糊。但是記住尺寸得是奇數(shù)!這是為了保證中心位置是一個像素而不是四個像素。

4*4

3*3

這樣我們就得到一個模糊的蔡老師:

5. 圖像二值化

接下來到關(guān)鍵的一步啦!讓我們對這張模糊過的圖片進(jìn)行二值化:

import

二值化的概念其實很簡單,就是對一張圖片上的點,像素值大于等于某個值的都直接設(shè)為最大值,小于這個值的都直接設(shè)為最小值,這樣這張圖片上每個點都只可能是最大值或最小值其中之一了,其中我們比較的這個數(shù)值就是閾值。

當(dāng)然如果對整張圖片都規(guī)定同一個閾值,可能會出現(xiàn)下圖右上的效果,因為實際圖片還有陰影之類的問題會影響,這樣就出現(xiàn)了自適應(yīng)二值化的方法,如下圖下排兩張圖。

在代碼中我們用cv2.adaptiveThreshold()來實現(xiàn)這種自適應(yīng)二值化方法。其中參數(shù)255表示我們二值化后圖像的最大值,cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示我們采用的自適應(yīng)方法,cv2.THRESH_BINARY表示我們是將大于閾值的像素點的值變成最大值,反之這里如果使用cv2.THRESH_BINARY_INV表示我們是將大于閾值的像素點的值變成0,倒數(shù)第二個參數(shù)5表示我們用多大尺寸的區(qū)塊來計算閾值,倒數(shù)第一個參數(shù)2表示計算周邊像素點均值時待減去的常數(shù)C。

運行后就可以得到一個二值化的蔡老師:

6.再次對二值化圖像進(jìn)行模糊

由于采用了自適應(yīng)二值化的方法,原本深色衣服的地方也自適應(yīng)地變成了白色,實現(xiàn)了一個簡單描邊效果。現(xiàn)在我們已經(jīng)初步實現(xiàn)了素描效果,但是還不夠,讓我們繼續(xù)完善一下,讓邊線更寬,噪點更少一些。

import

和剛才一樣我們用cv2.GaussianBlur()完成了高斯模糊,這樣我們就可以得到一個模糊的描邊蔡老師:

7.再次進(jìn)行二值化

接下來我們對這張圖片再次進(jìn)行二值化:

import

和剛才不一樣的是,由于這張圖片已經(jīng)比較干凈沒有什么陰影,我們直接采用最簡單的二值化方法

cv2.threshold(img_threshold1_blurred, 200, 255, cv2.THRESH_BINARY)。其中200表示將圖片中像素值為200以上的點都變成255,255就是白色。這樣我們就能得到一個邊線更寬的二值化效果:

8.圖像開運算

下面讓我們?nèi)サ魣D片中一些細(xì)小的噪點,這種效果可以通過圖像的開運算來實現(xiàn):

import

要理解圖像的開運算就要知道圖像的腐蝕和膨脹,所謂的圖像腐蝕就是如下的操作,類似于把一個胖子縮小一圈變瘦的感覺:

圖片來源:https://homepages.inf.ed.ac.uk/rbf/HIPR2/erode.htm

圖像膨脹就是腐蝕的反向操作,把圖像中的區(qū)塊變大一圈,把瘦子變成胖子。

因此當(dāng)我們對一個圖像先腐蝕再膨脹的時候,一些小的區(qū)塊就會由于腐蝕而消失,再膨脹回來的時候大塊區(qū)域的邊線的寬度沒有發(fā)生變化,這樣就起到了消除小的噪點的效果。圖像先腐蝕再膨脹的操作就叫做開運算。

回到我們的代碼,首先開運算要有一個運算的核,我們通過:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))

可以得到一個3*3的核。

然后通過

cv2.morphologyEx(cv2.bitwise_not(img_threshold2), cv2.MORPH_OPEN, kernel)

來進(jìn)行圖像的開運算。

這里需要注意的是我們沒有直接對img_threshold2進(jìn)行開運算,而是對cv2.bitwise_not(img_threshold2)進(jìn)行運算,那么cv2.bitwise_not(img_threshold2)又是干啥的呢?

cv2.bitwise_not()其實就是對圖像進(jìn)行一個簡單的操作,原來是0的像素點變成最大值,原來是最大值的像素點變成0。相當(dāng)于黑色的地方變成白色,白色的地方變成黑色。

那么為什么我們要把圖像反色一下再進(jìn)行開運算呢?首先要知道圖像中一般0表示黑色,255表示白色,我們看到的大片的白色底少部分黑色線其實從數(shù)值上來看是圖片大部分地方是255少部分地方是0。但是開運算的操作是對有數(shù)值的地方進(jìn)行縮小,這樣就必須先將圖片反色一下,使得大部分地方是0而少部分線的地方是255,然后再進(jìn)行開運算就能得到正確的結(jié)果了。

這樣我們就得到一個更少噪點蔡老師啦:

9.第三次對圖像進(jìn)行高斯模糊

接下來我們對這張二值化的圖像再簡單進(jìn)行高斯模糊,讓圖片更接近素描的效果。

import

這樣下來我們就可以實現(xiàn)對一張彩色圖片轉(zhuǎn)換成素描的效果啦:

10.讀取并處理視頻中的圖像

搞定了單張圖片,對視頻進(jìn)行處理就非常簡單了,只需要將視頻里每一幀都做同樣的處理再輸出即可。

首先在開頭位置加上讀取視頻的語句:

cap

然后創(chuàng)建一個while循環(huán),將圖像處理的語句都放進(jìn)去:

while

其中,cap.read()用來讀取視頻每一幀的數(shù)據(jù),每一次調(diào)用就讀取一幀圖像,當(dāng)讀取到的frame是None時就說明視頻結(jié)束,可以直接退出while循環(huán)。

在while循環(huán)的最后我們用cv2.waitKey(40) & 0xFF == ord('q')來判斷用戶有沒有按下鍵盤上的q鍵,如果按下了就直接退出while循環(huán)。

而cv2.waitKey(40)中我們填40表示等待40毫秒,也就相當(dāng)于每兩張圖片之間間隔40毫秒,即25幀/秒。

最后,完整的代碼如下:

import

那么,今天的蔡老師小課堂就到這里了,各位小朋友你們學(xué)會了嗎?


我是畢老師,依然不會定時給你們分享一些有趣好玩實用的東西,歡迎關(guān)注~

警察蜀黍!就是這個人!腦子簡直有泡!還不趕緊關(guān)注一下!

總結(jié)

以上是生活随笔為你收集整理的cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。