膨胀
效果:扩大图像中的物体
定义:设 A 为原始二值图像,B 是结构元素,则 A 被 B 膨胀定义为:
def Morphology_Dilate(img, Dil_time=1):
H, W = img.shape
# kernel
MF = np.array(((0, 1, 0),
(1, 0, 1),
(0, 1, 0)), dtype=np.int)
# each dilate time
out = img.copy()
for i in range(Dil_time):
tmp = np.pad(out, (1, 1), 'edge')
for y in range(1, H + 1):
for x in range(1, W + 1):
if np.sum(MF * tmp[y - 1:y + 2, x - 1:x + 2]) >= 255:
out[y - 1, x - 1] = 255
return out
即,A 被 B 膨胀的结果是满足上式的所有位移 z 的点(前景像素点)的集合
腐蚀
效果:缩小图像中的物体
定义:设 A 为原始二值图像,B 是结构元素,则 A 被 B 腐蚀定义为:
即,将结构元素 B 相对于集合 A 进行平移, 只要平移后结构元素都包含在集合 A 中, 则这些位移Z 的点(前景像素点)的集合即为腐蚀结果。
def Morphology_Erode(img, Erode_time=1):
H, W = img.shape
out = img.copy()
# kernel
MF = np.array(((0, 1, 0),
(1, 0, 1),
(0, 1, 0)), dtype=np.int)
# each erode
for i in range(Erode_time):
tmp = np.pad(out, (1, 1), 'edge')
# erode
for y in range(1, H+1):
for x in range(1, W+1):
if np.sum(MF * tmp[y-1:y+2, x-1:x+2]) < 255*4:
out[y-1, x-1] = 0
return out
开运算
效果:断开较窄的狭颈、消除细的突出物,使图像的轮廓变得光滑
定义:设 A 为原始二值图像,B 是结构元素,则 使用结构元素 B 对集合 A 进行开启操作,定义为:
即,先用 B 对 A 腐蚀,然后用 B 对腐蚀结果进行膨胀。
def Morphology_Opening(img, time=1):
out = Morphology_Erode(img, Erode_time=time)
out = Morphology_Dilate(out, Dil_time=time)
闭运算
效果:填补狭窄的间断、小的孔洞,使图像的轮廓变得光滑
定义:设 A 为原始二值图像,B 是结构元素,则使用结构元素 B 对集合 A 进行闭合操作,定义为:
即,先用 B 对 A 膨胀,然后用 B 对结果进行腐蚀
def Morphology_Closing(img, time=1):
out = Morphology_Dilate(img, Dil_time=time)
out = Morphology_Erode(out, Erode_time=time)
return out