脏污MARK识别

这篇博客探讨了在灰度图像中进行脏污MARK点识别的难点,主要问题在于前景和背景区分不明显,导致自动二值化困难。作者通过调整灰度直方图,采用特定的阈值方法实现了较好的二值化效果,并展示了后续的一系列图像处理步骤,包括开运算、轮廓提取和边缘检测等,以识别并分离MARK点。虽然方法有效,但适配性仍有待提高。
摘要由CSDN通过智能技术生成

MARK识别脏污

常规的MARK点识别没什么好说的,对于脏污的MARK识别,大概处理了下,具体效果待验证。

在这里插入图片描述

例如这种。

灰度图是这样
在这里插入图片描述

比较麻烦的是,前景和背景区分不明显,自动二值化的话,无法很好地区分,手动设定二值化阈值,又不能保证每张图阈值都一样,有点难弄。

binary_threshold (ImageReduced, Region1, 'max_separability', 'light', UsedThreshold)

效果如下:
在这里插入图片描述

区域是这样的话,无论如何做图像处理,都无法找到合适的圆形区域。同时,卡尺找边缘,canny找边缘等方式,由于灰度变化不明显,效果都不好。

核心在于如何做好二值化。自动二值化。

其实从灰度直方图来看,差距还是很明显,暗区域基本集中在一块,只需要把第一个峰值区域刨开,剩下的就是MARK点区域了。
在这里插入图片描述

不知道halcon的自动二值化用的什么直方图切割方式,试了下其他threshold方法,也都效果不好。自己想了一个,效果还行


gray_histo (ROI_0, ImageReduced, AbsoluteHisto, RelativeHisto)
histo_to_thresh (AbsoluteHisto, 2, MinThresh, MaxThresh)
threshold(ImageReduced, Region, MaxThresh[0], 255)  

二值化效果如下:
在这里插入图片描述

有这个效果,后面的就好处理了。


opening_circle(Region, RegionOpening, 3.5)

select_shape_std (RegionOpening, SelectedRegions, 'max_area', 70)

closing_circle (SelectedRegions, RegionClosing, 30)

boundary (RegionClosing, RegionBorder, 'inner')

skeleton (RegionBorder, Skeleton)

gen_contours_skeleton_xld (Skeleton, Contours, 1, 'filter')

intersection (RegionBorder, ROI_0, RegionIntersection)
fit_circle_contour_xld (Contours, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle (Circle, Row, Column, Radius)
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1)
shape_trans (RegionIntersection, RegionTrans, 'inner_circle')
*找到边缘所在区域,根据图像大小区别,也需要修改
dilation_circle (Circle, RegionDilation, 5)
erosion_circle (Circle, RegionErosion, 1.5)

difference (RegionDilation, RegionErosion, RegionDifference)

reduce_domain(Image1,RegionDifference,Imagetest)
*这个用来找边缘,根据图像变化,也是需要修改的
edges_sub_pix (Imagetest, Edges, 'canny', 1, 10, 20)

segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 2, 2, 2)

union_cocircular_contours_xld (ContoursSplit, UnionContours, 0.5, 0.1, 0.2, 30, 10, 10, 'true', 1)

*排除掉小轮廓 

* 如图像变大,这块的参数是要修改的。
select_contours_xld (UnionContours, SelectedContours, 'contour_length', 4, 2000, -0.5, 0.5)

*这个是将轮廓连起来。有可能轮廓无法连接,或连接的轮廓太少,或连接出错,导致拟合出错
union_adjacent_contours_xld (SelectedContours, UnionContours1, 100, 1, 'attr_keep')

select_obj(UnionContours1, ObjectSelected, 1)
fit_circle_contour_xld (ObjectSelected, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)

gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1)



dev_display(Image)
dev_display(ContCircle)
stop()

最终结果,目前来看效果还可以。原来常规方法处理不出来的都正确识别了。从轮廓表现上来看,精度也不错。不过这个适配性还是不高,详见注释。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值