上一篇讲述的例子用的素材是“善良”图片,只能用来说明一下焊点检测的基本原理。
由于机器机构设计的局限,例如焊点检测工位的前工位缺少辗平焊极的工位,或者焊片本身上下弯曲而没有在压平状态下检测,或者每片焊片上的焊点位置不固定,等等。会造成灯光不能很好的白化背景暗化焊点,时不时来几片焊点与背景混在一起的图片,让你痛不欲生。

例如下面这些奇葩,它们的特征是:粘连,和背景混合

 

halcon 启用cpu深度学习识别 halcon检测_opencv

我们来一张背景干扰的素材,它是奇葩中的战斗机,如下:

halcon 启用cpu深度学习识别 halcon检测_halcon 启用cpu深度学习识别_02


一般这样的图片,是因为焊片上翘或者下翘造成的。 

 

(一)动态阈值分割

threshold 是采用全局阈值分割图像。这张图,会因为阀值范围内包含干扰背景,而没办法提取我们想要的焊点。

可以换成自动产生的阀值分割图像的算子bin_threshold

程序如下:

read_image (Image23, 'C:/Users/Administrator/Desktop/焊点图片/12.bmp')
gen_rectangle1 (ROI_0, 280.5, 350.5, 426.5, 474.5)
reduce_domain(Image23, ROI_0, ImageReduced)
bin_threshold (ImageReduced, Regions)

connection(Regions, ConnectedRegions)
closing_circle(ConnectedRegions, RegionClosing, 5.5)
fill_up(RegionClosing, RegionFillUp)
select_shape(RegionFillUp, SelectedRegions, 'area', 'and', 10, 99999)
count_obj(SelectedRegions, Number)

结果如下图,可以看到效果还是可以的。

halcon 启用cpu深度学习识别 halcon检测_灰度值_03

  

我们来用这段程序试下没有什么背景干扰图像会怎么样?
结果如下图,效果也是不错的。

halcon 启用cpu深度学习识别 halcon检测_opencv_04

 下面这一张,结果不好,是因为上面两个焊点和其干扰背景相似,并且和下面两个焊点阈值差别太大

halcon 启用cpu深度学习识别 halcon检测_灰度值_05

 看来bin_threold也有缺点,因为它没有参数可以调节。

(二)用灰度直方图数据分割图像

换个思路。我们取取画面中灰度值像素数量最多的部分,算子gray_histo可取得图像的灰度值分布数量。我们经过排序后即可取得像素数量最多的灰度值。

然后使用threshold算子按此灰度值进行图像分割。

read_image (Image23, 'C:/Users/Administrator/Desktop/焊点图片/82.bmp')
gen_rectangle1 (ROI_0, 307.5, 358.5, 424.5, 475.5)
reduce_domain(Image23, ROI_0, ImageReduced)

mean_image(ImageReduced, ImageMean2, 9, 9)
gray_histo(ROI_0, ImageMean2,AbsoluteHisto, RelativeHisto) 
gen_region_histo(Region1, RelativeHisto, 255, 66, 1)
PeakGray := sort_index(AbsoluteHisto)[255] 
threshold(ImageReduced,Region,0,PeakGray-55)

connection(Regions, ConnectedRegions)
closing_circle(ConnectedRegions, RegionClosing, 5.5)
fill_up(RegionClosing, RegionFillUp)
select_shape(RegionFillUp, SelectedRegions, 'area', 'and', 10, 99999)
count_obj(SelectedRegions, Number)

中值滤波是必需的,去掉图像噪声 

halcon 启用cpu深度学习识别 halcon检测_halcon 启用cpu深度学习识别_06

 

对中值滤波后的图像进行计算灰度分布,取得像素量最多的灰度值。
在halcon的变量监视器中,我们看到灰度值203是分布数量最多的。红色表示的灰度分布图中绿圈处的最高点就是灰度203 

halcon 启用cpu深度学习识别 halcon检测_图像处理_07

 

halcon 启用cpu深度学习识别 halcon检测_灰度值_08

 

下面这句话把这个灰度值用上去。 

threshold(ImageReduced,Region,0,PeakGray-55)

结果如下图,效果还是可以的。

 

halcon 启用cpu深度学习识别 halcon检测_计算机视觉_09

 

试几个“正常焊点”和图片,效果也是不错的!

halcon 启用cpu深度学习识别 halcon检测_计算机视觉_10

不过这种方法仍然有其问题,就是下面的常量55,是当前产品的经验值,而且极有可能有奇魄的图片不符合这个经验值。

threshold(ImageReduced,Region,0,PeakGray-55)