文档章节

二值图像中封闭孔洞的高效填充算法(附源码)。

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:38
字数 1305
阅读 15
收藏 0
点赞 0
评论 0

  写具体类容之前先吐槽一下。

     我一直写技术文档,虽然水平不怎么样,但是基本上我写的都还是比较实际的东西,也是自己投入了很多精力做的东西。有些可能没有开源,有些人觉得对他没有什么帮助,而我认为真正做技术的有能力的对于业内的东西,面对没有处理过的问题,只要有人随便点拨一下,基本上就能够找到解决方案,授人以渔而非授人以鱼才是重点。不过我心里不平衡的一点就是,无论是在CSDN还是博客园,得到人们参与评价和推荐的最多的很少有纯技术性的文章出现,像我这样从不写些八卦的东西的,觉得很是失望。

     不排除我写的东西比较浅显,或者用词不合适,不能满足读者的口味,不过还是希望博客园及广大的博主能对技术性的博文多一份关心、多一份支持。

     鉴于心情不好,这篇文章只是简单的说说这个算法的过程。

     在对图像二值化后,不管用的是什么二值算法,总会存在一些瑕疵,这个时候我们就需要进行一些列的处理,去除那些我们不想要的糟粕,这类方法其实有很多,比如去除孤点、去除孤枝等等,这里介绍下去除封闭孔洞的一种算法。

     首先,注意我们这里是去除封闭孔洞,何谓封闭孔洞?我们认为如果一个特征的边缘完全被另外一个特征包围,则认为其为一个封闭的特征,比如在下图中:

                                                

     1所标注处就是封闭的孔洞,2所标注极为开式孔洞。

     对于识别来说,很多情况下,我们希望能够把这些封闭孔洞用周边的特征来填充,从而减少特征的数量。

     一种直觉的想法就是,用FloodFill,不过如果直接用FloodFill,我们无法直接定位那些未知需要进行种子填充的, 但是Gabriel Landini, G.Landini 在2008年5月给我们写了个非常简单的代码实现了这一过程(原始代码是JAVA的,话说JAVA的算法代码改为C#基本就不要做什么改动啊):

    public static void FillHole(FastBitmap Bmp)
    {
        int X, Y;
        int Width,Height,Stride;
        byte * Pointer;
        Width = Bmp.Width; Height = Bmp.Height; Pointer = Bmp.Pointer; Stride = Bmp.Stride;
        for (Y=0;Y<Height;Y++)
        {
            Pointer=Bmp.Pointer + Y*Stride;
            if (Pointer[0]==0) FloodFill(Bmp,0,Y);
            if (Pointer[Width-1]==0) FloodFill(Bmp,Width-1,Y);
        }
        for (X=0;X<Width;X++)
        {
            Pointer=Bmp.Pointer + X;
            if (Pointer[0]==0) FloodFill(Bmp,X,0);
            if (Pointer[(Height-1)*Stride]==0) FloodFill(Bmp,X,Height-1);
        }
            for (Y = 0; Y < Height; Y++)
            {
                Pointer = Bmp.Pointer + Y * Stride;
                for (X = 0; X < Width; X++)
                {
                    if (Pointer[X] == 127)
                        Pointer[X] = 0;
                    else
                        Pointer[X] = 255;
                }
            }
      }

 

     算法的过程很简单,先水平方向取起点和终点为种子点,进行种子填充,然后再垂直方向进行。不要以为需要有那么多次种子填充的过程,算法速度就很慢,由于在每次种子填充前,都有个判断条件,而该判断条件,随着前面种子填充的过程的进行,将越来越难以满足。
     算法具体的原理留给有兴趣的人思考,直接使用的人就完全不用去管他,知道他有这个功能就OK了。

     关于FloodFill算法的实现,多少年来也不知道有多少个版本的代码,能从网上找到的99%的都是些垃圾代码,真正的优秀代码作者一般都会留着,我这也是从网上找了一段代码,敷衍了事把,虽然我这里有非常好的这个函数。愿意学习的自然会去改进的。

     下面我们来看一下填充的效果:

           

                      原图                        二值图                           填充后的图    

     至于是要填充掉前景的孔洞还是背景的孔洞这可能需要作者自己判断了。

     如果我们要去掉指定面积小于指定值得孔洞,而保留大于的,你知道该怎么办吗?

     关于FloodFill函数,我在稍微展开一下吧,一般情况下这个函数都是用的四领域或者八领域的区域生长法实现的,如果能充分掌握该函数的编写,可以实现很多功能,比如PS的连续的魔术棒功能、比如二值图像的去除噪点、漫画分割、一些识别上等等,举例如下:

    一、连续的魔术棒

          

    

    二、清除二值图像的孤点

   

  是不是感觉和这里的填充孔洞类似,不过两者还是有所区别的。

    三、PCB板的某个元器件的定位                          

      

 

    好了,不扩展了,对填充孔洞有兴趣的朋友可以从这里下载源码:http://files.cnblogs.com/Imageshop/FillHole.rar

  希望看过认为好的朋友多多支持。 

 

*********************************作者: laviewpbt   时间: 2013.9.8       联系QQ:  33184777  转载请保留本行信息************************

本文转载自:http://www.cnblogs.com/Imageshop/p/3308183.html

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
【工具使用系列】关于 MATLAB 形态学,你需要知道的事

如何进行图像操作 二值形态学基本运算 膨胀和腐蚀 膨胀 腐蚀 膨胀与腐蚀的结合 膨胀与腐蚀的对偶性 开启和闭合 击中或击不中变换 二值形态学图像处理 噪声滤除 边界提取 对象编著 图像的特性...

AllenMoore
01/27
0
0
基于数字图像处理的小目标计数(二)

存在接壤现象的细胞计数 因为前面(一)的中的图片每个波点之间间隔较小,这边的细胞图中存在多个目标接壤问题,所以怎样在存在接壤现象的细胞中准确数出个数是这里较前面不同的地方。 解决思...

u010030977
04/18
0
0
opencv腐蚀、膨胀、开闭运算

腐蚀和膨胀是最基本的形态学运算。 腐蚀和膨胀是针对白色部分(高亮部分)而言的。 膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食...

qq_30339595
03/22
0
0
膨胀、腐蚀、开、闭运算——数字图像处理中的形态学

膨胀、腐蚀、开、闭运算是数学形态学最基本的变换。 本文主要针对二值图像的形态学 膨胀:把二值图像各1像素连接成分的边界扩大一层(填充边缘或0像素内部的孔); 腐蚀:把二值图像各1像素连...

xiachong27
05/23
0
0
Canny算法解析,opencv源码实现及实例

-----------------Canny算法原理部分----------------- Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。 Canny边缘检测基本原理:(1)图象边缘检测必须满足两个...

piaoxuezhong
2017/04/12
0
0
灰度图像的阈值化

通过对灰度图像二值化处理,能够凸现出感兴趣目标的轮廓. 灰度图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适...

文艺小青年
2017/07/06
0
0
图像处理——形态学

形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建。 基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换 几种算法进行组合,就可以实现一些非常复杂的功...

li_wen01
2017/06/05
0
0
Python进阶(四十四)-Python3实现基于PHA实现图像配准

Python进阶(四十四)-Python3实现基于PHA实现图像配准 前言   在博文《Java进阶(五十七)-基于感知哈希算法的图像配准》中使用Java语言实现了基于“感知哈希算法”的改进版pHash算法图像匹配...

sunhuaqiang1
2017/04/20
0
0
HTML5 Canvas 属性、定义及方法

当你创建一个<canvas>元素后,就拥有了它的绘图上下文。 一、简单图形,整套的属性和方法专门用于绘制矩形: 1、fillStyle可以设置为CSS颜色、一个图案或一种颜色渐变。fillStyle默认是纯黑色...

程明卫
2011/04/01
0
0
OpenCV学习笔记-分水岭算法

二、代码 0,255, cv.THRESHBINARY | cv.THRESHOTSU) 'thresh', thresh) #去噪声 blurred = cv.pyrMeanShiftFiltering(img,10,100) kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)......

qq_36387683
05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

TensorFlow,从一个 Android Demo 开始

TensorFlow Android Demo 项目地址 Machine Learning 既然提到了 TensorFlow,那是不是得神经网络、机器学习了解下? 如果你能坚持把 机器学习速成课程 给啃完了,觉得还挺有兴趣的,那可以考...

孟飞阳
3分钟前
0
0
Confluence 6 安装一个语言组件

Confluence 捆绑了一系列的语言包。这些语言包在 'Language Configuration' 界面中的语言选项中。在 Confluence 的管理员控制台,你可以选择 Choosing a Default Language 和为用户设置(Edi...

honeymose
4分钟前
0
0
JVM学习笔记二:内存结构规范

1、JVM基本结构图 2、java堆(Heap) 3、方法区(Method Area) 4、程序计数器 5、JAVA栈图解 局部变量表:八大基本类型,还可以存储引用类型

刘祖鹏
9分钟前
0
0
mui集成微信H5支付(返回白屏问题已经解决)

一.项目需求 因为公司人员缺少,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中需要在用户购买VIP会员的时候进行支付,所以需要在项目...

银装素裹
12分钟前
0
0
TensorFlow gpu 版 安装

win10 + Python3.6 下载cuda https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=81&target_type=exelocal 下载cudnn,复制链接地址,使用迅......

阿豪boy
31分钟前
0
0
SpringBoot集成Redis--配置自定义的RedisCacheManager

配置自定义的RedisCacheManager--1自定义键生成规则 默认的键生成器 当不指定缓存的key时,SpringBoot会使用SimpleKeyGenerator生成key。 SimpleKeyGenerator SimpleKey 查看源码可以发现,它...

karma123
32分钟前
0
0
防火墙未来的发展趋势在哪里?

导读 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网。当下互联网时代,无论是大小企业,大部分都会部署有防火墙的设备,但这些防火墙往往并不...

问题终结者
34分钟前
0
0
MongoDB 副本集 成员节点 RECOVERING 状态处理

这两天遇到好几个MongoDB集群故障,其中一种就是节点长期处于 RECOVERING 状态,并且不能主动追上 primary 节点,需要手动干预。 首先 rs.status()查看实例状态,发现有的节点处于 RECOVERI...

xxj123gogo
40分钟前
0
0
建造者/构造者模式

在建造者模式中, 有如下4个角色: ● Product产品类 通常是实现了模板方法模式, 也就是有模板方法和基本方法, 这个参考第10章的模板方 法模式。 例子中的BenzModel和BMWModel就属于产品类...

kim_o
42分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部