Halcon颜色提取,基于MLP自动颜色提取功能
1.前言
在实际的图像处理中,经常会遇到彩色图像,使用彩色图像往往跟颜色识别有关系。但是使用RGB进行调参时又很难达到所需要的效果(异常区域过多不好处理)。
在Halcon中,halcon对颜色提取采用MLP(多层感知模型)的形式实现对图像颜色的识别和分类。
2.结论代码
read_image (Image, 'E:/UpperComputer/颜色提取/1.bmp')
*绘制所需要提取的区域颜色
gen_rectangle1 (ROI_0, 135.254, 399.168, 184.195, 417.796)
gen_rectangle1 (ROI_1, 186.525, 189.596, 244.789, 200.075)
gen_rectangle2 (ROI_2, 377.629, 292.054, rad(-21.818), 25.0824, 7.35622)
*将所绘制的区域联合成同一区域
union2 (ROI_0, ROI_2, RegionUnion)
union2 (RegionUnion, ROI_1, RegionUnion1)
*绘制背景区域
gen_rectangle1 (back1, 3.38358, -0.0446034, 403.07, 174.598)
*将所有区域存放在数组中
concat_obj (back1, RegionUnion1, Classes)
*创建MLP句柄。
create_class_mlp (3, 7, 2, 'softmax', 'normalization', 3, 42, MLPHandle)
*将区域数组添加到句柄中
add_samples_image_class_mlp (Image, Classes, MLPHandle)
*训练图像,根据训练区域的复杂度,需要一段时间
train_class_mlp (MLPHandle, 400, 0.5, 0.01, Error, ErrorLog)
*将句柄写入文件中
write_samples_class_mlp (MLPHandle, 'E:/UpperComputer/颜色提取/mlp.mlp')
*从文件中读出句柄
read_samples_class_mlp (MLPHandle, 'E:/UpperComputer/颜色提取/mlp.mlp')
*对图像进行分类
classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)
*复制对应数组图像
copy_obj (ClassRegions, ObjectsSelected, 2, 1)
*对结果进行显示
connection (ObjectsSelected, ConnectedRegions)
gen_contour_region_xld (ConnectedRegions, Contours, 'border')
area_center (ConnectedRegions, Area, Row, Column)
gen_cross_contour_xld (Cross, Row, Column, 100, 0)
dev_display (Image)
dev_display (Contours)
dev_display (Cross)
3.halcon案例
(1)案例问题
halcon对MLP的颜色提取提供了一个极佳的案例:color_pieces.hdv但是在实际的案例分析时发现,案例中对特殊情况的同颜色物体的识别效果不佳。
(2)案例优化
我们需要对相同颜色的区域进行融合。
这样子我们就可以避免出现对同颜色的部分,因为打光不均匀造成颜色识别异常的情况。
*读取图像
read_image (Image, 'E:/UpperComputer/颜色提取/1.bmp')
*绘制所需要提取的区域颜色
gen_rectangle1 (ROI_0, 135.254, 399.168, 184.195, 417.796)
gen_rectangle1 (ROI_1, 186.525, 189.596, 244.789, 200.075)
gen_rectangle2 (ROI_2, 377.629, 292.054, rad(-21.818), 25.0824, 7.35622)
*将所绘制的区域联合成同一区域
union2 (ROI_0, ROI_2, RegionUnion)
union2 (RegionUnion, ROI_1, RegionUnion1)
*绘制背景区域
gen_rectangle1 (back1, 3.38358, -0.0446034, 403.07, 174.598)
*将所有区域存放在数组中
concat_obj (back1, RegionUnion1, Classes)
*创建MLP句柄。
create_class_mlp (3, 7, 2, 'softmax', 'normalization', 3, 42, MLPHandle)
*将区域数组添加到句柄中
add_samples_image_class_mlp (Image, Classes, MLPHandle)
*训练图像,根据训练区域的复杂度,需要一段时间
train_class_mlp (MLPHandle, 400, 0.5, 0.01, Error, ErrorLog)
*将句柄写入文件中
write_samples_class_mlp (MLPHandle, 'E:/UpperComputer/颜色提取/mlp.mlp')
*从文件中读出句柄
read_samples_class_mlp (MLPHandle, 'E:/UpperComputer/颜色提取/mlp.mlp')
*对图像进行分类
classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)
*复制对应数组图像
copy_obj (ClassRegions, ObjectsSelected, 2, 1)
*对结果进行显示
connection (ObjectsSelected, ConnectedRegions)
gen_contour_region_xld (ConnectedRegions, Contours, 'border')
area_center (ConnectedRegions, Area, Row, Column)
gen_cross_contour_xld (Cross, Row, Column, 100, 0)
dev_display (Image)
dev_display (Contours)
dev_display (Cross)
最终训练结果
4.实例分析-金属表面涂胶检测
(1)参考图像
在项目上由于多种原因。例如金属板来料不稳定,材质表面处理差,打光型号不好等很多情况造成图片效果不过。例如下图中需要把绿色胶完全提取出,并计算面积与是否断胶情况。对于使用RGB调参对来料的稳定性要求过高。这个时候我们可以使用MLP进行对胶颜色的提取
(2)编写的程序
read_image (Image, 'E:/UpperComputer/颜色提取/16_06_59_48.jpg')
gen_rectangle1 (ROI_0, 1189.38, 885.171, 1526.06, 923.636)
gen_rectangle1 (ROI_1, 1747.25, 2.78031, 1762.57, 523.197)
gen_rectangle1 (ROI_2, 569.788, 885.932, 733.413, 905.169)
union2 (ROI_0, ROI_1, RegionUnion)
union2 (RegionUnion, ROI_2, RegionUnion2)
gen_rectangle1 (ROI_back, 84.3468, 975.379, 710.018, 1927.27)
concat_obj (ROI_back, RegionUnion2, Classes)
create_class_mlp (3, 7,2, 'softmax', 'normalization', 3, 42, MLPHandle)
add_samples_image_class_mlp (Image, Classes, MLPHandle)
train_class_mlp (MLPHandle, 400, 0.5, 0.01, Error, ErrorLog)
classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)
copy_obj (ClassRegions, ObjectsSelected, 2, 1)
connection (ObjectsSelected, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 906015, 1.71805e+06)
dilation_circle (SelectedRegions, RegionDilation, 3.5)
gen_contour_region_xld (RegionDilation, Contours, 'border')
dev_display (Image)
dev_display (Contours)
(3)解析
第一:先对图像明显的区域进行需要区分的颜色进行选取,还有对背景选取。对于背景的选取,应尽可能的包含常见的元素,有助于大量提升背景的识别效率
read_image (Image, 'E:/UpperComputer/颜色提取/16_06_59_48.jpg')
gen_rectangle1 (ROI_0, 1189.38, 885.171, 1526.06, 923.636)
gen_rectangle1 (ROI_1, 1747.25, 2.78031, 1762.57, 523.197)
gen_rectangle1 (ROI_2, 569.788, 885.932, 733.413, 905.169)
union2 (ROI_0, ROI_1, RegionUnion)
union2 (RegionUnion, ROI_2, RegionUnion2)
gen_rectangle1 (ROI_back, 84.3468, 975.379, 710.018, 1927.27)
concat_obj (ROI_back, RegionUnion2, Classes)
第二:创建和训练MLP模型
创建模型时,对create_class_mlp应确定有多少参数。算子中的2代表具有2种需要被区分的颜色。如果我们训练里面需要被区分的颜色有多种,那么我们需要修改指定的参数。
create_class_mlp (3, 7,2, 'softmax', 'normalization', 3, 42, MLPHandle)
add_samples_image_class_mlp (Image, Classes, MLPHandle)
train_class_mlp (MLPHandle, 400, 0.5, 0.01, Error, ErrorLog)
其次对于不同的图像中出现找不到的区域,只需要调用一下算子,重复前面流程将颜色添加到MLP的句柄中即可
add_samples_image_class_mlp (Image, Classes, MLPHandle)
第三:结果显示。
classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)
copy_obj (ClassRegions, ObjectsSelected, 2, 1)
connection (ObjectsSelected, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 906015, 1.71805e+06)
dilation_circle (SelectedRegions, RegionDilation, 3.5)
gen_contour_region_xld (RegionDilation, Contours, 'border')
dev_display (Image)
dev_display (Contours)
将所需要输出的区域进行复制一份即可。需要注意的时查看对应的区域数组。并选取合适的区域进行复制
copy_obj (ClassRegions, ObjectsSelected, 2, 1)
第三:最终结果。
绿色的胶条可以轻松被提取出。后续进行对胶条进行Blob分析即可得出结果。
结论
MLP模型的训练和使用过程非常简单。并且效果显著,主要针对具有物体颜色需要被区分,或者由于打光效果或者来料不稳定造成的图像异常的情况,并且可以通过颜色快速提取特征的方式。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!