形态学处理

2023-05-16

原文链接:https://blog.csdn.net/qq_40732350/article/details/116718329?spm=1001.2014.3001.5506

形态学处理

  • 0 前言
  • 1 腐蚀与膨胀
    • 1.1 结构元素
    • 1.2 图像腐蚀
    • 1.3 图像膨胀
  • 2 开运算与闭运算
    • 2.1 开运算
    • 2.2 闭运算
  • 3 灰度图像的形态学
    • 3.1 灰度图像与区域的区别
    • 3.2 灰度图像形态学

0 前言

形态学是图像处理中应用最为广泛的技术之一,主要用于从图像中提取“对表达和描绘区域形状有意义的图像分量”,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。

形态学的基本思想是利用一种特殊的结构元来测量或提取输入图像中相应的形状或特征,以便进一步进行图像分析和目标识别,使后续的识别工作能够抓住目标对象最为本质的形状特征。

形态学处理常用的操作有腐蚀、膨胀、开运算与闭运算。

1 腐蚀与膨胀

在进行图像分割,即经阈值处理提取出目标区域的二值图像之后,区域边缘可能并不理想,这时可以使用腐蚀或膨胀操作对区域进行“收缩”或“扩张”。腐蚀和膨胀是两种最基本也是最重要的形态学运算, 它们是很多高级形态学处理的基础, 很多其他的形态学算法都是由这两种基本运算复合而成。

1.1 结构元素

结构元素在算子参数中的名称为 StructElement,在腐蚀与膨胀操作中都需要用到。结构元素实际上就是由0和1组成的二值像素,可以由具体的腐蚀或膨胀算子来指定结构元素的形状和大小,结构元素的大小也决定着腐蚀或者膨胀的程度。结构元素越大,被腐蚀消失或者被膨胀增加的区域也会越大。

结构元素的形状可以根据操作的需求进行创建,可以是圆形、矩形、椭圆形,甚至是指定的多边形等。可以通过gen_circle、gen_rectanglel,gen_ellipse,gen_region_polygon等算子创建需要的形状并指定大小。

1.2 图像腐蚀

腐蚀操作是对所选区域进行“收缩”的一种操作,可以用于消除边缘和杂点。腐蚀区域的大小与结构元素的大小和形状相关。其原理是使用一个自定义的结构元素,如矩形、圆形等,然后将二值图像对应的像素与结构元素的像素进行对比,得到的交集即为腐蚀后的图像像素。

经过腐蚀操作,图像区域的边缘可能会变得平滑,区域的像素将会减少,相连的部分可能会断开。即使如此,各部分仍然属于同一个区域。

Halcon中有许多与腐蚀操作相关的算子,比较常用的有erosion_circle算子和erosion_rectangle1算子。 这里简单介绍下erosion_circle算子。

erosion_circle:

erosion_circle算子使用圆形进行腐蚀操作,原型如下:

void ErosionCircle(const HObject& Region,
HObject* RegionErosion,
const HTuple& Radius)

其中各参数的含义如下。

Region:为输入图像中的区域,该区域往往是由上一环节的某种分割操作得到的输出结果,如阈值处理提取的区域等。

RegionErosion:为输出的腐蚀后的区域。

Radius:为圆形结构元素的半径。其具体值取与想要被去除的杂点的大小有关。因为小于这个圆形结构元素的点都会被移除,而该圆形的直径一般是一个奇数,如3、5、7、9等,所以该半径取值一般会取1.5、2.5、3.5、4.5默认值是3.5。

用腐蚀算子去除毛刺。

在这里插入图片描述在这里插入图片描述

read_image (Image, 'test.jpg')
threshold (Image, Region, 0, 10)
erosion_circle (Region, RegionErosion, 1)

Halcon其他腐蚀算子:

erosion1:用一个自定义的结构元素对输入区域进行腐蚀操作。这个自定义的结构元素需要预先创建,可能是圆形、矩形、多边形,其至是点,等等。

crosion2:使用一个参考点对输入区域进行腐蚀操作。这个算子中的结构元素有一个参考点,这个点与crosion1中的点不同,它可以是指定的任意一点。

crosion_golay:使用的结构元素来自格雷字母表,通过定义结构元素对输入区域进行腐蚀操作。

erosion_seq:与erosion_golay类似,使用格雷字母表中的元素对输入区域进行连续的腐蚀操作。

1.3 图像膨胀

与腐蚀相反,膨胀是对选区进行“扩大”的一种操作。其原理是使用一个自定义的结构元素,将二值图像对应的像素与结构元素的像素进行对比,得到的并集为膨胀后的图像像素。

经过膨胀操作,图像区域的边缘可能会变得平滑,区域的像素将会增加,不相连的部分可能会连接起来,这些都与腐蚀操作正好相反。即使如此,原本不相连的区域仍然属于各自的区域,不会因为像素重叠就发生合并。

Halcon中有许多与膨胀操作相关的算子,比较常用的有dilation_circle算子和dilation_rectanglel算子,它们分别使用圆形与矩形结构元素对输入区域进行膨胀操作。这里以 dilation_circle算子为例进行说明。

dilation_circle算子的原型如下:

void Dilation_Circle(const HObject& Region, 
                    HObject* RegionDilation, 
                    const HTuple& Radius)

其中各参数的含义如下。

Region:为输入的区域。

RegionDilation:为输出的膨胀后的区域。

Radius:为圆形结构元素的半径,该半径的大小决定了膨胀的程度。其具体取值与待填补的空洞大小有关。该半径默认值依然是3.5。

下面例子通过膨胀来填补空洞区域。
在这里插入图片描述在这里插入图片描述

read_image (Image, 'fingerprint.png')
threshold (Image, Region, 0, 150)
dilation_circle (Region, RegionDilation, 3.5)

Halcon其他膨胀算子:

dilation1:用一个自定义的结构元素对输入区域进行膨胀操作。结构元素需要预先创建好,这个自定义的结构元素可能是圆形、矩形、多边形,甚至是点,等等。

dilation2:使用一个参考点对输入区域进行膨胀操作。这个算子中的结构元素有一个参考点,这个点与dilation1中的点不同,这个参考点可以是指定的任意一点。

dilation_golay:使用的结构元素来自格雷字母表,通过定义结构元素对输入区域进行膨胀操作。

dilation_seq:与dilation_golay类似,使用格雷字母表中的元素对输入区域进行连续的膨胀操作。

2 开运算与闭运算

腐蚀与膨胀是形态学运算的基础,在实际检测的过程中,常常需要组合运用腐蚀与膨胀对图像进行处理。开运算与闭运算组合使用这两种操作,在保留图像主体部分的同时,处理图像中出现的各种杂点、空洞、小的间隙、毛糙的边缘等。合理地运用开运算与闭运算,能简化操作步骤,有效地优化目标区域,使提取出的范围更为理想。

2.1 开运算

开运算的计算步骤是先腐蚀,后膨胀。通过腐蚀运算能去除小的非关健区域,也可以把离得很近的元素分隔开,再通过膨胀填补过度腐蚀留下的空隙。 因此,通过开运算能去除孤立的、细小的点,平滑毛糙的边缘线,同时原区域面积也不会有明显的改变,类似于一种“去毛刺”的效果。

下面是通过圆形结构来消除毛刺。

在这里插入图片描述在这里插入图片描述

read_image (Image, 'test.jpg')
threshold (Image, Region, 0, 150)
gen_circle (Circle, 6, 6, 7)
opening (Region, Circle, RegionOpening)

Halcon其他开运算算子:

  • opening circle:使用圆形结构元素对区域进行开运算处理。

  • opening rectanglel:使用矩形结构元素对区域进行开运算处理。

  • opening golav:使用格雷字母表中的元素对区域进行开运算处理。

  • opening seq:分隔重叠的区域。该算子一般是erosionl、connection和 dilation1算子的连续使用。如果重叠的区域小于结构元素,相交的两个区域将被分隔开来。

2.2 闭运算

闭运算的计算步骤与开运算正好相反,为先膨胀,后腐蚀。这两步操作能将看起来很接近的元素,如区域内部的空洞或外部孤立的点连接成一体,区域的外观和面积也不会有明显的改变。通俗地说,就是类似于“填空隙”的效果。与单独的膨胀操作不同的是,闭运算在填空隙的同时,不会使图像边缘轮廓加粗。

如一下例子,填补空隙。
在这里插入图片描述在这里插入图片描述

read_image (Image, 'pcb.png')threshold (Image, Region, 0, 70)
gen_circle (Circle, 6, 6, 10)
closing (Region, Circle, RegionClosing)

3 灰度图像的形态学

以上介绍的各种算子都是基于区域的,输入的参数类型是Region,而如果要对灰度图像Image进行形态学操作,可以使用与灰度图像相关的算子。

3.1 灰度图像与区域的区别

基于区域的形态学运算与基于灰度图像的形态学运算的根本区别在于,二者输入的对象不同。前者输入的是一些区域,并且这些区域是经过阈值处理的二值图像区域,而后者的输入则是灰度图像。

当输入对象是一些二值区域时,这些区域就成了算子的主要操作对象。区域的灰度是二值的,并不会发生变化,形态学运算改变的是这些区域的形状,如通过腐蚀使区域面积变小,或者通过膨胀使区域面积变大等。而当输入对象是灰度图像时,形态学运算改变的则是像素的灰度,表现为灰度图像上的亮区域或暗区域的变化。

腐蚀运算是将图像中的像素点赋值为其局部邻域中灰度的最小值,因此图像整体灰度值减少,图像中暗的区域变得更暗,较亮的小区域被抑制。

膨胀运算是将图像中的像素点赋值为其局部邻域中灰度的最大值,经过膨胀处理后,图像整体灰度值增大,图像中亮的区域扩大,较暗的小区域消失。

3.2 灰度图像形态学

以下例子分别用腐蚀、膨胀、开运算和闭运算来处理灰度图像。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

read_image (ImageColor, 'pcb.png')
rgb1_to_gray (ImageColor, Image)
*进行灰度图像腐蚀操作
gray_erosion_shape (Image, ImageMin, 11, 11, 'octagon')
*进行灰度图像膨胀操作
gray_dilation_shape (Image, ImageMax, 11, 11, 'octagon')
*进行灰度图像开运算操作
gray_opening_shape (Image, ImageOpening, 7, 7, 'octagon')
*进行灰度图像闭运算操作
gray_closing_shape (Image, ImageClosing, 7, 7, 'octagon')

灰度图像腐蚀:图像变暗了,这是因为图像中较亮的局部区域被收缩了,较暗的区域被扩大了,因而图像变暗了。

灰度图像膨胀:较亮的局部区域被“扩大”了,而较暗的区域被“收缩”了,图像整体变得更亮。

灰度图像开运算:图像中较亮的小细节消失。

灰度图像闭运算:图像中较暗的一些点消失了,类似于灰度图像中的“小孔隙”被填补了,同时较亮的区域的边缘更清晰了。

灰度图像的腐蚀运算算子:

gray_erosion_rect :使用矩形的 mask进行腐蚀操作。

gray_erosion_shape :使用选定的形状mask进行腐蚀操作。

灰度图像的膨胀运算算子:

gray_dilation_rect :使用矩形的mask进行膨胀操作。

gray_dilation_shape :使用选定的形状 mask进行膨胀操作。

灰度图像的开运算算子:

gray_opening:对图像进行灰度值的开运算。

gray_opening _rect :使用矩形的mask对图像进行灰度值的开运算。

gray_opening _shape :使用选定的形状 mask对图像进行灰度值的开运算。

灰度图像的闭运算算子:

gray closing :对图像进行灰度值的闭运算。

gray_closing rect:使用矩形的mask对图像进行灰度值的闭运算。

gray closing shape:使用选定的形状mask对图像进行灰度值的闭运算。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

形态学处理 的相关文章

随机推荐

  • Ubuntu14.04 支持ESM

    https discourse ubuntu com t ubuntu advantage client 21788
  • 开启关闭ICMP

    echo request http www xoxxoo com index index article id 780 html redirect https blog csdn net weixin 39684454 article de
  • AD使用技巧

    AD快捷键 快捷键要处在英文模式的情况下才可以使用 xff1a AD测量快捷键 xff1a R AD对齐快捷键 xff1a A AD切换单位快捷键 xff1a Q AD改变栅格快捷键 xff1a G AD视图配置快捷键 xff1a L AD
  • 多传感器融合框架搭建

    架构 src include apps xff1a 节点文件 front end node cpp 前端节点data pretreat node cpp 数据预处理节点back end node cpp 后端节点loop closing n
  • 多传感器融合框架-ESKF

    架构 基本同图优化框架差不多 内容简述 数据预处理节点 订阅imu原始数据 xff0c gnss原始数据 xff0c 完成数据时间戳同步 点云畸变补偿发布如下消息 畸变补偿后的点云 synced cloudgnss里程计 synced gn
  • OpenCV笔记4.3

    C 43 43 读取目录下所有文件名称 1 包含头文件 96 span class token macro property span class token directive hash span span class token dir
  • 半小时内实现Esp32-Cam模型训练和图像识别

    Esp32 Cam图像识别 一 网页显示视频流1 Linux式例程2 MicroPython式例程步骤1 下载Thonny步骤2 烧录Esp32 Cam固件步骤3 运行相应代码 3 Arduino式例程步骤1 下载Arduino步骤2 安装
  • MANIFOLD 2-G开发 之 利用ROS话题编程实现UART1串口通讯

    目录 MANIFOLD 2 G开发笔记1 项目描述2 遇到的问题3 解决方案4 示例代码5 注意事项6 资源附件6 运行与调试 MANIFOLD 2 G开发笔记 本博客内容将记录MANIFOLD 2 G 开发过程中遇到的问题及解决方案 xf
  • ONOS源码笔记--机制

    app注册 private ApplicationId appId appId 61 coreService registerApplication 34 org onosproject fwd 34 注册应用 xff0c 一般在activ
  • git 本地分支与远程分支关联

    github上已经有master分支 和dev分支 在本地 git checkout b dev 新建并切换到本地dev分支 git pull origin dev 本地分支与远程分支相关联 github上没有dev分支 git check
  • 做设计师还是程序员?一张图你就明白!

    平时大家相安无事 xff0c 可一旦项目滑了水 栽了坑 二重奏就开始没完没了的唱起来了 请看下图 xff1a 你的桌子是有什么 小编反手一摸 xff0c 还好小编的头发还再 你头发呢 xff1f 相信这里有很多学习java的朋友 xff0c
  • 【ROS】动态链接库(.so文件)的生成和调用

    ROS 动态链接库 xff08 so文件 xff09 的生成和使用 引言 xff11 生成so文件 xff12 调用so文件 xff13 运行结果结语 引言 由于项目有涉及到源代码是否交付的选项 xff0c 想着如果不交付源代码 xff0c
  • 用TortoiseGit删除git仓库中的文件/文件夹

    用TortoiseGit删除git仓库中的文件 文件夹 点击删除后出现弹框 xff0c 点击删除 删除后会显示移除一个文件 xff1b 想要还原可以在当前文件夹中右键选择TortoiseGit gt 还原 xff08 revert xff0
  • 02-Jetson Xavier NX 训练自己的yolov4-tiny模型并利用TensorRT完成部署(Python API)

    记录原因 xff1a 因前面完成了yolov4 tiny源码的部署 xff0c 可以跑到50FPS 但那个跑的是别人的模型 xff0c 可以识别80类 xff0c 但是在特定的情况下比如识别螺丝螺帽 xff0c 只需要两种 xff0c 在训
  • RPLIDAR在ROS下快速上手教程

    本教程由 臭皮匠机器人 原创 转载请注明出处 收到一个RPLidar后 xff0c 干的第一件事应该是先让雷达跑起来 xff0c 边做边学是最高效的 之前写了一篇在windows底下的 RPLIDAR十分钟极速入门教程 xff0c 今天将教
  • RPLIDAR的坐标系问题

    本教程由 臭皮匠机器人 原创 转载请注明出处 RPLIDAR自身的坐标系 RPLIDAR给出来的数据是角度和距离 xff0c 也就是极坐标系 转换成直角坐标系的话应该照转换公式计算 xff0c 假设r是距离 xff0c theta是角度 x
  • Makefile模板(取自vscode)

    文章目录 Makefile模板vscode插件 xff1a 单一目标编译多个目标 Makefile模板 vscode插件 xff1a 单一目标 最近在学习Makefile写法 xff0c 但是总觉得自己写的太烂了 xff0c 找到了vsco
  • 使用docker-compose配置mysql数据库并且配置用户密码

    下面要求环境 xff1a 一定要安装docker ce和docker compose才能进行下面步骤 linux找到你要放mysql的目录 创建一个docker compose yml 以下配置了外部数据卷 外部配置文件 外部初始化文件 x
  • 使用ONOS的REST API来下发流表

    1 启动ONOS后 xff0c 浏览器进入doc http 10 109 247 211 8181 onos v1 docs 2 找到Flow xff0c 并打开POST 3 可以直接在这个上面编辑flow stream里面模拟GET获得的
  • 形态学处理

    原文链接 xff1a https blog csdn net qq 40732350 article details 116718329 spm 61 1001 2014 3001 5506 形态学处理 0 前言1 腐蚀与膨胀1 1 结构元