石鑫华视觉论坛

 找回密码
 注册会员
查看: 1337|回复: 0

[有偿] LabVIEW Vision矩阵粒子排序及空点判断标记

[复制链接]
  • TA的每日心情
    擦汗
    15 小时前
  • 签到天数: 3382 天

    连续签到: 4 天

    [LV.Master]2000FPS

     楼主| 发表于 2022-7-21 16:34:06 | 显示全部楼层 |阅读模式 来自:广东省东莞市 电信

    注册登陆后可查看附件和大图,以及购买相关内容

    您需要 登录 才可以下载或查看,没有账号?注册会员

    x
    LabVIEW Vision矩阵粒子排序及空点判断标记
    在实际的机器视觉检测项目中,可能会遇到一些矩阵式的点阵排序问题,以及哪个位置是否有空点的判断并标识出来的问题。例如说,LED光源厂家,制造的面光源、条形光源等,一般都是标准的矩阵式的,多少行多少列的LED颗粒,然后要去检测这些灯珠是否都亮了。如果有没有亮的,则要标记出不亮的位置,然后供维修人员维修处理。另外还有一些贴纸、标签产品,也是这种阵列式的,中间也许会有遗失相应的点阵。
    image1.png
    条形光源的LED灯珠矩阵
             上图就是一个机器视觉行业比较常见的条形光源的LED灯珠矩阵,可以看到上图的光源是7行、21列。
    image2.png
    有一行有7颗死灯不亮的情况
             如上图所示,条形光源则有一串灯死灯,共有7颗,是第三排的1~7号灯。那么我们要检测出来这个光源的死灯数量以及相应的NG位置。这个要求,就是本“粒子排序”算法要解决的问题。
    使用NI Vision来做这样的图像处理,一般是使用粒子分析来判断。如果只是简单的判断有没有足够的灯亮,那么通过粒子分析的粒子数量就可以了,如上图是21*7=147颗灯,没有达到这个数量,就是NG的。但是,如果还要标记出NG在什么位置,即要得到灯的行、列坐标,那么通过现有的粒子分析是解决不了的。通过粒子分析,能得到粒子的中心坐标、面积、外接矩形等一系列参数。但是,粒子分析的结果是一个二维数组,一行一个粒子的结果,这个结果的列数是可选的,如果只输出中心坐标,那这一行,就只有x和y两个值。但是这个二维数组结果,只能按照X和Y进行排序,并不能以点坐标的簇方式返回坐标点的行列矩阵方式(点簇的二维数组)。
             当然,要做粒子排序,肯定还是要先使用粒子分析,得到粒子相应的X、Y坐标表示的二维数组,然后利用这个二维数组,来做判断。如果灯的数量比较少,而且是固定的,那么判断起来也简单,直接限定每个灯的坐标范围即可,允许有一定的偏移,但是也不会有太大的偏移范围。但是,当检测的数量比较多时,就不容易去一个个设置了;而又当被测产品的数量不固定,那更不能使用这样的方法来判断;而如果产品在视野里还是偏移的,也不能使用这样的方法来处理,灵活性太差了。
             这里我们需要使用数学中的组距概念来处理这些数据。组距是指每组数据的最高值和最低值之间的差。假如说,我们的被测产品在图像中基本是水平或垂直的(可以有一定的旋转角度,但是不能太大,一行的一端的,不能与下一行的另一端有重叠或比较接近),这个要求是很容易满足的,即使是在传送带上,也可以通过限位的方式来摆正产品。当然,即使产品不正,其实也没有关系,可以先对产品判断角度方向,如果超过要求的角度,可以旋转图像,将采集的图像旋转成水平后再进行测量分析。就如上面的图像中的灯珠,其中的一行灯,我们认为是一组,那么这一组灯的Y坐标其实是比较一致的,这一行的组距也是比较小的(如果旋转角度很大时,则组距变大),与另一行之间的行距比较,则可能是一个非常小的值(旋转较大时,组距变大,则会接近行距甚至超过行距,这时无法准确判断是否是同一行,要求先旋转产品为水平方向),我们就可以利用这个组距和行距来判断检测到的灯珠是不是同一行的。
             对于上面的图像,既可以按行来排序,也可以按列来排序,效果上是一样的。而行、列也可以通过转置的方式转换得到,所以问题不大。在本粒子排序算法中,是按行来排序的。即,先对粒子分析的结果按Y坐标来排序然后判断每个粒子的Y和其后一个粒子的Y的组距是不是在范围内,如果是则认为这个粒子和下一个粒子不用分组。如果不在范围内,则认为下一个粒子应该分组。这样就可以将得到的数组分割成多行表示的点坐标。当然,如果只是排序成点坐标的二维坐标方式,那么这样其实就可以了。但如果还要对NG产品进行标记,那么就还要判断列方向的数据。当然,也可以同样的按照列方向再重新排一次序,这样可以利用两个矩阵之间的重叠情况做一些判断(这里作者没想明白该如何判断,如果只是少一个,例如说第三行、第二列的少了,那么第三行的数量会少一个,第二列的数量也会少一个。但是,如果说有多个缺陷时,例如说第三行、第五行都少了一个,而第二列、第四列也都少了一个,那么第三行少的那个,到底是第二列的,还是第四列的,第五行少的那个是第四列的,还是第二列的,其实有一些组合关系的,并不能准确的判断出相应的具体位置)。所以,在这里作者没有再对X进行上述类Y方向的排序,而是直接判断Y分组行,每行数据其X之间的关系,例如说,两个邻近的X之间,其差值,应该是接近于列间距的。而如果空一格,那两个粒子之间的X差值,应该是接近2倍列间距的;空两个,则接近于3倍列间距……利用这个两个粒子之间的距离与列间距的比值-1,得到这两个粒子之间有空多少个粒子。这样就可以判断出来当前行粒子之间的空缺关系,然后再分别判断一下首尾的空缺情况(首尾可以与矩阵的最小最大值判断),即可判断出当前行所有的空缺情况。在这里,有一种特殊情况,是不好判断的,即少了一整行/列的情况(或N行M列)。少了一整行或列的话,则这一行或列都没有数据,无法借助其它数据参考。只能判断出来当前的矩阵少了N行或M列,但是到底是左、顶、右、底哪个位置少了,那就无从判断。除非是固定产品位置的(或者是有其它参考点,可以判断位置关系的),那可以通过坐标来判断,是哪边有少,否则无法判断是哪里少了行或列。
             通过这样的方法,就可以判断出一列需要什么位置插入空数据(NaN或0、或无穷大之类的,与其它正常数据区分开来)以及要插入的数量。这样就对每行的数组与最大行比较进行补齐了(例如上面条形光源第四行,实际只有14颗灯,最大行是21颗灯,补齐了7颗空数据,这一行也有了21个数据)。之后,将表示一行的二维数组,转换成簇结构的点(X、Y)表示的数组即可。在这个转换过程中,也可以加一些其它的判断标识,如是该点是否为空之类的,以便后期标记。
             空点的标记,则是根据上面的空点标识来判断当前位置是否是空的,然后要不要覆盖空点标记。因为本身是空的位置,所以其是不会有坐标信息的,这里只能使用当前空点位置所在行、列的其它数据的平均值或邻近的数据值来表示其大概的位置(因为只是标记,大概位置也是可行的,问题不大。本身是空点没有相应的坐标,也无从定义准确位置)。
             下面来看一下演示效果图:
    image3.png
    打开图像-OK产品
    image4.png
    图像处理-OK产品
             上图是一个OK的图像,可以看到是一个6行、10列的产品。关于这里的参数说明:
             粒子排序算法,需要在前面设置的参数,只有行距列距,也就是每行之间的距离、每列之间的距离。如上图,两个粒子之间的距离,水平和垂直大概都是250像素左右,如果行距和列距不同,则设置为不同的值。这些参数要图像处理前就要设置好。这里只是为了演示算法,这个行离、列距,可以用鼠标查看其坐标位置,然后简单的减法计算即可,不需要非常准确,因为算法只是处理组距与组之间的距离的比值,判断其是否接近0或1、或2这样的来考虑的。因为这里只是指定了一个行距和列距,则只适用于基本上等间距的点阵列,对于非等间距的点阵列不适用,中间较大的间距的,可能会被判断为空了一列或一行。
             覆盖空点的标记算法,则有以下三个参数:
    覆盖空点布尔量,确定是不是要对空点进行覆盖标记。
    覆盖空点颜色,设置覆盖标记的颜色。常规的二值化特征点是红色的,这里的覆盖点颜色要与特征点颜色区分开来。
    覆盖空点半径,这里使用的是覆盖圆的方式来标记空点,半径则指定了该圆的大小,与正常的点接近即可。
    为了得到粒子,则先要做阈值处理,所以有阈值参数
    阈值,下限、上限,用于确定要查找的粒子的特征的灰度值范围。上图中的特征是黑色的,阈值取值范围是0-128。
    做完阈值后,通常会有很多粒子,有很多小干扰点粒子,这时可以通过粒子过滤算法,过滤这些干扰粒子。
    过滤条件,这里仅过滤了面积参数,在指定值下限值上限范围内的粒子,被过滤掉,上图中的最大粒子过滤面积是30000。这里的面积,可以在粒子分析中将面积也输出得到,或者是自行简单的计算圆点面积(Pi*R^2=3.14*1000*100=31400)当然也可以将范围设置为真,只保留在上下限面积范围内的粒子,将小粒子和很大的粒子都过滤掉(这里的示例,只过滤小粒子)。标定,图像是否已经标定,这里没演示标定,参数没作用。
    image5.png
    中间NG产品-标记
    image6.png
    NG产品-不标记
    image7.png
    行尾NG产品
    image8.png
    行首行尾NG产品
    image9.png
    行首行尾中间NG产品
    image10.png
    少整列的产品
             图像右边少了一整列,未判断该NG情况。该情况,可以直接判断行、列的数量。但是要标记,就如前面说的,要有参考点才可以。
    image11.png
    NG产品
    image12.png
    NG产品
    image13.png
    NG产品
    image14.png
    NG产品
    image15.png
    NG产品
    image16.png
    NG产品
    image17.png
    LED产品-OK产品
             LED产品的特征点是白色的,所以阈值是128-255,行距和列距约110像素。点半径相对要小一些,这里设置为30。过滤条件,也将过滤的面积上限设置为3000了(灯珠半径约40像素,面积约为3.14*40*40=5000左右)。
    image18.png
    LED产品-NG产品
    本产品开发环境LabVIEW2020SP1+VDM2020SP1(运行版,需要有LV2020RTE、VDM2020SP1RTE和VDM2020SP1VCR)
    矩阵粒子排序演示程序EXE版:免费测试
    矩阵粒子排序EXE.zip (258.36 KB, 下载次数: 3)
    矩阵粒子排序算法VI:付费购买
    矩阵粒子排序vi.zip (226.53 KB, 下载次数: 0, 售价: 200 元)
    测试图像:
    矩阵粒子排序测试图像.zip (21.96 MB, 下载次数: 2)
    淘宝担保交易:
    https://item.taobao.com/item.htm?ft=t&id=679145841487
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员

    本版积分规则

    LabVIEW HALCON图像处理入门教程(第二版)
    石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
    《LabVIEW Vision函数实例详解》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23/24

    QQ|石鑫华视觉论坛 |网站地图

    GMT+8, 2024-11-20 23:21

    Powered by Discuz! X3.4

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表