python 簡單影象處理(13) 二值圖腐蝕和膨脹,開運算、閉運算
阿新 • • 發佈:2019-01-04
我們直接看圖吧
我們把粗框內的區域看作原影象
假設有一個圓在影象空間移動,取一個點作為圓的中心,若圓的區域被完全包含在原影象中
則我們把它放到腐蝕後的區域中
若只有一部分在原影象區域或沒有一個點在原圖區域中,我們則不會把它放在腐蝕區中
顯然,粗框區域腐蝕後會變成內部填充框區域
而膨脹卻恰恰相反
把粗框線看作原圖的話,取原圖上一點為圓的中心,所以在圓的區域都被放在膨脹區
顯然,膨脹後,原圖會變成外邊框的區域
上面,我們是以圓為窗的,事實上你可以使用任意窗形,不過最好有一箇中心點
好啦,我們來看看利用腐蝕和膨脹有什麼效果吧
import cvdef Two(image):
w =
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
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
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)
看看執行效果吧
第一幅圖是原圖的灰度圖,第二幅圖是對其做了二值處理
對於二值影象來說,對黑色進行腐蝕與對白色進行膨脹得到的效果是一樣的,
對白色進行腐蝕與對黑色進行膨脹的得到的效果是一樣的。當然,你需要像我一樣選取一個矩形窗作為移動的框
我們來驗證一下
我們先將影象反色,再處理。驗證了上面的話
我們來看看更復雜的影象吧
我們來講兩個概念:開運算和閉運算
開運算是對影象先腐蝕後膨脹
閉運算是對影象先膨脹後腐蝕
在前面的基礎上,我們對腐蝕後的影象做膨脹操作得到的就是開運算的結果
對膨脹後的影象做腐蝕操作得到的就是閉運算的結果
我們來看看效果
(例子中的圖片,如有版權問題,請作者與我聯絡,謝謝)
開運算能夠除去孤立的小點,毛刺和小橋,而總的位置和形狀不變
閉運算能夠填平小湖(小孔),彌合小裂縫,而總的位置和形狀不變
不同的視窗對運算結果會有影響