这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » FPGA模式识别之亮点,光点检测

共1条 1/1 1 跳转至

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

菜鸟
2017-06-28 16:22:04     打赏

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

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

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



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

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

          2,matlab的处理和验证:

亮点的数据情况:

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

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

这个是边缘检测后的,呈现的是这种状态。后面怎么操作呢??3*3的中值滤波。把孤立点去掉。



最后通过距离进行聚类。这个方法比较麻烦。最后我还是采用了,第二种方案。高斯形状的检测。


  1. for i=20:236                                                                 
  2.        for j=20:280                                                         
  3.    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  && ... %比较右边
  4.                  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 ... %比较左边
  5.                 &&f1(i,j)>f1(i-1,j)&&f1(i,j)>f1(i+1,j))  %比较上边和下边
  6.                t(1,w)= i;
  7.                t(2,w)=j;
  8.                w=w+1;
  9.             end
  10.   end
  11. end
复制代码 这个是matlab的比较方案。这个检测方案,是对图像进行了大量统计后,得到的比较模糊的检测方法。最后进来的亮点数量,远远大于实际的数量。

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

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

进行邻近点聚类。

3,FPGA实现:


  1. parameter  read_ram_data_state = 64'b0000_0000_00
  2. parameter  read_up5add_state = 64'b0000_0000_0000
  3. parameter  compare_bigsmall_state1 = 64'b0000_000
  4. parameter  read_down5add_state = 64'b0000_0000_00
  5. parameter  compare_bigsmall_state2 = 64'b0000_000
  6. parameter  save_dot_add_state1 = 64'b0000_0000_00
  7. parameter  save_dot_add_state2 = 64'b0000_0000_00
  8. parameter  read_dot_add_state1 = 64'b0000_0000_00
  9. parameter  read_dot_add_state2 = 64'b0000_0000_00
  10. parameter  first_dot_add_state = 64'b0000_0000_00
  11. parameter  data_compare_two_state = 64'b0000_0000
  12. parameter  judge_different_state = 64'b0000_0000_
  13. parameter  read_ram_delay_state = 64'b0000_0000_0
  14. parameter  edge_dot_delet_state = 64'b0000_0000_0
复制代码

我还是把状态机贴出来。描述一下状态机的变化顺序。

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

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

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

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

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

第六步,发送给上位机。

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

(copyright by my_share)



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]