图像处理技巧形态学滤波之膨胀操作

news/2024/7/21 7:38:25 标签: 图像处理, python, 人工智能

1. 引言

欢迎回来,我的图像处理爱好者们!今天,让我们继续研究图像处理领域中的形态学计算。在本篇中,我们将重点介绍腐蚀操作的反向效果膨胀操作。

闲话少说,我们直接开始吧!

2. 膨胀操作原理

膨胀操作为腐蚀操作的作用相反,这是图像处理中最常使用的另一种形态学操作,它主要通过在图像边界上扩展像素来实现扩宽图像中对象的作用。膨胀操作通过考虑每个像素的邻域并将其值设置为该邻域中所有像素中的最大值来实现的。对于二值图像,如果任何相邻像素的值为1,则输出像素也被设置为1。

接着,让我们通过具体示例来进行讲解,首先导入我们今天的图像,代码如下:

# Define the image
original_image = np.array([[0, 0, 0, 0, 0, 0, 0, 0],
                           [0, 0, 0, 1, 1, 1, 0, 0],
                           [0, 0, 1, 1, 1, 1, 0, 0],
                           [0, 1, 1, 1, 1, 0, 0, 0],
                           [0, 1, 1, 1, 0, 0, 0, 0],
                           [0, 1, 1, 1, 0, 0, 0, 0],
                           [0, 0, 0, 0, 0, 0, 0, 0],
                           [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);

得到结果如下:
在这里插入图片描述

3. 定义结构化元素

和上一节腐蚀操作类似,我们选择同样的十字架结构化元素模板,代码如下:

# Define the structuring element
selem_cross = np.array([[0,1,0],
                        [1,1,1],
                        [0,1,0]])
plt.figure(figsize=(9,9))
plt.imshow(selem_cross, cmap='gray')
plt.title('Structuring Element: Cross', fontsize=20);

得到结果如下:
在这里插入图片描述

4. 膨胀操作效果

经过上述操作,我们定义了需要操作的原始图像和相应的结构化模板元素,接着我们使用函数apply_erosion来将上述结构化模板元素作用于相应的图像中,进而得到我们膨胀操作的效果,代码如下:

def apply_erosion(image, selem):
    # Perform erosion on the given image using the structuring element, selem
    eroded_image = erosion(image, selem)

    # Display the original and eroded images
    fig, 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)

最终膨胀操作的效果如下:
在这里插入图片描述
观察上述输出,可以看到经过膨胀操作后的图相比原始图像的扩大版。大家可以通过下列动图进行更加详细的理解,样例图如下:
在这里插入图片描述

5. 其他效果

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

6. 总结

本文重点介绍了和腐蚀操作相反作用得膨胀操作,并通过具体例子进行了原理讲解,同时给出了相应得代码示例。

您学废了嘛?


http://www.niftyadmin.cn/n/4933361.html

相关文章

大O表示法表示算法运行时间

大O表示法用来度量一个算法的运行时间。书写为O(n),其中n为一个算法所执行的操作次数。当我们讨论算法的运行时间时,说的是一个算法在给定的输入列表增加的情况下算法执行操作数的增速,也就是运行时间的增速。 二分查找算法 下面介绍两种简…

Java工厂模式

首先创建一个工厂全部需要用到的统一入口 public class PrintFormatFactory {/*** Description: 格式化数据** param value 值* param format 格式化类型* param setting 格式化配置* Author: 洪家洪* Date: 2023/8/9 11:01* return:**/public static Object formatValue(O…

Android应用开发(37)LTPO帧率测试基于Surfaceview(暂存)

Android应用开发学习笔记——目录索引 参考android官网: Frame rate | Android media | Android Developers多重刷新率 | Android 开源项目 | Android Open Source ProjectWindowManager.LayoutParams | Android Developers 目前市面上旗舰手机基本都是…

0基础学习VR全景平台篇 第83篇:智慧眼-怎么理解分类?

一、功能说明 分类可以理解为,为了方便城市运营工作的管理所实行的行政区划,如XXX乡镇、XXX街道等等。 二、后台编辑界面 1、点击【新增】,填写分类的名称,若有上一级分类,那么还需选择父级分类,建议从最…

QGIS3.28的二次开发七:创建地图工具

地图工具是输入设备(一般指鼠标与键盘)与画布(QgsMapCanvas)的交互接口。它负责处理所有用户通过输入设备(鼠标和键盘)和画布互动的操作,例如镜头控制、要素绘制、标识工具等。 QgsMapTool 是地…

数据结构-带头双向循环链表的实现

前言 带头双向循环链表是一种重要的数据结构,它的结构是很完美的,它弥补了单链表的许多不足,让我们一起来了解一下它是如何实现的吧! 1.节点的结构 它的节点中存储着数据和两个指针,一个指针_prev用来记录前一个节点…

minio启动后访问不到api地址

本地docker 安装minio(23版)后界面能访问到,项目中api地址访问失败执行下面命令 docker run -d -p 9000:9000 -p 9001:9001 --name minio1 -v /home/minio/data:/data -e "MINIO_ROOT_USERminio" -e "MINIO_ROOT_PASSWORDmin…

VS Code中C++程序的调试(Debug)功能

有一个.vscode文件,存放当前工作区相关配置文件的目录。 launch.json {"version": "0.2.0","configurations": [{"name": "gcc.exe - 生成和调试活动文件", // 该调试任务的名字,启动调试时会在待…