一、      目的

(1)    实现孔洞填充;

(2)    实现连通分量的提取并计算连通分量的个数及每个连通分量的像素数。

二、      代码思路

(1)孔洞填充:先选取十字形结构作为结构元;接着生成一个由0组成的阵列X,大小与二值图像A相同,随机选取A中一个灰度值为1的点,将X中相应位置的灰度值也设置为1;之后根据填充的公式多次迭代,直到A不再变化,就停止迭代;最后对A和X求并集则得到了填充的图像。

(2)提取连通分量:根据冈萨雷斯第三版第九章中相关公式,在知道连通分量中的一个点的情况下,迭代收敛一次只能得到原始图像A中的一个连通分量,为了得到所有的连通分量,我先用find()函数找到A中灰度值为1的点,把第一个点作为初始点,利用公式进行迭代,则得到了该点所在的连通分量,将该连通分量存储在B中,并计算B中的像素数;接着用A与B相减后作为新的A,再对A重复以上操作,则可以找到图像中的所有连通分量,并计算每个连通分量的像素数。

三、     结果分析


以上是原始二值图像以及填充后的结果,由结果可以看出,有黑点的球体都被填充了,填充效果很好。

下面是提取连通分量的结果:

左边第一幅图是提取到的第一个连通分量,而由最后的结果图,我们可以看到原始二值图像中的所有连通分量都被提取了出来,一共有17个连通分量,有5个较大的连通分量。

四、    源代码

%**************************************************%
%目的:实现孔洞填充及连通分量的提取
%日期:2018.5.24
%**************************************************%%***************** 孔洞填充 ***********************%
A = imread('region.tif');
A = im2bw(A); %二值化
figure(1);
subplot(1,2,1);
imshow(A);
title('二值化后的图');
A_ct = ~A; %A的补集
[m,n] = size(A);
X = zeros(m,n);
[k,z] = find(A==1); %找到A中灰度值为1的点的位置
X(k(1),z(1)) = 1; %选取第一个灰度值为1的点为初始点
se = [0,1,0;1,1,1;0,1,0]; %结构元
over = 0;  %判断是否迭代结束
i = 0;    %迭代次数
while(~over)i = i + 1;Xp = X;X = imdilate(X,se) & A_ct;  %膨胀后与补集求交集if X == Xp  %二者相等,迭代结束over = 1;         end
end
A = ~X | A; %求并集
subplot(1,2,2);
imshow(A);
title('填充结果');%**************** 连通分量的提取 ************************%
%直接对以上填充得到的图像进行连通分量提取
A0 = A; %原始图像
X1 = zeros(m,n);  %迭代阵列
B = zeros(m,n); %用来存储已经提取的连通分量
count = 1;   %记录提取的连通分量的个数
figure(2);
i = 1;
j = 1;
while(length(find(A==1)))[k,z] = find(A==1); %找到A中灰度值为1的点的位置 X1(k(1),z(1)) = 1; %选取第一个灰度值为1的点为初始点se = ones(3); %结构元%提取连通分量while(1)Xp1 = X1;X1 = imdilate(X1,se) & A;  %膨胀后求交集if X1 == Xp1  %二者相等,迭代结束break;        endendB = B + X1; num(count) = length(find(X1==1));count = count + 1;A = A - B; %减去已经提取的连通分量,接下来通过迭代继续对剩下的连通分量进行提取imshow(B); %动态显示每次迭代过程中提取到的各个连通区域title('各连通分量的提取过程');hold on;
end
hold off;
%显示提取到的连通分量的数目及各连通分量中的像素数
fprintf('连通分量     连通分量中的像素数\n');
for i = 1:countfprintf('%2d               %d\n',i,num(i));
end
figure(3);
subplot(1,2,1);
imshow(A0);
title('原始图像');
subplot(1,2,2);
imshow(B);
title('提取得到的所有连通分量');

孔洞填充及连通分量提取相关推荐

  1. 二值图像--形态学处理4 击中,边界提取,孔洞填充,连通分量提取,凸壳,细化,骨架,形态学重建...

    学习DIP第14天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...

  2. 【youcans 的 OpenCV 例程200篇】123. 形态算法之孔洞填充

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程 2 ...

  3. 【youcans 的 OpenCV 例程200篇】132. 形态学重建之孔洞填充算法

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...

  4. 【youcans 的 OpenCV 例程200篇】124. 孔洞填充的泛洪算法

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程 2 ...

  5. 二值图像的连通分量提取

    基本原理 初步想法:给定连通分量中的任意一点,对该点进行膨胀,用膨胀后的集合与原图像做交集,再对该交集进行膨胀,再做交集,以此类推,直至所得到的集合不再变化. 运用公式表示:              ...

  6. 图像孔洞填充与小连通域的删除

    图像孔洞填充与小连通域的删除 cvFindContours 从二值图像中检索轮廓,并返回检测到的轮廓的个数.first_contour的值由函数填充返回,它的值将为第一个外轮廓的指针,当没有轮廓被检测 ...

  7. 2D图像处理:孔洞填充

    文章目录 1. 孔洞填充 1.1 方法1:轮廓 1.2 方法2:逻辑操作 1.3 方法3:遍历单个填充目标 2 参考 1. 孔洞填充 <冈萨雷斯-数字图像处理>9.5.2节中给出的定义为: ...

  8. Python-基于OpenCV的轮廓填充 泛洪算法 孔洞填充

    左为原图 右为填充后 针对轮廓填充,我们先要提取图像中的轮廓,在对里面的进行颜色填充,这个我自己也有点分不清楚,他和阈值分割进行填充有什么区别,要是有大佬知道,分享一下,将感激不尽!轮廓填充的方法常用 ...

  9. 数字图像处理(作业三)——孔洞填充+全局阈值+自适应阈值

    一.孔洞填充 基本思想: 基于形态学算法,膨胀后与上取反的原图 算法实现步骤: 1.首先找出所有孔洞的位置,只需知道洞中的一个点的坐标即可,下面直接以改点代替该洞 2.新建一张全零图,用0表示背景,1 ...

最新文章

  1. Metaphors for a richer understanding of software development -- Code complete reading notes(2)
  2. 虚拟化技术--服务器虚拟化
  3. unity字符串换行符_unity如何在中文文本换行时实现排版换行,避免标点符号出现在行首等比较丑的情况?...
  4. ECMAScript:客户端脚本语言的标准
  5. $NOIp$前的日常
  6. corn表达式的简单使用
  7. linux压缩文件命令_Linux基础篇(二)--Linux常用命令
  8. 全网最硬核换脸技术全分析ZAO换脸App
  9. C语言:创建各类三角形图案
  10. 生活,人艰不拆,各种躺枪
  11. python3 数独解法 深度遍历
  12. 支付宝沙箱demo演示
  13. C# 判断圆与矩形的冲突
  14. 如何多人共同编辑_微信编辑器可以多人协作排版吗?
  15. 费曼技巧:一张白纸提高学习效率
  16. Java项目:JSP网上在线酒类商城系统网站
  17. Kafka 处理器客户端介绍
  18. Centos 7 无法上网的解决办法
  19. 软件测试中Bug的生命周期以及Bug的严重等级
  20. 测试开发进阶——常用中间件概念——JDBC——连接数据库理解

热门文章

  1. cdn缓存及缓存的清理
  2. 踽踽独行,你好像这世界上最孤独的灵魂
  3. JAVA宠物医院管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  4. 被称为世上最经典的25句话
  5. 毫米和像素怎么换算_图片的像素和毫米之间的换算关系
  6. Ubuntu20.10系统FreeCAD 0.19编译安装
  7. 输入某年某月然后输出当前月份的天数
  8. Android Studio 生成APK签名证书
  9. 苹果16g不够用怎么办_孩子不够自信怎么办?父母学会用这4个方法,孩子长大更优秀自信...
  10. 使用vi编辑器编辑一个C语言源程序hello.c,并使用编译工具GCC编译该源程序。