失败笔记本-HALCON篇-009
项目场景:
今天还是和大佬学习的一天,今儿个学习怎么识别图中的颜色块,实现下面的效果:
识别到图中的颜色块的颜色,并显示在图中。
参考大神的链接:halcon入门教程10_颜色识别1
1.通过颜色灰度识别图中的颜色
步骤:
- 上来我就是一套丝滑小连招啊,打开图片,直接灰度,然后阈值。不过这里学了一手打开文件夹中的所有图片:
- 点击助手–打开新的Image Acquisition–图像文件–选择路径–代码生成–插入代码,非常好用,打开摄像头也是用这个。
* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('D:/APP/MVTec/HALCON-23.11/HALCON-23.11-Progress/examples/images/3d_machine_vision/calib', ['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 02: Do something
endfor
我们的丝滑小连招直接在for循环里操作就行
- 连招之后,其实我们就可以看出不同颜色的灰度区别了,这里我们只需要判断一下灰度的值,输出对应的颜色在图像上就可以,我们将此功能封装成一个新的函数。
- 选择函数–创建新的函数:
依次设置函数名称和参数即可
- 建完函数,就可以循环调用判断颜色了,显示颜色使用的是disp_message()算子。
- 值得一提的是,大佬教了一个新的算子用来判断region的灰度平均值,intensity()。
在HALCON中,intensity算子的主要作用是计算图像中指定区域的灰度强度。具体而言,它能够计算这些区域内灰度值的平均值和标准偏差。其中各参数的含义如下:
Regions(输入参数):表示图像上待检查的一组区域。
Image(输入参数):表示输入的灰度值图像。
Mean(输出参数):表示输出的单个区域的灰度平均值。
Deviation(输出参数):表示输出的单个区域的灰度偏差。
完整的代码如下:
dev_close_window ()
dev_get_window (WindowHandle)
list_files ('D:/WORKSPACE/HALCON/颜色识别(灰度)', ['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])
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 0, 248)
connection (Regions, ConnectedRegions)
count_obj (ConnectedRegions, Number)
dev_display (Image)
for i:=1 to Number by 1
select_obj (ConnectedRegions, ObjectSelected, i)
area_center (ObjectSelected, Area, Row, Column)
intensity (ObjectSelected, GrayImage, Mean, Deviation)
colorIdentification (Mean, Row, Column, WindowHandle)
stop()
endfor
endfor
2.通过HSV色彩空间灰度识别图中的颜色
步骤:
- 颜色灰度判断颜色的方式还是有所局限的,如果两个不同颜色的灰度值相近就很可能出现错误判断的情况,所以要转换色彩空间到HSV下,通过不同通道值来判断。
HSV色彩空间(Hue, Saturation, Value)是一种基于人类对颜色的生理感知构建的颜色模型,广泛应用于图像处理和计算机视觉领域。该模型由三个主要参数组成:色调(Hue)、饱和度(Saturation)和亮度(Value),每个参数都对应于颜色的一个重要特征。
色调是表示色彩的基本属性,用角度来度量,范围从0°到360°。红色对应于0°或360°,绿色对应于120°,蓝色对应于240°。这种表示方式使得我们能够直观地理解不同颜色之间的关系,并且与人类的视觉感知相一致。
饱和度表示颜色的纯度或鲜艳程度,取值范围为0%到100%。当一个颜色完全饱和时,它看起来非常鲜艳;而当饱和度降低时,颜色会变得灰暗。饱和度越高,颜色越鲜艳;反之,则颜色越接近灰色。
亮度也称为明度,表示颜色的亮暗程度,取值范围同样为0%到100%。亮度越高,颜色越亮;反之,则颜色越暗。亮度分量在图像处理中非常重要,因为它直接影响到图像的整体视觉效果。
- 所以我们需要先进行色彩空间的转换。
- 首先将image转换为rgb三个图
- 然后再转换为hsv三个图
代码如下:
decompose3 (ImageReduced, ImageR, ImageG, ImageB)
trans_from_rgb (ImageR, ImageG, ImageB, ImageH, ImageS, ImageV, 'hsv')
- 这样我们修改一下判断颜色的逻辑,将对单个灰度的判断改为对hsv三个值的判断
完整代码如下:
dev_close_window ()
dev_get_window (WindowHandle)
list_files ('D:/WORKSPACE/HALCON/颜色识别(例图)', ['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])
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 0, 248)
connection (Regions, ConnectedRegions)
count_obj (ConnectedRegions, Number)
dev_display (Image)
for i:=1 to Number by 1
select_obj (ConnectedRegions, ObjectSelected, i)
area_center (ObjectSelected, Area, Row, Column)
reduce_domain (Image, ObjectSelected, ImageReduced)
decompose3 (ImageReduced, ImageR, ImageG, ImageB)
trans_from_rgb (ImageR, ImageG, ImageB, ImageH, ImageS, ImageV, 'hsv')
intensity (ObjectSelected, ImageH, MeanH, Deviation)
intensity (ObjectSelected, ImageS, MeanS, Deviation)
intensity (ObjectSelected, ImageV, MeanV, Deviation)
colorIdentificationHSV (MeanH, MeanS, MeanV, Row, Column, WindowHandle)
stop()
endfor
endfor
总结:
在009中,主要学习了以下算子:
打开文件夹中的所有图片
intensity()
创建新的自定义函数
HSV色彩空间
decompose3()
trans_from_rgb()