Halcon 学习笔记--颜色识别(7)
一、颜色
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。
HSV 是根据颜色的直观特性创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。 H(Hue)色度,用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;S(Saturation)表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。S(Intenstity)饱和度,表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
通过阈值方法作颜色识别时,可以查看相应颜色的色度或亮度所对应区间范围,
二、颜色识别方法
(1)利用HSV不同分量具有不同特点,在H或者S通道进行颜色选择
这种方法中最常用就是Blob分析:二值化,形态学,形状选择
dev_close_window () dev_open_window (0, 0, 640, 480, 'black', WindowHandle) for i := 1 to 2 by 1 read_image (Image, 'cable' + i) * 第一步拆分颜色 decompose3 (Image, Red, Green, Blue) * 第二步颜色转换 trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv') *第三步 分析H/S分量,Blob分析 threshold (Saturation, HighSaturation, 100, 255) reduce_domain (Hue, HighSaturation, HueHighSaturation) threshold (HueHighSaturation, Yellow, 20, 50) connection (Yellow, ConnectedRegions) *第四步特征提取 *选择面积最大那个区域 select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0) *闭运算:先膨胀后腐蚀 closing_circle (SelectedRegions, Yellow, 3.5) reduce_domain (Image, Yellow, ImageReduced) dev_display (HueHighSaturation) dev_display (ImageReduced) stop () endfor
这种方法很大缺点,相对而言比较简单,容易实现;但是对光照敏感,不稳定。
(2)分类器
步骤:
1. 创建空对象,用以保存训练样本 gen_empty_obj(Class)
2.生成训练样本(绘制ROI区域方式,)
*绘制ROI选择要训练的颜色
draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
concat_obj (Class, Rectangle, Class)
ROI 形状可以任意,但不能包含背景色,小矩形包围的形状例如可以如下:
3. 设置分类器参数
create_class_mlp (3, 10, 5, 'softmax', 'normalization', 10, 42, MLPHandle)
如果是三通道彩色图像,那第一个参数可以设置3,第三个参数为输出参数个数即Class包含的颜色个数,除去背景色。第二个参数是第三个参数的2倍左右。
4.将训练样本Class 添加到网络中
add_samples_image_class_mlp (Image, Class, MLPHandle)
5.训练样本
train_class_mlp (MLPHandle, 200, 0.01, 0.01, Error, ErrorLog)
6. 识别
classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)
完整代码如下:
dev_update_window ('off') dev_close_window() read_image (Image, 'E:/欣奕华/项目/Halcon/STUDY/网络课程笔记/4.颜色识别/clamp_pile_01.png') get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) dev_display (Image) Color := ['Green','Blue','Yellow','LightBlue','BackColor'] HightColor :=['green','blue','yellow','slate blue'] dev_set_color ('white') *创建存储样本对象变量 dev_set_draw ('margin') gen_empty_obj(Class) *生成训练样本 for I := 1 to |Color| by 1 dev_display (Image) *绘制ROI选择要训练的颜色 draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2) gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2) concat_obj (Class, Rectangle, Class) endfor *设置网络感知参数 create_class_mlp (3, 10, 5, 'softmax', 'normalization', 10, 42, MLPHandle) add_samples_image_class_mlp (Image, Class, MLPHandle) dev_set_color ('red') dev_set_line_width (2) set_display_font (WindowHandle, 14, 'mono', 'true', 'false') set_tposition (WindowHandle, 10, 10) write_string (WindowHandle, 'Training………………') train_class_mlp (MLPHandle, 200, 0.01, 0.01, Error, ErrorLog) * Image Acquisition 01: Code generated by Image Acquisition 01 list_files ('E:/项目/Halcon/STUDY/网络课程笔记/4.颜色识别', ['files','follow_links'], ImageFiles) tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) for Index := 0 to |ImageFiles| - 1 by 1 read_image (Image, ImageFiles[Index]) * Image Acquisition 01: Do something *分类识别物体 classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5) dev_display (Image) for I := 1 to 4 by 1 copy_obj (ClassRegions, ObjectsSelected, I, 1) *connection (ObjectsSelected, ConnectedRegions) opening_rectangle1 (ObjectsSelected, RegionOpening, 5, 5) dev_set_color (HightColor[I-1]) dev_set_draw ('fill') fill_up (RegionOpening, RegionFillUp) stop () endfor endfor
在这个案例中识别物体颜色,相互有交叉,缺点是在后期做处理显示通讯不好,如果图像颜色。