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

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

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

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

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

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

因为需要做区域提取,所以下面先选取ROI区域

(手动选择ROI(链接经常失效刚更新):http://t.csdnimg.cn/wyOGw),

只需要暗部提亮的可以省略前面步骤。

read_image (Image, 'D:/APP/Imgs_project/dogdi.jpg')
* rgb1_to_gray (Image, Image)
*这里是通过ImageJ打开图片读取的坐标信息
*不直接输入坐标,也可以通过代码手动绘制ROI区域
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的单通道图。可以根据自己图像特征选择合适的单通道图继续处理,或者先处理再合并通道图再做灰度化,一边观察效果一边调节,步骤因图而异,不是必要的:

* 高斯滤波处理
gauss_filter (image_R, ImageGauss, 5)
* 增强图像对比度
scale_image_max (ImageGauss, ImageScaleMax)
* 增强图像算子emphasize或illuminate
*emphasize (ImageGauss, em1, 5, 5, 1.5)
illuminate (ImageScaleMax, ImageI1, 20, 20, 0.55)
* 直方图均衡化
equ_histo_image (image_G, ImageEquHisto2)
equ_histo_image (image_B, ImageEquHisto3)
* 通道合并
compose3 (ImageI1, ImageEquHisto2, ImageEquHisto3, MultiChannelImage)

下面是分离处理的B通道图做直方图均衡化后的效果图ImageEquHisto3。

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

*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)

效果如下:

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

*3.动态阈值
dyn_threshold (ImageEquHisto3, ImageMean, RegionDynThresh, 20, 'light')
fill_up (RegionDynThresh, RegionFillUp2)
connection (RegionFillUp2, ConnectedRegions2)

*这里只是很散乱不连接的小点区域,尝试把区域连接但是很容易得到黑白图。这里无论是提取暗   区还是亮区,它基本上得到的都是背景的区域,尝试做了反选和相减,但是由于这些区域不连通很小很   分散所以还是难提取。
*暂时没有想到直接用动态阈值提取目标区域的后续过程,
*查阅文章有先全局再动态的过程但觉得太繁琐,我这个处理需求只是为了提取目标区域求最小外接矩形的中心,不需要这么多步骤

目前只能做到这边,不想思考了,知识储备比较充足的可以提点关于后面怎么提取目标区域的建议步骤:

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

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值