cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果
眾所周知,最近大熱的蔡徐坤蔡老師是一位非常全能的老師,喜歡唱、跳、Rap、籃球,但其實他還會用OpenCV!今天就讓我們跟著蔡老師一起用OpenCV實現(xiàn)素描效果吧!
OpenCV素描效果https://www.zhihu.com/video/11018167058772090881. 安裝Python版OpenCV
首先我們裝上Python版本的OpenCV,在命令行/終端輸入
pip install opencv-python如果是已經(jīng)自帶Python2.7的系統(tǒng)(Mac等)記得加上3:
pip3 install opencv-python2. 讀取圖片并顯示
首先截取視頻中的一幀圖像保存為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. 對灰度圖進行高斯模糊
接下來讓我們對這張灰度圖進行高斯模糊:
import在這里,我們用
cv2.GaussianBlur(img_gray, (5, 5), 0)
完成了圖像的高斯模糊,那么模糊效果是如何實現(xiàn)的呢?其實很簡單,我們從最簡單的模糊效果說起,假設(shè)圖片中有一塊區(qū)域如下:
我們要對中間5這個像素進行模糊,最簡單的方式就是直接和周圍八個像素一起取平均值嘛!中間值=(8*1+5)/9=1.44444……
高斯模糊也是類似,只不過不是簡單的取平均值,而是通過高斯函數(shù)計算對應(yīng)的數(shù)值,有興趣的同學(xué)可以去了解,這里不多講啦。
那么我們在
cv2.GaussianBlur(img_gray, (5, 5), 0)
使用的(5,5)參數(shù)就表示高斯核的尺寸,這個核尺寸越大圖像越模糊。但是記住尺寸得是奇數(shù)!這是為了保證中心位置是一個像素而不是四個像素。
4*43*3這樣我們就得到一個模糊的蔡老師:
5. 圖像二值化
接下來到關(guā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.再次對二值化圖像進行模糊
由于采用了自適應(yīng)二值化的方法,原本深色衣服的地方也自適應(yīng)地變成了白色,實現(xiàn)了一個簡單描邊效果?,F(xiàn)在我們已經(jīng)初步實現(xiàn)了素描效果,但是還不夠,讓我們繼續(xù)完善一下,讓邊線更寬,噪點更少一些。
import和剛才一樣我們用cv2.GaussianBlur()完成了高斯模糊,這樣我們就可以得到一個模糊的描邊蔡老師:
7.再次進行二值化
接下來我們對這張圖片再次進行二值化:
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)
來進行圖像的開運算。
這里需要注意的是我們沒有直接對img_threshold2進行開運算,而是對cv2.bitwise_not(img_threshold2)進行運算,那么cv2.bitwise_not(img_threshold2)又是干啥的呢?
cv2.bitwise_not()其實就是對圖像進行一個簡單的操作,原來是0的像素點變成最大值,原來是最大值的像素點變成0。相當(dāng)于黑色的地方變成白色,白色的地方變成黑色。
那么為什么我們要把圖像反色一下再進行開運算呢?首先要知道圖像中一般0表示黑色,255表示白色,我們看到的大片的白色底少部分黑色線其實從數(shù)值上來看是圖片大部分地方是255少部分地方是0。但是開運算的操作是對有數(shù)值的地方進行縮小,這樣就必須先將圖片反色一下,使得大部分地方是0而少部分線的地方是255,然后再進行開運算就能得到正確的結(jié)果了。
這樣我們就得到一個更少噪點蔡老師啦:
9.第三次對圖像進行高斯模糊
接下來我們對這張二值化的圖像再簡單進行高斯模糊,讓圖片更接近素描的效果。
import這樣下來我們就可以實現(xiàn)對一張彩色圖片轉(zhuǎn)換成素描的效果啦:
10.讀取并處理視頻中的圖像
搞定了單張圖片,對視頻進行處理就非常簡單了,只需要將視頻里每一幀都做同樣的處理再輸出即可。
首先在開頭位置加上讀取視頻的語句:
cap然后創(chuàng)建一個while循環(huá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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译原理什么是移进规约冲突_编译原理复习
- 下一篇: gridcontrol值为0时设置为空_