Python OpenCV學(xué)習(xí)之圖像形態(tài)學(xué)
背景
形態(tài)學(xué)處理方法是基于對(duì)二進(jìn)制圖像進(jìn)行處理的,卷積核決定圖像處理后的效果;形態(tài)學(xué)的處理哦本質(zhì)上相當(dāng)于對(duì)圖像做前處理,提取出有用的特征,以便后續(xù)的目標(biāo)識(shí)別等任務(wù);
一、圖像二值化
定義:將圖像的每個(gè)像素變成兩種值,如0和255;
全局二值化的函數(shù)原型:
threshold(img,thresh,maxVal,type)
img
:最好是灰度圖像thresh
:閾值maxVal
:超過閾值,替換為maxValtype
:有幾種類型,THRESH_BINARY為二值化的類型
案例代碼:
img = cv2.imread('1.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, dst = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY) cv2.imshow('org', img) cv2.imshow('dst', dst) cv2.waitKey(0)
關(guān)于type類型,可查看下圖:
二、自適應(yīng)閾值
解決的問題:由于光照不均勻以及陰影的存在,只有一個(gè)閾值會(huì)使得在陰影處的白色被二值化成黑色;
若采用全局二值化,在有陰影的圖片中,陰影信息會(huì)丟失,如下圖:
當(dāng)閾值設(shè)置較高時(shí),會(huì)出現(xiàn)部分陰影信息丟失,如果需要不斷嘗試找到合適閾值是一件耗時(shí)的事情,因此就有了自適應(yīng)閾值的方法;
自適應(yīng)閾值函數(shù)原型:
adaptiveThreshold(img,maxVal,adaptiveMethod,,type,blockSize, C)
adaptiveMethod
:計(jì)算閾值的方法;blockSize
:鄰近區(qū)域的大??;C
:常量,應(yīng)從計(jì)算出的平均值或加權(quán)平均值中減去,一般設(shè)置為0;
計(jì)算閾值主要有兩種兩種方法:
① ADAPTIVE_THRESH_MEAN_C:計(jì)算鄰近區(qū)域的平均值;(根據(jù)blockSize大小做平均濾波)
② ADAPTIVE_THRESH_GAUSSIAN_C:高斯窗口加權(quán)平均值;(根據(jù)blockSize大小做高斯濾波)
代碼案例:
img = cv2.imread('new.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) dst = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0) cv2.imshow('org', img) cv2.imshow('dst', dst) cv2.waitKey(0)
可以看出,雖然信息成功提取出來,但背景的噪點(diǎn)過多,后續(xù)會(huì)加以處理;
三、腐蝕
本質(zhì)卷積核的值全為1,可通過下圖簡(jiǎn)單理解其原理:
函數(shù)原型:
erode(img,kernel,iterations=1)
iterations
:執(zhí)行的次數(shù);
代碼案例:
img = cv2.imread('./j.png') kernel = np.ones((3, 3), np.uint8) dst = cv2.erode(img, kernel, 1) cv2.imshow('org', img) cv2.imshow('dst', dst) cv2.waitKey(0)
上圖為腐蝕后的結(jié)果,明顯白色區(qū)域變小了,如果增大卷積核或增加腐蝕次數(shù)會(huì)使得腐蝕效果更明顯;
四、卷積核獲取
函數(shù)原型:
getStructuringElement(type,size)
size
一般設(shè)置成(3,3)或(5,5)這樣;
type
類型:
MORPH_RECT:矩形形狀的卷積核;
MORPH_ELLIPSE:橢圓形狀卷積核;
MORPH_CROSS:十字架形狀卷積核;
腐蝕中的全為1的卷積核可以通過這個(gè)函數(shù)構(gòu)造:
kernrl = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
相比于用numpy構(gòu)造更好;
五、膨脹
膨脹和腐蝕相反,其原理是卷積核中間不為0,則整個(gè)卷積核區(qū)域的值都為1,如下圖:
函數(shù)原型:
dilate(img,kernel,iterations=1)
代碼案例:
img = cv2.imread('./j.png') kernel = np.ones((7, 7), np.uint8) dst = cv2.dilate(img, kernel, 1) cv2.imshow('org', img) cv2.imshow('dst', dst) cv2.waitKey(0)
本次采用7x7的卷積核,所以效果會(huì)比較明顯一些;
六、開運(yùn)算
本質(zhì):先腐蝕,后膨脹;
函數(shù)原型:
morphologyEx(img,cv2.MORPH_OPEN,kernel)
代碼案例:
img = cv2.imread('./dotj.png') kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7)) dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) cv2.imshow('org', img) cv2.imshow('dst', dst) cv2.waitKey(0)
從圖中可看出,開運(yùn)算很好的解決了小的噪點(diǎn),也就是背景噪點(diǎn)去除;
七、閉運(yùn)算
本質(zhì):先膨脹,后腐蝕;
函數(shù)原型等同于開運(yùn)算,其中的類型進(jìn)行修改即可;
代碼案例:
img = cv2.imread('./dotinj.png') kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7)) dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) cv2.imshow('org', img) cv2.imshow('dst', dst) cv2.waitKey(0)
中間還是有一些噪點(diǎn)沒有完全消除,可以調(diào)整卷積核大小,將卷積核調(diào)大,可以得到更好的效果;
八、形態(tài)學(xué)梯度
本質(zhì):梯度 = 原圖 - 腐蝕
函數(shù)還是morphologyEx,其中類型為MORPH_GRADIENT;
代碼案例:
img = cv2.imread('./j.png') kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) cv2.imshow('org', img) cv2.imshow('dst', dst) cv2.waitKey(0)
可以看出來腐蝕的部分,也相當(dāng)于提取了邊緣;
九、頂帽運(yùn)算
本質(zhì):頂帽 = 原圖 - 開運(yùn)算
函數(shù)還是morphologyEx,其中類型為MORPH_TOPHAT;
代碼案例:
img = cv2.imread('./tophat.png') kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19, 19)) dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) cv2.imshow('org', img) cv2.imshow('dst', dst) cv2.waitKey(0)
十、黑帽運(yùn)算
本質(zhì):黑帽 = 原圖 - 閉運(yùn)算
函數(shù)還是morphologyEx,其中類型為MORPH_BLACKHAT;
代碼案例:
img = cv2.imread('./dotinj.png') kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7)) dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) cv2.imshow('org', img) cv2.imshow('dst', dst) cv2.waitKey(0)
總結(jié)
開運(yùn)算:先腐蝕再膨脹,去除大圖形外的小圖形;
閉運(yùn)算:先膨脹再腐蝕,去除大圖形內(nèi)的小圖形;
梯度:求圖形的邊緣;
頂帽:原圖減開運(yùn)算,得到大圖形外的小圖形;
黑帽:原圖減閉運(yùn)算,得到大圖形內(nèi)的小圖形;
以上就是Python OpenCV學(xué)習(xí)之圖像形態(tài)學(xué)的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV圖像形態(tài)學(xué)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python自定義聚合函數(shù)merge與transform區(qū)別詳解
這篇文章主要介紹了Python自定義聚合函數(shù)merge與transform區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Python實(shí)現(xiàn)滑塊驗(yàn)證碼詳解
驗(yàn)證碼作為一種自然人的機(jī)器人的判別工具,被廣泛的用于各種防止程序做自動(dòng)化的場(chǎng)景中。傳統(tǒng)的字符型驗(yàn)證安全性已經(jīng)名存實(shí)亡的情況下,各種新型的驗(yàn)證碼如雨后春筍般涌現(xiàn),今天給大家分享一篇Python實(shí)現(xiàn)滑塊驗(yàn)證碼2022-05-05在python下使用tensorflow判斷是否存在文件夾的實(shí)例
今天小編就為大家分享一篇在python下使用tensorflow判斷是否存在文件夾的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06淺談python元素如何去重,去重后如何保持原來元素的順序不變
這篇文章主要介紹了淺談python元素如何去重,去重后如何保持原來元素的順序不變?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02詳解python使用Nginx和uWSGI來運(yùn)行Python應(yīng)用
這篇文章主要介紹了詳解python使用Nginx和uWSGI來運(yùn)行Python應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01