
01
引言
欢迎回来,图像处理爱好者们!🌟 今天,让我们继续研究图像处理领域中的形态学计算。这些非线性的图像处理技术允许我们操纵图像中对象的形状和结构。在本篇中,我们将介绍腐蚀操作的相反作用,也就是膨胀操作。
02
膨胀操作原理
膨胀操作为腐蚀操作的作用相反,这是图像处理中最常使用的另一种形态学操作,它主要通过在图像边界上扩展像素来实现扩宽图像中对象的作用。膨胀操作通过考虑每个像素的邻域并将其值设置为该邻域中所有像素中的最大值来实现的。对于二值图像,如果任何相邻像素的值为1,则输出像素也被设置为1。
接着,让我们通过具体示例来进行讲解,首先导入我们今天的图像,代码如下:
original_image = np.array([[0, 0, 0, 0, 0, 0, 0, 0],[],[],[],[],[],[],[]])plt.figure(figsize=(10,10))plt.imshow(original_image, cmap='gray', extent=[0, 8, 0, 8])plt.title('Original Image', fontsize=20);
得到结果如下:

03
选择结构化元素
接下来是定义结构化元素,对于这个例子,让我们使用十字架作为我们的选择:
selem_cross = np.array([[0,1,0],[],[]])plt.figure(figsize=(9,9))plt.imshow(selem_cross, cmap='gray')plt.title('Structuring Element: Cross', fontsize=20);
得到结构化元素可视化效果如下:

04
膨胀操作效果
经过上述操作,我们定义了需要操作的原始图像和相应的结构化模板元素,接着我们使用函数apply_erosion来将上述结构化模板元素作用于相应的图像中,进而得到我们膨胀操作的效果,代码如下:
def apply_erosion(image, selem):# Perform erosion on the given image using the structuring element, selemeroded_image = erosion(image, selem)# Display the original and eroded imagesfig, axes = plt.subplots(1, 3, figsize=(15, 10))ax = axes.ravel()ax[0].imshow(selem, cmap='gray',extent=[0, selem.shape[1], 0, selem.shape[0]])ax[0].set_title('Structuring Element', fontsize=20)ax[1].imshow(image, cmap='gray',extent=[0, image.shape[1], 0, image.shape[0]])ax[1].set_title('Original Image', fontsize=20)ax[2].imshow(eroded_image, cmap='gray',extent=[0, image.shape[1], 0, image.shape[0]])ax[2].set_title('Eroded Image', fontsize=20)plt.tight_layout()plt.show()apply_erosion(original_image, selem_cross)
得到结果如下:

05
动态效果
观察上述输出,可以看到经过变换后的图对应的是原始图像的图的扩大版,这就是膨胀操作的效果。大家可以通过下列动图进行更加详细的理解,样例图如下:🖼️✨

06
其他效果
需要注意的是,和腐蚀操作类似,膨胀操作中使用的邻域大小或结构元素的选择会对结果产生不同的影响。
这里,如果选择使用上一篇节中的正方形作为测试结构元素,相应得效果如下:

07
总结
您学废了嘛?😎
点击上方小卡片关注我
新年寄语:
所求皆如愿,
所行皆坦途。
多喜乐,长安宁。

