闭运算
在数学形态学中,集合B对集合A的Closing是先dilation再用erosion。
和分别表示dilation和erosion。
在影像处理中,closing和opening是用来对影像除噪,这边通常A就是我们输入的影像,B则是kernel。
特性
- Idempotent,即 .
- Increasing,如果 , 然后 .
- Extensive,即 .
- Translation invariant.
实作
这边对binary image做closing的操作,kernel为5*5大小,4个角落被去掉。
closing不一定要先dilation一次再用erosion一次,也可以使用closing = dilation k times + erosion k times。
当想要closing的洞比较大时,可以使用更高的k次。
def dilation(img):
img1 = np.zeros((img.shape[0], img.shape[1]), dtype="int")
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if img[i][j]>0:
row = i-2; col = j-2; # The octogonal 4-5-5-5-4 kernel
for w in range(5):
for h in range(5):
if ( w==0 and h==0 ) or ( w==0 and h==4 ) or ( w==4 and h==0 ) or ( w==4 and h==4 ):
continue
else:
i2 = row + w; j2 = col + h;
if i2 >= 0 and j2 >= 0 and i2 < img.shape[0] and j2 < img.shape[1]:
img1[i2][j2] = 255
return img1
def erosion(img):
img1 = np.zeros((img.shape[0], img.shape[1]), dtype="int")
for i in range(img.shape[0]):
for j in range(img.shape[1]):
flag = 0
row = i-2; col = j-2; # The octogonal 4-5-5-5-4 kernel
for w in range(5):
for h in range(5):
if ( w==0 and h==0 ) or ( w==0 and h==4 ) or ( w==4 and h==0 ) or ( w==4 and h==4 ):
continue
else:
i2 = row + w; j2 = col + h;
if i2 > 0 and j2 > 0 and i2 < img.shape[0] and j2 < img.shape[1]:
if img[i2][j2] == 0:
flag = 1
if flag == 0:
img1[i][j] = 255
return img1
def closing(img):
return erosion(dilation(img))