1. 程式人生 > >python 簡單影象處理(13) 二值圖腐蝕和膨脹,開運算、閉運算

python 簡單影象處理(13) 二值圖腐蝕和膨脹,開運算、閉運算

我們直接看圖吧

我們把粗框內的區域看作原影象

假設有一個圓在影象空間移動,取一個點作為圓的中心,若圓的區域被完全包含在原影象中

則我們把它放到腐蝕後的區域中

若只有一部分在原影象區域或沒有一個點在原圖區域中,我們則不會把它放在腐蝕區中

顯然,粗框區域腐蝕後會變成內部填充框區域

而膨脹卻恰恰相反

把粗框線看作原圖的話,取原圖上一點為圓的中心,所以在圓的區域都被放在膨脹區

顯然,膨脹後,原圖會變成外邊框的區域

上面,我們是以圓為窗的,事實上你可以使用任意窗形,不過最好有一箇中心點

好啦,我們來看看利用腐蝕和膨脹有什麼效果吧

複製程式碼 import cv

def Two(image):
w
=
image.width
h
= image.height
size
= (w,h)
iTwo
= cv.CreateImage(size,8,1)
for i in range(h):
for j in range(w):
iTwo[i,j]
= 0 if image[i,j] <220else255return iTwo

def Corrode(image):
w
= image.width
h
= image.height
size
= (w,h)
iCorrode
= cv.CreateImage(size,8,1)
kH
= range(2)+range(h-2,h)
kW
= range(2)+range(w-2,w)
for i in range(h):
for j in range(w):
if i in kH or j in kW:
iCorrode[i,j]
=255elif image[i,j] ==255:
iCorrode[i,j]
=255else:
a
= []
for k in range(5):
for l in range(5):
a.append(image[i
-2+k,j-2+l])
if max(a) ==255:
iCorrode[i,j]
=255else:
iCorrode[i,j]
= 0
return iCorrode

def Expand(image):
w
= image.width
h
= image.height
size
= (w,h)
iExpand
= cv.CreateImage(size,8,1)
for i in range(h):
for j in range(w):
iExpand[i,j]
=255for i in range(h):
for j in range(w):
if image[i,j] == 0:
for k in range(5):
for l in range(5):
if-1<(i-2+k)<h and-1<(j-2+l)<w:
iExpand[i
-2+k,j-2+l] = 0
return iExpand


image
= cv.LoadImage('pic3.jpg',0)
iTwo
= Two(image)
iCorrode
= Corrode(iTwo)
iExpand
= Expand(iTwo)

cv.ShowImage(
'image',image)
cv.ShowImage(
'iTwo',iTwo)
cv.ShowImage(
'iCorrode',iCorrode)
cv.ShowImage(
'iExpand',iExpand)
cv.WaitKey(0)
複製程式碼

看看執行效果吧

第一幅圖是原圖的灰度圖,第二幅圖是對其做了二值處理

對於二值影象來說,對黑色進行腐蝕與對白色進行膨脹得到的效果是一樣的,

對白色進行腐蝕與對黑色進行膨脹的得到的效果是一樣的。當然,你需要像我一樣選取一個矩形窗作為移動的框

我們來驗證一下

我們先將影象反色,再處理。驗證了上面的話

我們來看看更復雜的影象吧

我們來講兩個概念:開運算和閉運算

開運算是對影象先腐蝕後膨脹

閉運算是對影象先膨脹後腐蝕

在前面的基礎上,我們對腐蝕後的影象做膨脹操作得到的就是開運算的結果

對膨脹後的影象做腐蝕操作得到的就是閉運算的結果

我們來看看效果

(例子中的圖片,如有版權問題,請作者與我聯絡,謝謝)

開運算能夠除去孤立的小點,毛刺和小橋,而總的位置和形狀不變

閉運算能夠填平小湖(小孔),彌合小裂縫,而總的位置和形狀不變

不同的視窗對運算結果會有影響