Halcon颜色提取,基于MLP自动颜色提取功能

发布时间:2023年12月26日

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模型的训练和使用过程非常简单。并且效果显著,主要针对具有物体颜色需要被区分,或者由于打光效果或者来料不稳定造成的图像异常的情况,并且可以通过颜色快速提取特征的方式。

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