一、顏色
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
在這個案例中識別物體顏色,相互有交叉,缺點是在后期做處理顯示通訊不好,如果圖像顏色。