文章目錄
- 1、膨脹
- 2、腐蝕
- 3、閉運算
- 4、 開運算
- 5、具體代碼
- 6、實驗總結
1、膨脹
首先使用的是opencv提供的getStructuringElement函式獲取結構元素,分別設定結構元素為55 與 66 規格對二值化以后的lena圖進行膨脹處理,因為是以白色為主進行膨脹,因此黑色部分隨著結構元素的規格增大而減少,最終當結構元素大于一定值的時候,整張圖片就變成白色的了,
def Dilate(Bin_img):
#設定一個5*5的結構元素
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
#iterations為膨脹次數
Dilate_img = cv.dilate(Bin_img,kernel,iterations=1)
kernel2 = cv.getStructuringElement(cv.MORPH_RECT, (6,6))
Dilate_img2 = cv.dilate(Bin_img,kernel2,iterations=1)
result = cv.hconcat((Bin_img,Dilate_img,Dilate_img2))
cv.imshow("Dilate",result)
cv.waitKey()
return Dilate_img
2、腐蝕
使用了55與 66規格的結構元素,腐蝕運算則是與膨脹運算是一相反的操作程序,隨著結構元素的規格增大,白色像素逐漸變少,最后整張圖片就會變成黑色,
def Erode(Bin_img):
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
Erode_img = cv.erode(Bin_img,kernel,iterations=1)
kernel2 = cv.getStructuringElement(cv.MORPH_RECT, (6, 6))
Erode_img2 = cv.erode(Bin_img,kernel2,iterations=1)
result = cv.hconcat((Bin_img,Erode_img,Erode_img2))
cv.imshow("Erode",result)
cv.waitKey()
return Erode_img
3、閉運算
閉運算是先進行膨脹操作再進行腐蝕操作,能夠去掉聯通區域內的小型空洞,平滑物體輪廓,連接兩個臨近的連通域,通過對比右邊兩張圖能夠發現,對于同一張圖,閉運算閉簡單的服飾運算結果相比,閉運算最主要的作用是能夠消除影像內部的小黑洞,而閉運算僅僅在結構元素的作用下減少像素,
def Closed(Bin_img):
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
Closed_img = cv.morphologyEx(Bin_img, cv.MORPH_CLOSE, kernel)
result = cv.hconcat(Bin_img,Erode_img,Closed_img)
cv.imshow("Closed", result)
cv.waitKey()
4、 開運算
開運算是先進行腐蝕再進行膨脹操作,因此影像中一些比較小的連通區域在第一次腐蝕操作的時候就被除去了,在第二次的膨脹運算中,能夠將影像中原本存在的簡短點連接起來,開運算可以去除影像中的噪聲也是因為這個原因,但是開運算會將影像主要區域面積縮小,造成主要區域的形狀發生改變,
def Open(Bin_img):
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
Open_img = cv.morphologyEx(Bin_img,cv.MORPH_OPEN,kernel)
result = cv.hconcat((Bin_img,Dilate_img,Open_img))
cv.imshow("Open",result)
cv.waitKey()
5、具體代碼
import cv2 as cv
import numpy as np
def binaryzation(img):
th1 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY, 11, 2)
ret2, th2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
ret3, th3 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
ret4, th4 = cv.threshold(img, 127, 255, cv.THRESH_TRUNC)
temp1 = cv.hconcat((th1,th2))
temp2 = cv.hconcat((th3,th4))
temp = cv.vconcat((temp1,temp2))
# cv.imshow("result",temp)
# cv.waitKey()
return th1
def Dilate(Bin_img):
#設定一個5*5的結構元素
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
#iterations為膨脹次數
Dilate_img = cv.dilate(Bin_img,kernel,iterations=1)
kernel2 = cv.getStructuringElement(cv.MORPH_RECT, (6,6))
Dilate_img2 = cv.dilate(Bin_img,kernel2,iterations=1)
result = cv.hconcat((Bin_img,Dilate_img,Dilate_img2))
cv.imshow("Dilate",result)
cv.waitKey()
return Dilate_img
def Erode(Bin_img):
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
Erode_img = cv.erode(Bin_img,kernel,iterations=1)
kernel2 = cv.getStructuringElement(cv.MORPH_RECT, (6, 6))
Erode_img2 = cv.erode(Bin_img,kernel2,iterations=1)
result = cv.hconcat((Bin_img,Erode_img,Erode_img2))
cv.imshow("Erode",result)
cv.waitKey()
return Erode_img
def Closed(Bin_img):
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
Closed_img = cv.morphologyEx(Bin_img, cv.MORPH_CLOSE, kernel)
result = cv.hconcat(Bin_img,Erode_img,Closed_img)
cv.imshow("Closed", result)
cv.waitKey()
def Open(Bin_img):
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
Open_img = cv.morphologyEx(Bin_img,cv.MORPH_OPEN,kernel)
result = cv.hconcat((Bin_img,Dilate_img,Open_img))
cv.imshow("Open",result)
cv.waitKey()
if __name__ == '__main__':
src = './Image/lenna.jpg';
img0 = cv.imread(src)
img = cv.imread(src,0)
# 1 二值化
Bin_img = binaryzation(img)
# 2 膨脹
Dilate_img = Dilate(Bin_img)
# 3 腐蝕
Erode_img = Erode(Bin_img)
# 4 閉運算
#Closed_img = Closed(Bin_img)
# 5 開運算
Open_img = Open(Bin_img)
6、實驗總結
通過本次實驗,及之前的理論課學習到了影像形態學在影像處理中的應用,主要應用于從影像中提取對于表達和描述區域形狀有意義的影像分量,以便后續的識別作業能夠抓住物件最本質的特性,例如邊界,連通域等,本章學習到了膨脹,腐蝕運算,在基于膨脹,腐蝕運算的基礎上出現的開運算,閉運算能夠解決更加廣泛的實際問題,除此之外還有本次實驗中而米有涉及到的頂帽運算于黑帽運算,頂帽運算是將原影像與開運算結果之間的差值,用來分離比臨近點亮一些的亮斑黑帽運算是原影像與頂帽運算之間的差值,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386745.html
標籤:其他
