生活随笔
收集整理的這篇文章主要介紹了
《OpenCV算法精解——基于Python与C++》第七章形态学处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第七章形態學處理總結
Github地址
形態學處理主要對圖像處理,提取高亮區域的暗部,提取暗部區域的高光。
基礎構建結構元element:
- element = cv2.getStructuringElement(shape,ksize)
- shape: cv2.MORPH_RECT(矩形),cv2.MORPH_ELLIPSEM(橢圓形),cv2.MORPH_CROSS(十字交叉形)
7.1_腐蝕:領域最小灰度做輸出灰度。圖像亮度降低。亮度區域減小。
- dst = cv2.erode(src,element,iterations迭代次數)
7.2_膨脹:領域最大灰度做輸出灰度。圖像亮度提高。亮度區域增加。
- dst = cv2.dilate(src,element,iterations)
7.3/7.4_開運算&閉運算&白頂帽&黑底帽&形態學梯度
-
開運算: erode * dilate,消除暗部高亮區域,不改變面積情況下平滑邊界
-
閉運算:dilate * erode,消除高光部分的暗部,多次迭代處理不改變面積情況平滑邊界
-
白頂帽:src - open,得到暗部被消除的高光
-
黑底帽:src - close,得到高光消除的暗部
-
形態學梯度:dilate - erode,邊緣檢測作用
-
dst = cv2.morphologyEx(src,op,element)
- MORPH_OPEN:開運算
- MORPH_CLOSE:閉運算
- MORPH_TOPHAT:頂帽運算
- MORPH_BLACKHAT:底帽運算
- MORPH_GRADIENT:梯度運算
7.3還介紹了OpenCV用調節條實時調節結構元半徑&迭代次數
7.1_腐蝕erode
本章形態學用來優化分割區域的形狀以達到更好的效果。
腐蝕:原理同中值平滑,但選取領域內最小值作為輸出灰度。總體亮度平均值會降低。
- erode(src,element[, dst[, anchor錨點[, iterations迭代次數[, borderType邊界擴充類型鏡像最好[, borderValue]]]]])
僅需要調節element結構元,與iterations迭代次數即可,其他默認
element為結構元,有三種形狀:cv2.MORPH_RECT(矩形),cv2.MORPH_ELLIPSEM(橢圓形),cv2.MORPH_CROSS(十字交叉形)
- cv2.getStructuringElement(shape, ksize[, anchor])
import cv2
import matplotlib
.pyplot
as plt
I
= cv2
.imread
("img2.jpg",0)
s3
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(3,3))
r3
= cv2
.erode
(I
,s3
)
e3
= I
- r3
s7
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(7,7))
r7
= cv2
.erode
(I
,s7
)
e7
= I
- r7
s11
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(11,11))
r11
= cv2
.erode
(I
,s11
)
e11
= I
- r11
for i
in range(7):titles
= ["src","dst3","dst7","dst11","edge3","edge7","edge11"]images
= [I
,r3
,r7
,r11
,e3
,e7
,e11
]plt
.subplot
(2,4,i
+1)plt
.title
(titles
[i
])plt
.imshow
(images
[i
])
plt
.show
效果很好,隨著結構元尺寸增加,白色主體腐蝕越多,結構元形狀也形如馬賽克被凸顯出來。
7.2_膨脹dilate
膨脹與腐蝕相反,選擇領域最大灰度值作為輸出。輸出圖像亮度平均值上升,亮部主體尺寸變大。
- cv2.dilate(src, element[, dst[, anchor[, terations[, borderType[, borderValue]]]]])
import cv2
import matplotlib
.pyplot
as plt
I
= cv2
.imread
("img2.jpg",0)
cv2
.imshow
("I",I
)
r
= 1
Max_R
= 20
cv2
.namedWindow
("dilate",1)
def nothing(*arg
):pass
cv2
.createTrackbar
("r","dilate",r
,Max_R
,nothing
)
while True:r
= cv2
.getTrackbarPos
('r','dilate')s
= cv2
.getStructuringElement
(cv2
.MORPH_ELLIPSE
,(2*r
+1,2*r
+1))d
= cv2
.dilate
(I
,s
)cv2
.imshow
("dilate",d
)ch
= cv2
.waitKey
(5)if ch
==27:break
cv2
.destroyAllWindows
()
r1
= 3
s1
= cv2
.getStructuringElement
(cv2
.MORPH_ELLIPSE
,(2*r1
+1,2*r1
+1))
d1
= cv2
.dilate
(I
,s1
)
plt
.subplot
(1,2,1)
plt
.imshow
(I
)
plt
.subplot
(1,2,2)
plt
.imshow
(d1
)
plt
.show
()
7.3_開閉運算
通過將腐蝕與膨脹進行先后組合,也就是開,閉運算。
cv2.morphologyEx(src,op,element[, dst[, anchor[, iterations[, borderType[,borderValue]]]]])
op:
- MORPH_OPEN:開運算
- MORPH_CLOSE:閉運算
- MORPH_TOPHAT:頂帽運算
- MORPH_BLACKHAT:底帽運算
- MORPH_GRADIENT:梯度運算
增加調節結構元半徑進度條與迭代次數進度條
開運算
import sys
import cv2
import matplotlib
.pyplot
as plt
I_open
= cv2
.imread
("open.jpg",0)
cv2
.imshow
("I_open",I_open
)
r
,i
=1,1
MAX_R
,MAX_I
= 20,20
cv2
.namedWindow
("morphology",1)
def nothing(*arg
):pass
cv2
.createTrackbar
("r","morphology",r
,MAX_R
,nothing
)
cv2
.createTrackbar
("i","morphology",i
,MAX_I
,nothing
)
while True:r
= cv2
.getTrackbarPos
("r","morphology")i
= cv2
.getTrackbarPos
("i","morphology")s
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(2*r
+1,2*r
+1))d_open
= cv2
.morphologyEx
(I_open
,cv2
.MORPH_OPEN
,s
,iterations
=i
)cv2
.imshow
("morphology",d_open
)ch
= cv2
.waitKey
(5)if ch
==27:break
cv2
.destroyAllWindows
()
plt
.subplot
(1,2,1)
plt
.imshow
(I_open
)
plt
.subplot
(1,2,2)
s
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(2*3+1,2*3+1))
d_open
= cv2
.morphologyEx
(I_open
,cv2
.MORPH_OPEN
,s
,iterations
=5)
plt
.imshow
(d_open
)
plt
.show
()
開運算,暗處中間高亮被消除
import sys
import cv2
import matplotlib
.pyplot
as plt
I_close
= cv2
.imread
("open.jpg",0)
cv2
.imshow
("I_close",I_close
)
r
,i
=1,1
MAX_R
,MAX_I
= 20,20
cv2
.namedWindow
("morphology",1)
def nothing(*arg
):pass
cv2
.createTrackbar
("r","morphology",r
,MAX_R
,nothing
)
cv2
.createTrackbar
("i","morphology",i
,MAX_I
,nothing
)
while True:r
= cv2
.getTrackbarPos
("r","morphology")i
= cv2
.getTrackbarPos
("i","morphology")s
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(2*r
+1,2*r
+1))d_close
= cv2
.morphologyEx
(I_close
,cv2
.MORPH_CLOSE
,s
,iterations
=i
)cv2
.imshow
("morphology",d_close
)ch
= cv2
.waitKey
(5)if ch
==27:break
cv2
.destroyAllWindows
()
plt
.subplot
(1,2,1)
plt
.imshow
(I_close
)
plt
.subplot
(1,2,2)
s
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(2*5+1,2*5+1))
d_close
= cv2
.morphologyEx
(I_close
,cv2
.MORPH_CLOSE
,s
,iterations
=3)
plt
.imshow
(d_close
)
plt
.show
()
閉運算,高亮中間暗處被消除
7.4_其他形態學操作
其他形態學操作:
-
白頂帽變換(cv2.MORPH_TOPHAT): 圖像減去開運算,得到被消除高亮區域。
-
黑底帽變換(cv2.MORPH_BLACKHAT):圖像減去閉運算,得到被消除的暗部區域。
-
形態學梯度變換(cv2.MORPH_GRADIENT):膨脹減去腐蝕,得到物體邊界。(邊緣檢測)
import cv2
import matplotlib
.pyplot
as plt
I
= cv2
.imread
("open.jpg",0)
cv2
.imshow
("I",I
)r
,i
= 1,1
MAX_R
,MAX_I
= 20,20
cv2
.namedWindow
("morphology",1)
def nothing(*arg
):pass
cv2
.createTrackbar
("r","morphology",r
,MAX_R
,nothing
)
cv2
.createTrackbar
("i","morphology",i
,MAX_I
,nothing
)
while True:r
= cv2
.getTrackbarPos
("r","morphology")i
= cv2
.getTrackbarPos
("i","morphology")s
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(2*r
+1,2*r
+1))d_TOPHAT
= cv2
.morphologyEx
(I
,cv2
.MORPH_TOPHAT
,s
,iterations
=i
)d_BLACKHAT
= cv2
.morphologyEx
(I
,cv2
.MORPH_BLACKHAT
,s
,iterations
=i
)d_GRADIENT
= cv2
.morphologyEx
(I
,cv2
.MORPH_GRADIENT
,s
,iterations
=i
)cv2
.imshow
("TOPHAT",d_TOPHAT
)cv2
.imshow
("BLACKHAT",d_BLACKHAT
)cv2
.imshow
("GRADIENT",d_GRADIENT
)ch
= cv2
.waitKey
(5)if ch
== 27:break
cv2
.destroyAllWindows
()
s
= cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(2*5+1,2*5+1))
d_TOPHAT
= cv2
.morphologyEx
(I
,cv2
.MORPH_TOPHAT
,s
,iterations
=3)
d_BLACKHAT
= cv2
.morphologyEx
(I
,cv2
.MORPH_BLACKHAT
,s
,iterations
=3)
d_GRADIENT
= cv2
.morphologyEx
(I
,cv2
.MORPH_GRADIENT
,cv2
.getStructuringElement
(cv2
.MORPH_RECT
,(2*1+1,2*1+1)),iterations
=1)
titles
= ["I","TOPHAT","BLACKHAT","GRADIENT"]
images
= [I
,d_TOPHAT
,d_BLACKHAT
,d_GRADIENT
]
for i
in range(4):plt
.subplot
(2,2,i
+1)plt
.title
(titles
[i
])plt
.imshow
(images
[i
])
plt
.show
()
白頂帽顯示暗部高亮,黑底部顯示高亮暗部。形態學梯度顯示邊緣檢測。
總結
以上是生活随笔為你收集整理的《OpenCV算法精解——基于Python与C++》第七章形态学处理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。