FPGA模式识别之亮点,光点检测

              简单描述一下,具体这个亮点和光点是怎么来的。

               在做质量和数量检测的时候,常常会涉及到,识别异样点(坏点)。在很多检测的过程中,模型基本是相同的,比如说,检测电路板是否有异样,把坏点圈出来。电路板之间,都是相同的。我称作背景,检测到电路板边缘,进行位置校对后,减去背景。剩下的就是一些亮点了。还有如果要让你把红豆和绿豆分开。绿豆里面有多少红豆(少量),做前期图像处理的时候,把红豆的色彩分量提取的话,图像就只有红豆是白色的,其他的都是黑色的了。等等。都需要涉及这一点。

           最后就会出现一张图。这张图你可以这么理解,就是一块蛋糕上,撒了些小豆,然后我检测一下,上面小豆的数量。

           1,理论:其实我们大概也知道,亮点它的亮度一定比周边的要亮,呈现一种高斯形状,旁边数值低,亮的地方高,然后旁边又低。但是不但表它比整个平面的相对亮度都亮。所以进行图像处理的时候,并不一定要全局处理。

这张图像的质量比较好,不需要做图像的较多处理。其实前期有时候是需要滤波,均衡的。亮点的情况大概说了下,怎么检测呢??有一个是,边缘检测,边缘检测后,亮点就会变成一个圈。然后形态学处理,开操作,闭操作。进行处理后,进行个数测量。第二个,就是高斯形状检测,用5*5的高斯掩膜做处理。对 整幅图扫描,如果符合高斯形状,我就认为是亮点。

                    2,matlab的处理和验证:

亮点的数据情况:

 

126为中心,的一个亮点。这就是一个亮点周围数值的分布状态。

第一种方法是边缘检测的,是吧。

这个是边缘检测后的,

呈现的是这种状态。后面怎么操作呢??3*3的中值滤波。把孤立点去掉。最后通过距离进行聚类。这个方法比较麻烦。最后我还是采用了,第二种方案。高斯形状的检测。

for i=20:236                                                                 
       for j=20:280                                                         
   if (f1(i,j)>f1(i,j+1)&&f1(i,j)>f1(i,j+2) &&f1(i,j+1)>f1(i,j+3) &&f1(i,j)-f1(i,j+4)>15  && ... %比较右边
                 f1(i,j)>f1(i,j-1)&&   f1(i,j)>f1(i,j-2) &&f1(i,j-1)>f1(i,j-3) &&f1(i,j)-f1(i,j-4)>15 ... %比较左边
                &&f1(i,j)>f1(i-1,j)&&f1(i,j)>f1(i+1,j))  %比较上边和下边
               t(1,w)= i;
               t(2,w)=j;
               w=w+1;
            end
  end
end

这个是matlab的比较方案。这个检测方案,是对图像进行了大量统计后,得到的比较模糊的检测方法。最后进来的亮点数量,远远大于实际的数量。

abs(t(1,i)-t(1,i+1))<3 

 abs(t(2,i)-t(2,i+1))<3

进行邻近点聚类。

           3,FPGA实现:

parameter  read_ram_data_state = 64'b0000_0000_00
parameter  read_up5add_state = 64'b0000_0000_0000
parameter  compare_bigsmall_state1 = 64'b0000_000
parameter  read_down5add_state = 64'b0000_0000_00
parameter  compare_bigsmall_state2 = 64'b0000_000
parameter  save_dot_add_state1 = 64'b0000_0000_00
parameter  save_dot_add_state2 = 64'b0000_0000_00
parameter  read_dot_add_state1 = 64'b0000_0000_00
parameter  read_dot_add_state2 = 64'b0000_0000_00
parameter  first_dot_add_state = 64'b0000_0000_00
parameter  data_compare_two_state = 64'b0000_0000
parameter  judge_different_state = 64'b0000_0000_
parameter  read_ram_delay_state = 64'b0000_0000_0
parameter  edge_dot_delet_state = 64'b0000_0000_0
我还是把状态机贴出来。描述一下状态机的变化顺序。

第一步,图像保存,存储器清空,前期准备工作。

第二步,图像一行一行往计算模块里面送,计算什么呢??计算行向的高斯形状。因为如果一次去计算5行的情况,上下左右都检测,然后还要ram临时保存的话,会降低效率的。

第三步,如果有检测到横向有高斯形状后,才开始检测,这个像素的上,和下,竖向方向是否也呈现高斯状态。

第四步,如果呈现高斯状态,保存起来。如果不是,回到第二步。

第五步,就是把保存的亮点,进行聚类。

第六步,发送给上位机。

检测的正确率还是很高的。可能是环境的质量比较好。当然了,整体结构是这样的,具体的细节还是有很多的。

微笑本人能力有限,但是我努力奉献我的想法,希望对各位有所帮助,我希望着,中国的技术行业,可以上一个高的台阶。

当然,如果有好的想法和建议,可以给我留言。

原文地址:https://www.cnblogs.com/maohuawang/p/3807222.html