小白学习图像处理9——形态学图像处理

一、膨胀与腐蚀

1. 结构元SE

  形态学图像处理中,通常会选择一个类似空域模板的结构,称之为结构元 SE(Morphological structuring element),下图列举了四种结构元,中央的黑点表示结构元的中心结构元的中心会影响形态学处理后的结果
在这里插入图片描述
在matlab中预先定义了很多种结构元,可以自定义需要的形状,如'disk', 'square', 'diamond' 等,此外形状的相关参数如半径、边长等都可以设置
在这里插入图片描述
举个例子:

SE = strel('square', 3);
SE.Neighborhood

得到的输出如下(一个 3 x 3 的正方形结构元),也就是上面说到的第二个结构元:

ans =
     1     1     1
     1     1     1
     1     1     1

2. 腐蚀 Erosion

  用结构元B腐蚀A的定义为:
在这里插入图片描述
  即图像B移动距离z,使得B仍然包含于A的所有z构成的集合。有点绕口,简单来说,可以理解为:结构元B在图像A给定的范围内运动(B不越过边界),结构元B的中心可以到达的所有点。腐蚀会使图像整体轮廓减小,类似于一块大小为B的橡皮擦擦去了图像A边缘上的一圈。

matlab中腐蚀操作函数为:imerode(A, SE)
举个例子:用半径大小不同的圆形结构元腐蚀图片(注意线条)

A = imread('wirebond_mask.tif');
se = strel('disk', 5);	% r = 5
A2 = imerode(A, se);
se = strel('disk', 10);	% r = 10
A3 = imerode(A, se);
se = strel('disk', 20);	% r = 20
A4 = imerode(A, se);
figure
subplot(221), imshow(A)
subplot(222), imshow(A2)
subplot(223), imshow(A3)
subplot(224), imshow(A4)
set(gcf, 'color', [1 1 1])

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


3. 膨胀 Dilation

  膨胀 dilate 操作于腐蚀相反,结构元B对A的膨胀定义为:
在这里插入图片描述
膨胀操作将图像的轮廓扩大,可以理解为:结构元B在图像A外面紧贴着图像A运动,结构元扫过的面积就算图像A膨胀的面积。膨胀

matlab里膨胀函数为:imdilate(A, SE)
举个例子:

A = imread('man.tif');
se = strel('disk', 10);
A2 = imdilate(A, se);
figure
subplot(121), imshow(A)
subplot(122), imshow(A2)
set(gcf, 'color', [1 1 1])

结果如下:它膨胀了,白色区域变大了
在这里插入图片描述


二、开操作与闭操作

开操作和闭操作都是膨胀腐蚀的结合,只是膨胀腐蚀运算的先后顺序不同

1. 开操作

结构元B对A的开操作定义为:
在这里插入图片描述
先腐蚀后膨胀,可以平滑轮廓、断开较窄的缝,消除突出物 和 分开两个挨得近的物体
在这里插入图片描述
matlab里开操作为:imopen(A, SE)

2. 闭操作

结构元B对A的开操作定义为:
在这里插入图片描述
  先膨胀后腐蚀,效果与开操作相反,闭操作可以修补较窄的沟壑,消除孔洞,填补裂缝 和 衔接挨得近的两个物体。
在这里插入图片描述
matlab里闭操作为:imclose(A, SE)

举个例子:

A = imread('fingerprint.tif');
SE = strel('diamond', 1);
B = imopen(A, SE);
C = imclose(A, SE);
figure
subplot(131), imshow(A)
title('original')
subplot(132), imshow(B)
title('open')
subplot(133), imshow(C)
title('close')

效果如下:作图为原始指纹图(携带了噪声),开操作由于先腐蚀,所以可以去掉噪点,闭操作导致指纹直接产生了粘连
在这里插入图片描述


三、简单应用——数米粒

1. 思路

给出下面的图,问题:图中多少粒米?
在这里插入图片描述
问题:是不是需要用函数 im2bw 先二值化?
解答:由于图片上面白,下部分黑,直接二值化很难精准的分离背景和米粒,阈值难以选取。最好的办法是先得到背景图,用原图减去背景图得到米粒(消除背景的不均匀性),再进行二值化

问题:如果实现了米粒和背景的分离,如何计算米粒数目?
解答:可以使用 bwlabel 函数标注不同的连通分量(每一粒米所有像素点的集合就算一个连通分量),从而实现计数

步骤

  • 获取背景图,分离出米粒
  • 对图像进行二值化
  • 使用 bwlabel 函数对米粒计数

2. 程序

1、获得图像的背景,分离出米粒:

A = imread('rice.tif');
figure, subplot(221), imshow(A), title('原图')

se = strel('disk', 100);
BG = imopen(A, se);     % background
subplot(222), imshow(BG), title('背景')

B = imsubtract(A, BG);
subplot(223), imshow(B), title('原图 - 背景')

BW = im2bw(B, graythresh(B));
subplot(224), imshow(BW), title('二值化的米粒')
set(gcf, 'color', [1 1 1])

其实也可以使用函数 imtophat 一步消除背景的不均匀:

A = imread('rice.tif');
se = strel('disk', 100);
B = imtophat(A, se);   % 戴顶帽
BW = im2bw(B, graythresh(B));
figure, imshow(BW)
title('二值化的米粒')

上面两种代码效果一样,结果如下:
在这里插入图片描述
2、计算连通分量数目
  使用bwlabel函数计算连通分量的数目,返回值num就算米粒的数目,返回值L是一个矩阵,矩阵中每一个连通分量都用不同的数字标记了

[L, num] = bwlabel(BW, 8);
figure, imshow(B)
set(gcf, 'color', [1 1 1])
figure, imshow(BW)
title(strcat('Number of rice : ', num2str(num)), 'fontsize', 15)
set(gcf, 'color', [1 1 1])

效果入下,检测出81粒米:
在这里插入图片描述


完结~
以上是形态学处理的基础内容,还有一些比较复杂的形态学处理算法,后面补上🤭

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值