opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版
基礎(chǔ)版學(xué)習(xí)筆記:
python3+opencv學(xué)習(xí)筆記匯總目錄(適合基礎(chǔ)入門學(xué)習(xí))
進階版筆記目錄鏈接:
python+opencv進階版學(xué)習(xí)筆記目錄(適合有一定基礎(chǔ))
基礎(chǔ)版形態(tài)學(xué):
opencv學(xué)習(xí)筆記12:圖像腐蝕和圖像膨脹
opencv學(xué)習(xí)筆記13:形態(tài)學(xué)變換(開運算,閉運算,梯度運算)
opencv學(xué)習(xí)筆記14:圖像禮帽,圖像黑帽
圖像膨脹
使用卷積核對二值圖像進行遍歷,卷積核對應(yīng)的圖像像素點只要有一個為1,則值為1,否則為0.
即用卷積核對應(yīng)的最大元素替換掉當(dāng)前中心像素。
膨脹作用:對象大小增加一個像素,平滑對象邊緣,減少或者填充對象之間的距離。
使用方法:dilate
結(jié)果=cv2.dilate(二值圖像src,卷積核k,迭代次數(shù)itreations)
卷積核 正方形數(shù)組:如np.ones((5,5),np.uint8)
解釋說明:
在使用opencv的過程中,我們經(jīng)常需要各種各樣的卷積核。如果是正方形的核還好說,可以使用numpy,但是有時候需要定義橢圓形或者十字形的核,我們就需要用到結(jié)構(gòu)化元素
cv2.getStructuringElement()
第一個參數(shù)表示核的形狀。可以選擇三種
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
橢圓形:MORPH_ELLIPSE;
第二個參數(shù)表示核的尺寸。
注意對象要為白色,本文圖對象為黑色,所有我在代碼里用啦反二值化
圖像腐蝕
腐蝕主要針對的是二值圖像,如只有0和1兩個值,
兩個輸入對象:1原始二值圖像,2卷積核
使用卷積核遍歷原始二值圖像,如果卷積核對應(yīng)的元素值均為1,其值才為1,否則為0。
即用卷積核對應(yīng)的最小元素替換掉當(dāng)前中心像素。
腐蝕作用:對象大小減少一個像素,平滑對象邊緣,弱化或者分割圖像之間的半島性連接。
使用方法:erode 中文翻譯:侵蝕
處理結(jié)果=cv2.erode(原始圖像src,卷積核kernel,迭代次數(shù)iterations)
卷積核kernel:一般為正方形數(shù)組
如:k=np.ones((5,5),np.uint8)
迭代次數(shù)iterations:腐蝕次數(shù),默認1
對彩色圖像進行膨脹或腐蝕
import cv2 as cv print("--------- Python OpenCV Tutorial ---------") src = cv.imread("limi.jpg") src=cv.resize(src,None,fx=0.3,fy=0.3) cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) dst = cv.erode(src, kernel)#腐蝕 cv.imshow("result", dst) cv.waitKey(0) cv.destroyAllWindows()開運算
開運算:對圖像先進行腐蝕,然后對腐蝕后的圖進行膨脹
開操作=腐蝕+膨脹
主要應(yīng)用在二值圖像,灰度 圖像也可以。
可以消除背景噪聲
morphologyEx
運算結(jié)果=cv2.morphologyEx(源圖像img,cv2.MORPH_OPEN,卷積核k)
cv2.MORPH_OPEN:開運算
消除了背景小白點噪聲
閉運算
對圖像進行先膨脹,再腐蝕。
有助于關(guān)閉前景物體上的小孔,或者小黑點。
morphologyEx
運算結(jié)果=cv2.morphologyEx(源圖像img,cv2.MORPH_CLOSE,卷積核k)
cv2.MORPH_CLOSE:閉運算
合理選擇卷積核大小,太小了無法去除前景圖的黑點
主要應(yīng)用在二值圖像,灰度 圖像也可以。
消除了前景色小黑點
頂帽
圖像禮帽 也叫圖像頂帽
禮帽圖像=原始圖像-開運算圖像
得到噪聲圖像
開運算:先腐蝕再膨脹
使用方法:morphologyEx
cv2.MORPH_TOPHAT
結(jié)果=cv2.morphologyEx(原始圖像,cv2.MORPH_TOPHAT,卷積核)
卷積核示例:k=np.ones((10,10),np.uint8)
代碼采用了基于灰度度,也可以基于二值圖。
采用不同大小的卷積核,得到的噪聲小白點也不一樣。
黑帽
黑帽圖像=閉運算圖像-原始圖像
得到圖像內(nèi)部的小孔,或前景色的小黑點
閉運算:對圖像進行先膨脹,再腐蝕。有助于關(guān)閉前景物體上的小孔,或者小黑點。
使用對象:二值圖像
使用方法:morphologyEx
cv2.MORPH_BLACKHAT
結(jié)果=cv2.morphologyEx(原始圖像,cv2.MORPH_BLACKHAT,卷積核)
卷積核示例:k=np.ones((10,10),np.uint8)
梯度運算
基本梯度運算結(jié)果=cv2.morphologyEx(源圖像img,cv2.MORPH_GRADIENT,卷積核k)
基本梯度
import cv2 as cv import numpy as np def hat_binary_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))dst = cv.morphologyEx(binary, cv.MORPH_GRADIENT, kernel)cv.imshow("tophat", dst) print("--------- Python OpenCV Tutorial ---------") src = cv.imread("morph1.png") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) hat_binary_demo(src) cv.waitKey(0) cv.destroyAllWindows()外梯度內(nèi)梯度
import cv2 as cv import numpy as npdef gradient2_demo(image):kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))dm = cv.dilate(image, kernel)em = cv.erode(image, kernel)dst1 = cv.subtract(image, em) # internal gradientdst2 = cv.subtract(dm, image) # external gradientcv.imshow("internal", dst1)cv.imshow("external", dst2) print("--------- Python OpenCV Tutorial ---------") src = cv.imread("morph1.png") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) gradient2_demo(src) cv.waitKey(0) cv.destroyAllWindows()電氣專業(yè)的計算機萌新,寫博文不容易。如果你覺得本文對你有用,請點個贊支持下,謝謝。
總結(jié)
以上是生活随笔為你收集整理的opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在家里制作美味的烤鹿肉?
- 下一篇: 女学生们都爱吃的几款酸辣菜?