Halcon处理光照或明暗度不均匀的图像,提取目标区域

2023-12-14 18:48:37

参考链接:http://t.csdnimg.cn/D2b6U

先介绍一下本文的例子,要提取一张图片中的目标区域,但是目标一半亮一半暗有阴影,影响对有效区域的提取。

考虑到可以先做暗部提亮,再做接下来的处理。

如果直接做阈值,可能很难选中合适的阈值或范围:

下面是直接对原图做阈值的效果:

因为需要做区域提取,所以下面先选取ROI区域,只需要看暗部提亮的可以参考更下文。

read_image (Image, 'D:/APP/Imgs_project/dogdi.jpg')
* rgb1_to_gray (Image, Image)
gen_rectangle1 (Rectangle1, 440, 518, 670, 838)
reduce_domain (Image, Rectangle1, ImageReduced2)
get_image_size (ImageReduced2, Width, Height)
dev_open_window_fit_image (ImageReduced2, 0, 0, -1, -1, WindowHandle)

decompose3(ImageReduced2, image_R, image_G, image_B)
* 直方图均衡化
equ_histo_image (image_B, ImageEquHisto3)
*均值滤波
mean_image (ImageEquHisto3, ImageMean, 3, 3)

当然,可以根据自己图像特征选择合适的单通道图继续处理,上文中B通道的效果比较好,就选择了B的单通道图。

此时目标所在区域灰度比原图均匀,可以进行下一步提取区域,这里是第一种方法。

*1.全局阈值
threshold(ImageMean,Region,128,255)
fill_up(Region,RegionFillUp1)
connection (RegionFillUp1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions, 'area', 'and', 300, 99999)
union1 (SelectedRegions, RegionUnion1)

这里直接阈值分割出区域,阈值范围可以自行调节,效果如下:

第二种方法,这里是使用阈值提取轮廓再筛选,转成区域

*2.选取阈值作为分界线
threshold_sub_pix (ImageMean, Border, 165)
select_shape_xld (Border, SelectedXLD, 'contlength', 'and', 10, 2000)
gen_region_contour_xld (SelectedXLD, Region, 'filled')
select_shape (Region, Selecteddog, 'area', 'and', 150, 99999)
union1 (Selecteddog, RegionUnion)

效果如下:

还有动态阈值的,具体过程遇到有些瓶颈,有提取区域处理过程比较顺利的可以互相沟通。

dyn_threshold (ImageEquHisto3, ImageMean, RegionDynThresh, 20, 'light')

生活真是心累,下班,结束。

文章来源:https://blog.csdn.net/qq_45813590/article/details/134998470
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。