1. 谈谈Blob分析

Blob可以说是图像处理中最简单、最常用的方法了。虽说简单,但是往往也能达到目的,稳定性也不错。这种方法适用的场景也非常多,实际项目中几乎都会看到它的身影。
有时是作为辅助手段获取目标区域图像,有时直接作为最终的处理结果输出。当然Blob也有其自身的局限性,比如受光照的影响比较大,它要求前景和背景有较为明显的明暗差别(灰度值上的差别),这样更容易做图像分割。
拿到图片后,我一般喜欢先用Blob处理一下,因为方法简单,这并不会占用我们很多时间。

2. 看一张图片

在这里插入图片描述



上面的图片是一个电池组件,有一片蓝色透明的胶纸,现在我想把这个区域分割出来,以方便后面的处理。
这个例子很简单,可能使用rgb1_to_gray转灰度图像,然后二值化就很容易分割出来了,但这并不是我们的目的,我们期望利用这个例子学习和练习到更多的算子,思考更多的方法。
我认为对Halcon的学习来说,熟悉主要算子的用法,算子里面参数的意义,这些固然很重要,但是最重要的是解决问题的思路。就像写文章一样,首先要有思路,朝着一个方向,把素材有机组合起来才能形成一篇文章。
看上面的图片,首先它是一张彩色图像,彩色图像就有RGB三个通道,这就提醒我们转灰度图的方法不止rgb1_to_gray一种,还可以分离通道,分别得到R、G、B分量,也就得到了三张灰度图了。
说到分离通道,又会马上想到颜色空间,我们可以把R、G、B分量再转到HSV颜色空间中去观察一下,又会有那些发现呢?蓝色区域饱和度比较高,或许会有不错的表现。

3. 处理图像效果

在这里插入图片描述

颜色空间转换后得到的饱和度图像效果很好,可以看到蓝色胶纸部分成高亮,灰度值要远大于背景,此时再进行二值化处理会很容易,而且算法稳定性也比较高。

在这里插入图片描述

在这里插入图片描述

4. Halcon代码

  • 代码里串用了一些常用的算子,不需要死记硬背,只需要多加练习,自然就记下了,熟能生巧嘛!
read_image (Image, '彩色相机.bmp')

* 彩色图像转灰度图像
*rgb1_to_gray (Image, GrayImage)

*======================蓝色膜的分离===================
* 分离颜色通道
decompose3 (Image, R, G, B)
* RGB转HSV (颜色空间转换)
trans_from_rgb (R, G, B, H, S, V, 'hsv')

dev_display (S)
* 二值化
threshold (S, Regions, 184, 255)
* 填充孔洞
fill_up (Regions, RegionFillUp)
* 分割
connection (RegionFillUp, ConnectedRegions)
* 特征筛选
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 86683.7, 200000)
* 区域面积和中心坐标
area_center (SelectedRegions, Area, Row, Column)
* 在中心画十字
gen_cross_contour_xld (Cross, Row, Column, 66, 0)
* 显示蓝色膜区域
dev_display (SelectedRegions)
* 选择蓝色来画十字
dev_set_color ('blue')
dev_display (Cross)

* 获取区域的长轴与X轴正方向的夹角
* Halcon的基准都是X轴正方向,逆时针为正,顺时针为负
orientation_region (SelectedRegions, Phi)
regionDeg := deg(Phi)
* 在图形窗口上显示信息
disp_message (3600, '膜区域角度:'+regionDeg + '°', 'window', 12, 12, 'black', 'true')
disp_message (3600, '膜区域中心:'+Row + ',' + Column, 'window', 42, 12, 'black', 'true')
stop()


* 区域的最小外接矩形
smallest_rectangle2 (SelectedRegions, Row1, Column1, Phi1, Length1, Length2)
* 创建这个矩形的xld
gen_rectangle2_contour_xld (Rectangle, Row1, Column1, Phi1, Length1, Length2)
dev_display (Image)
* 设置线的颜色和宽度
dev_set_color ('red')
dev_set_line_width (3)
* 显示最小外接矩形
dev_display (Rectangle)
* 最小外接矩形的中心坐标和角度

disp_message (3600, '最小外接矩形角度:'+deg(Phi1) + '°', 'window', 12, 12, 'black', 'true')
disp_message (3600, '最小外接矩形中心:'+Row1 + ',' + Column1, 'window', 42, 12, 'black', 'true')
stop()

5. 资源下载

https://download.csdn.net/download/weixin_38566632/35131452

————————————————

版权声明:本文为CSDN博主「MechMaster」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38566632/article/details/121012880