【计算机视觉】图像增强——图像的形态学操作

article/2025/5/15 8:47:16

8420b26844034fab91b6df661ae68671.png

个人简介: 

> 📦个人主页:赵四司机
> 🏆学习方向:JAVA后端开发 
> ⏰往期文章:SpringBoot项目整合微信支付
> 🔔博主推荐网站:牛客网 刷题|面试|找工作神器
> 📣种一棵树最好的时间是十年前,其次是现在!
> 💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

前言:

通过这篇文章你将了解到常见的数学形态学运算基本方法,了解腐蚀、膨胀、开运算、闭运算取得的效果,培养处理实际图像的能力。 

目录

一:相关公式

二:相关原理

1.膨胀操作

2.腐蚀操作

3.相关性质

4.开运算

5.闭运算

6.开闭运算示例

三:代码实现

1.图像膨胀

2.图像腐蚀

3.膨胀与腐蚀的综合使用  

方法一:先腐蚀(imerode),再膨胀(imdilate)

方法二:使用形态开启函数(imopen)


一:相关公式

二:相关原理

1.膨胀操作

        用结构元进行膨胀运算可以描述为: 结构元的原点像素经过待膨胀的二值图像中所有1像素点时,对应结构元所有1像素的二值图像像素置为1像素。

示例如下:

(a) 集合A;     (b) 结构元素B(“+”为原点);   (c) 结构元素B的映像; (d) 图中两种阴影部分(深色为扩大的部分)合起来为集合A⊕B 

图像膨胀可以应用于将带有间断字符的文本连接起来从而使文本变清晰,如下图:

2.腐蚀操作

        用结构元进行腐蚀运算可以描述为: 结构元的原点像素经过待腐蚀的二值图像中所有1像素点时,如果结构元中有一个1像素没有对应待腐蚀二值图像的1像素,则对应结构元原点的待腐蚀二值图像1像素置为0。

示例如下:

(a) 集合  A (阴影部分);(b) 结构元素 B(阴影部分,“+”为原点); (c) 图中深色阴影部分给出A⊙B(浅色为原属于 A,先腐蚀掉的部分) 

利用腐蚀操作我们可以去除图像中比较小的图形,如下图:

3.相关性质

  • 用B 来膨胀A得到的集合是 B 的位移与A 至少有一个非零元素相交时B 的原点位置的集合。
  • A用B来腐蚀的结果:B 完全包含在A中时B 的原点位置的集合。
  • 膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。
  • 腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。 一个运算对图像目标的操作相当于另一个运算对图像背景的操作。 

4.开运算

去除比结构元小的区域像素,表现为用同一结构元先腐蚀后膨胀。 

5.闭运算

 填充比结构元小的孔洞,变现为用同一结构元膨胀后再腐蚀。

6.开闭运算示例

图1是结构元A,图2到5是开运算,图6到9是闭运算。

三:代码实现

1.图像膨胀

a)对包含矩形对象的二进制图像进行膨胀操作。

BW=zeros(9,10);

BW(4:6,4:7)=1;

imshow(BW,'InitialMagnification','fit')

图3.5.1-1 膨胀前矩阵 

se=strel('square',3);

BW2=imdilate(BW,se);

figure,imshow(BW2,'InitialMagnification','fit')

图3.5.1-2 膨胀后的矩阵

        首先创建一个9*10的矩阵,并且在中央填充1,随后用strel函数生成结构元素对象,strel函数的原型为SE = strel(shape,parameters),shape表示创建指定形状的结构元素,在这里创建的shape为”square”,parameters为3,表示创建一个3*3的正方形。随后用imdilate函数对图像进行膨胀处理,处理的输入图像为BW,结构元素对象为se。膨胀操作选定模板后计算模板内的有效最大值,然后替换模板中心点,膨胀后灰度值变高,图像的白色明亮部分变多。

b)改变上述结构元素类型(如:line, diamond, disk等),重新进行膨胀操作。

Line: BW=zeros(9,10);

BW(4:6,4:7)=1;

imshow(BW,'notruesize')

图3.5.1-3 原始矩阵

se=strel('disk',3,0);  

BW2=imdilate(BW,se);

figure,imshow(BW2,'notruesize')

图3.5.1-4 膨胀后的矩阵(disk类型)

        改变结构元素的形状为disk类型,该类型结构元素要求有两个参数,函数原型为SE = strel('disk',R,N),其中R表示圆盘的半径大小,其值必须为正整数,N取值只能为0、4、6或8,当N大于0时,圆盘形结构元素由一组N(或N+2)个周期线型结构元素来近似。当N等于0时,不使用近似,即结构元素的所有像素是由到中心像素距离小于等于R的像素组成。N也可以不填,此时N默认为4。图像膨胀的操作也可以理解为在图像边缘添加像素值的操作,具体操作为用结构元素的中心点对准当前正在遍历的这个像素,然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最大值,用这个最大值替换当前像素值,给图像中的对象边界添加像素,使二值图像扩大一圈。

由于我选取的结构元素为圆形,所以膨胀操作向四周呈圆状膨胀。

c)对图像‘text.png’(系统自带图像可以直接读取)进行上述操作,观察不同结构元素膨胀的效果。

image = imread('text.png');

figure,imshow(image,'InitialMagnification','fit');

图3.5.1-5 text图像

se = strel('square',3);

BW3 = imdilate(image,se);

figure,imshow(BW3,'InitialMagnification','fit');

图3.5.1-6 膨胀后的图像(square类型)

se=strel('disk',3.0,0);         

BW4=imdilate(image,se);

figure,imshow(BW4,'InitialMagnification','fit')

图3.5.1-7 膨胀后的图像(disk类型)

        可以看到,不同的结构元素得到的膨胀结果是不同的,这是因为其膨胀方向不一样,且与结构元素的大小有关。

2.图像腐蚀

a) 对图像‘circbw.tif’(系统自带图像可以直接读取)进行腐蚀操作。

BW1=imread('circbw.tif');

se=strel('arbitrary',eye(5));

BW2=imerode(BW1,se);

figure,subplot(121),imshow(BW1),title('腐蚀前');

subplot(122),imshow(BW2),title('腐蚀后');

图3.5.2-1 图像腐蚀对比

        图像腐蚀函数为imerode(),操作为用结构元素的中心点对准当前正在遍历的这个像素,然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最小值,用这个最小值替换当前像素值,删除对象边界的某些像素,使二值图像减小一圈。由于实验图像是二值图像,所以可以看到消去的部分变成了黑色(灰度值为0)。

b) 对图像‘text.tif’进行腐蚀操作。

BW=imread('text.png');

se=strel('line',11,90);

BW2=imerode(BW,se);

figure,subplot(121),imshow(BW),title('腐蚀前');

subplot(122),imshow(BW2),title('腐蚀后');

图3.5.2-2 text图像腐蚀前后对比

        由于text.png图像大部分都是灰度值为0的区域,所以对其进行腐蚀会造成很大的消去面积(见图3.5.2-2),可见大部分面积都变成了黑色。

3.膨胀与腐蚀的综合使用  

a) 从原始图像‘circbw.tif’中删除电流线,仅保留芯片对象。

方法一:先腐蚀(imerode),再膨胀(imdilate)

BW1=imread('circbw.tif');

imshow(BW1)

se=strel('rectangle',[40 30]); %选择适当大小的矩形结构元素

BW2=imerode(BW1,se);    %先腐蚀,删除较细的直线

figure,imshow(BW2)

BW3=imdilate(BW2,se);   %再膨胀,恢复矩形的大小

figure,imshow(BW3)

图3.5.3-1 图像膨胀与腐蚀应用(方法一)

        前面提到,图像的腐蚀和膨胀都是对图像的边缘部分进行像素值的改变,由于circbw图像的电流大部分都是细小的线路,可以考虑用图像的腐蚀来消去,从而保留面积较大的芯片部分,然而腐蚀操作会对图像的所有边缘进行消去,也就意味着芯片部分的边缘部分也会被消去,所以还要用膨胀操作来进行恢复,以恢复芯片原来被腐蚀的部分。这里考虑用长方形或正方形的结构元素比较适合,因为原始图像的像素分布呈方形分布。

方法二:使用形态开启函数(imopen)

BW1=imread('circbw.tif');

imshow(BW1)

se=strel('rectangle',[30,20]);

BW2=imopen(BW1,se);      %开启操作

figure,imshow(BW2)

图3.5.3-2 图像膨胀与腐蚀应用(方法二)

图3.5.3-3 与方法一参数相同进行开运算结果

        开运算本质上也是对图像进行了腐蚀膨胀操作,其函数原型为IM2 = imopen(IM,SE/NHOOD),作用对象为灰度图像或二值图像,使用方法和imerode类似,也需要结构元素和作用对象,使用开运算可以平滑图像轮廓,消除图像狭窄细小部分,从而达到去除电流的目的(见图3.5.3-2)。可以看到也能达到去除电流的目的,但是既然说其原理是先腐蚀后膨胀,得到的结果应该和方法一是一样的,现在得到的结果不同是因为结构元素的参数不同,修改其参数和方法一一样,得到的结果和方法一的结果基本一致(见图3.5.3-3)。

b)改变结构元素的大小,重新进行开启操作,观察处理结果。

se=strel(‘rectangle’,[20 10]);

BW2=imopen(BW1,se);             %开启操作

figure,imshow(BW2);

图3.5.3-4 改变结构元素大小测试1

se=strel(‘rectangle’,[50 40]);

BW2=imopen(BW1,se);             %开启操作

figure,imshow(BW2);

图3.5.3-5 改变结构元素大小测试2

前面说到图像开启操作可以消去细线和平滑图像边缘,当结构元素的面积较大时,消去作用较明显,反之消去作用则较小(见图3.5.3-4及3.5.3-5)。

c)置结构元素大小为[4 3],同时观察形态开启(imopen)与闭合(imclose)的效果,总结形态开启与闭合在图像处理中的作用。

I=imread('circbw.tif');

imshow(I)

se=strel('rectangle',[4 3]);

I1=imopen(I,se);      %开启操作

I2=imclose(I,se);     %闭合操作

figure,imshow(I1)

figure,imshow(I2)

图3.5.3-6 形态开启与闭合结果

        形态开启操作可以平滑图像的边缘,消去细小狭窄的线条以及去除独立小点;而形态闭合操作则是先膨胀后腐蚀,可以看到闭合操作之后的白色部分面积变大了,且边缘也更平滑,说明闭合操作也可以起到平滑图像边缘的作用,且还能连接短缺的地方,融合窄的缺口,去掉小洞。


http://chatgpt.dhexx.cn/article/JTHSos2j.shtml

相关文章

数字图像处理实验(七)| 形态学图像处理{生成结构元素strel、腐蚀运算imerode、膨胀运算imdilate、开运算imopen、闭运算imclose}(附代码和实验截图、汉字视力表项目、总结)

文章目录 一、实验目的二、实验仪器三、实验原理1. 结构元素:2. 腐蚀运算:3. 膨胀运算:4. 开运算:5. 闭运算: 四、实验内容:1. 形态学图像处理用于图像边界提取2.数学形态学用于图像的噪点去除(…

【2】MATLAB中strel('disk',r)的C实现

strel 是MATLAB中常用的类型,即是structuring element,用来构建结构元素。opencv中与其相似的函数是getStructuringElement()这个函数。 这里仅仅说是相似主要是因为两者还是有很多区别的。 getStructuringElement()可以获取常用的结构元素的形状&…

matlab strel详解,【2】MATLAB中strel('disk',r)的C實現

strel 是MATLAB中常用的類型,即是structuring element,用來構建結構元素。opencv中與其相似的函數是getStructuringElement()這個函數。 這里僅僅說是相似主要是因為兩者還是有很多區別的。 getStructuringElement()可以獲取常用的結構元素的形狀&#x…

matlab strel结构元素,【matlab】Strel函数--结构元素

###Date:2018.3.28 =========================================================================== Strel函数 主要用来构建形态学运算中的结构元素,使用的语法为strel(shape,parameters)。shape为形状参数,即设置什么样的结构元素;parameters为控制形状参数大小方向的参数…

Strel函数--结构元素

Strel函数 主要用来构建形态学运算中的结构元素,使用的语法为strel(shape,parameters)。shape为形状参数,即设置什么样的结构元素;parameters为控制形状参数大小方向的参数。 例: 建立一个负向45,长度为6的结构元素…

strel

文章目录 SyntaxDescriptionExamplesAlgorithms 形态结构要素 strel代表平坦的形态构造元素,这是形态扩张和侵蚀操作的重要组成部分。 平面结构元素是二维或二维的二进制值邻域,其中在形态计算中包含真实像素,而不包含错误像素。 结构元素的中…

图像处理函数——strel、roipoly、roifilt2、roifill

文章目录 1.strel2.roipoly3.roifilt24.roifill 1.strel 功能: 形态学结构元素,strel 对象表示一个平面形态学结构元素,该元素是形态学膨胀和腐蚀运算的重要部分。 语法: SE strel(shape, parameters) 创建一个结构元素对象SE。…

nginx日志配置,以及日志轮询

一、为nginx配置错误日志 Nginx错误日志是调试nginx的重要手段,属于核心功能模块的参数(ngx_core_module)该参数名字为err_log,是放在Main区块中全局配置 err_log的语法格式以及参数语法说明如下 err_log file lev…

nginx配置日志记录问题

去掉nginx.conf文件里面的llog_format main注释并修改为如下 log_format main $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"|&quo…

nginx服务器网站日志,nginx网站日志配置

nginx网站日志配置 [2020-09-10 10:47:43] 简介: 建站服务器 1、日志介绍nginx有两种日志,一种是访问日志,一种是错误日志。访问日志中记录的是客户端对服务器的所有请求。错误日志中记录的 建站服务器 ELK系统在安装完成后需要处理相关的日志文件&…

Linux Nginx日志——Nginx日志配置 access_log error_log rewrite_log 日志轮转

1、Nginx 日志介绍 Nginx 每个级别的配置都可以有独立的访问日志, 所需日志模块 ngx_http_log_module 的支持,日志格式通过 log_format 命令来定义,日志对于统计和排错是有利的。 nginx 日志相关的配置包括 access_log、rewrite_log、error_log# 设置访…

【Nginx 日志配置】【访问日志log_format】【错误日志error_log 指令】【Nginx的日志轮转】

文章目录 Nginx 日志配置log_format 指令中常用的一些变量:访问日志 案例可以配置段:http, stream, server, location作用域。error_log 指令 错误访问日志 级别rewrite_log 指令 用户跳转日志 一般不用配置流量控制相关功能配置日志记录 Nginx 日志配置…

关于nginx日志配置指令介绍

本文主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下 日志对于统计排错来说非常有利的。本文总结了nginx日志相关的配置如access_log、log_format、open_log_file_cache、log_not_found、lo…

宝塔自定义nginx访问日志配置

nginx日志自定义配置 问题 有时nginx默认的日志满足不了需求,比如网站绑定了多个域名,想知道用于访问的是具体域名,这时候就需要自定义nginx日志了。 nginx 中access log 记录了用户访问的页面以及用户浏览器、ip和其他的访问信息 log_for…

Nginx日志配置、错误界面配置、流量控制 第九天

目录 nginx日志配置 nginx日志介绍 access.log error.log open_log_file_cache rewrite.log nginx的日志轮转 nginx错误界面配置 nginx流量控制 nginx如何限流 配置基本限流 nginx流量限制(高级) 流量控制相关功能 nginx日志配置 nginx日志…

运维配置:Nginx日志配置详解

Nginx日志配置详解 前言 Nginx日志对于统计、系统服务排错很有用。Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志)。通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。错误日志记录了访问出错的信息&…

nginx日志[配置解释]

经常使用nginx,但是对nginx中的日志配置了解的不多,最近简单的学习了一下,在此简略的记录下。 nginx基础配置如下: user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/ngi…

后端实践:Nginx日志配置(超详细)

前言 Nginx日志对于统计、系统服务排错很有用。 Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志)。通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。错误日志记录了访问出错的信息,可以帮助我…

Linux下玩转nginx系列(三)---nginx日志配置文件说明

nginx日志共三个参数。 access_log: 定义日志的路径及格式。 log_format: 定义日志的模板。 open_log_file_cache: 定义日志文件缓存。 nginx access日志配置 access_log日志配置 access_log用来定义日志级别,日志位置。语法如下: 日志级别&#x…

Linux中级实战专题篇三:nginx服务(日志介绍,作用域,格式定义,流量控制,访问控制模块,用户信任登录)

Nginx 日志配置 1、Nginx 日志介绍 Nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的支持,日志格式通过 log_format 命令来定义,日志对于统计和排错是非常有利的,下面总结…