前面说到,要使用Labwindows + NI Vision(IMAQ Vision)这套商用开发框架来做数图课设。很明显,这套虚拟仪器开发平台由NI Instrument(美国国家仪器公司)开发的。大名鼎鼎的Labview软件就是这个公司开发的。相比较而言,Labwindows使用ANSI C开发,但应用场景是差不多的。
在做课程作业的时候,遇到了一个很有趣的应用。输入是米粒,比背景灰度要低,目的是输出米粒的颗数、面积、周长和孔数,这是工业上的一个很常见的应用。具体处理过程是二值化后使用低通滤波,并计算各种性质。
界面设计如下,可以看到米粒的详细情况。
让我感兴趣的,是通过怎样的算法能够得到米粒的数量?之前曾经用过亏隐尺OpenCV中找最大外界矩形这个函数,但没有具体了解算法实现。直觉告诉我原理应该是相似的。
可以看到,每一个米粒之间都是不连通的。这里就就提出了一个概念。 连通区域(Connected Component) 是指图像中相邻并有相同像素值的图像区域。 连通区域分析(Connected Component Analysis,Connected Component Labeling) 是指将图像中的各个连通区域找出并标记。
二值图像分析最重要的方法就是连通区域标记,它是所有二值图像分析的基础,它通过对二值图像中白色像素(目标)的标记,让每个单独的连通区域形成一个被携仔标识的块,进一步的我们就可以获取这些块的轮廓、外接矩形、质心、不变矩等几何参数销高。如果要得到米粒的数量,那么通过连通区域分析(这里是二值图像的连通区域分析),就可以得到标记的数量,从而得到米粒的数量。
下面这幅图中,如果考虑4邻接,则有3个连通区域,8邻接则是2个。
从连通区域的定义可以知道,一个连通区域是由具有相同像素值的相邻像素组成像素集合,因此,我们就可以通过这两个条件在图像中寻找连通区域,对于找到的每个连通区域,我们赋予其一个唯一的 标识(Label) ,以区别其他连通区域。
连通区域分析的基本算法有两种:1)Two-Pass两便扫描法 2)Seed-Filling种子填充法 。
两遍扫描法(Two-Pass),正如其名,指的就是通过扫描两遍图像,就可以将图像中存在的所有连通区域找出并标记。
说了一堆数学语言,其实用图很好理解
种子填充方法来源于计算机图形学,常用于对某个图形进行填充。它基于区域生长算法。至于区域生长算法是什么,可以参照我的这篇 文章 。
同样的,上动图
NI Vision 中的算子定义如下
OpenCV中也有相应的算子
这里参照其他博客实现一下Two-Pass算法,Seed-Filling算法就偷懒不搞了。
Reference:
OpenCV实现图像连通组件标记与分析
OpenCV-二值图像连通域分析
数字图像处理技术 ——邓继忠(我的任课老师)
可用sobel算腔腔子提取图像的边界。具体拍圆宏的Matlab程序可为:
I=imread('bonemarr.tif')
[BW1,th1]=edge(I,'sobel',0.07)
th1str=num2str(th1)
imshow(I)
title('图1:bonemarr.tif原图','fontsize',14,'position',[128,260,0])
figureimshow(BW1)
ti='图8: sobel算子提取的边界,阈值为'
ti=strcat(ti,th1str)
title(ti,'fontsize',12,'position'袭册,[128,260,0])
图像虽好,盘子太大啊。以前一直对用的算法不太满意,前天晚上居然发现以前算法里面的一个错误。可惜这是我最得意自认为最完美的算法,结果盯着看了十来个胡裂小时也没有发现算法的漏 洞,但结果就是不对。最终还是没有找出自己算法的bug,无奈之下换了一个很简单的算法,虽然速度慢不那么精确但基本够用-_-show一下我的处理结果,嘿嘿。基本樱清驱除所有的其他区域,真是干净啊。识别率也有快100%了。并且不需要用户调整任何参数。我就非常暴力地隐藏了所有参数,鲁棒性似乎还很高。不管了,用户说要傻瓜化的,这下够傻瓜了。目的就是识别我贴在电梯限速器试验台上的四个标志,求四个标志之间连线的锐角(夹角随着速度而变化),目的就是求出张角随速度的变化规律。限速器在以一定的加脊做前速度旋转,图像是通过旋转编码器的脉冲控制外触发来进行图像采集的。最快大约200fps。限速器节圆速度大约最快2m/s欢迎分享,转载请注明来源:内存溢出
评论列表(0条)