文章目录
- 简介
- 实战
简介
腐蚀和膨胀是图像形态学处理的基本运算,这两种运算的复合运算构成了开和闭,而腐蚀、膨胀与原图之间的加减操作,则构成了形态学梯度、礼帽和黑帽计算。
由于这几种函数均基于腐蚀和膨胀,所以其参数均与开闭运算相同
- 形态学梯度 morphological_gradient(input, size=None, footprint=None, structure=None, output=None, mode=‘reflect’, cval=0.0, origin=0)
- 礼帽运算 white_tophat(input, size=None, footprint=None, structure=None, output=None, mode=‘reflect’, cval=0.0, origin=0)
- 黑帽运算 black_tophat(input, size=None, footprint=None, structure=None, output=None, mode=‘reflect’, cval=0.0, origin=0)
- 拉普拉斯变换 morphological_laplace(input, size=None, footprint=None, structure=None, output=None, mode=‘reflect’, cval=0.0, origin=0)
各参数含义如下
size
为滤波模板mode
可选reflect,constant,nearest,mirror, wrap
,边缘填充方式cval
边缘填充值structure
为数组类型,表示构造元素,可以理解为是卷积模板output
与输入相同维度的数组,可以存下结果orgin
过滤器设置,默认为0
其中,礼帽又叫顶帽,等于原图减去开运算;黑帽又叫底帽,为原图减去闭运算。
实战
下面用scipy.misc
中的楼梯图像,对礼帽、黑帽以及形态学梯度函数进行测试,方便起见,做一个函数字典funcs
,分别存储自身映射、礼帽、黑帽函数,分别对楼梯图像进行处理并绘图。
import scipy.ndimage as sn
from scipy.misc import ascent
import matplotlib.pyplot as plt
img = ascent()
img = img[350:500, 400:500]
funcs = {
"original": lambda x, tmp:x,
"white" : sn.white_tophat,
"black" : sn.black_tophat,
}
fig = plt.figure()
for i, key in enumerate(funcs):
ax = fig.add_subplot(1,3,i+1)
plt.imshow(funcs[key](img, (5,5)), cmap=plt.cm.gray)
plt.title(key)
plt.axis('off')
plt.show()
效果如下
形态学梯度为膨胀图减去腐蚀图,这种操作会把图像的边缘提取出来,scipy.ndimage
中提供来了gradient
和laplace
两个函数
img = (img > 125)*1
funcs = {
"original": lambda x, tmp:x,
"gradient" : sn.morphological_gradient,
"laplace" : sn.morphological_laplace,
}
fig = plt.figure()
for i, key in enumerate(funcs):
ax = fig.add_subplot(1,3,i+1)
plt.imshow(funcs[key](img, (3,3)), cmap=plt.cm.gray)
plt.title(key)
plt.axis('off')
plt.show()
效果如下