图像的通道是图像的组成像素的描述方式。举例来说,如果图像全部由灰色的点组成,只需要用一个灰度值就可以表示这个点的颜色,那么这个图像就是单通道的。如果这个点有彩色信息,那么描述这个点需要用到R、G、B3个通道,即用红色分量的颜色数量、绿色分量的颜色数量、蓝色分量的颜色数量共同描述这个点的颜色。因此,这样的彩色点组成的图像就具有3个通道。
如果除了R、G、B颜色信息外,还想要用一张灰度图表示像素的透明度,像素点在灰度图上对应的值是0,表示像素完全不发光;对应的值是255,表示像素完全显示,那么这个点就加入了透明度信息,因而有4个通道。这样的点组成的图像就是一幅四通道图像。
与访问通道相关的Halcon算子有很多,本小节举例说明两种。
如要获得某一个指定通道的图像,可以使用access_channel算子。举例如下:
read_image (MultiChannelImage, 'beads.jpg')
access_channel (MultiChannelImage, Red, 1)
以上代码表示从名为MultiChannellmage的图像中取出序号为1的通道图像,存储并命名为Red。
使用count_channels算子,将返回输入图像中的通道数量。举例如下:
read_image (MultiChannelImage, 'beads.jpg')
count_channels (MultichannelImage, NumOfChannels)
以上代码表示MultiChannelImage 图像中的通道数量,且这一数量信息存储在NumOfChannels变量中。
有时完整的RGB信息对于图像分析并没有明显的帮助,特定的颜色反而能帮助区分目标对象。例如,白色布料上的淡紫色花纹在蓝色通道中可能会看不出来,但在红色和绿色通道中却显而易见。因此,可以使用色彩分离的方法,利用某一个通道中的颜色差别,区分出目标物体和背景。注意,白色包含R、G、B3种颜色,且3种颜色的分量都达到了最大值,而淡紫色可能只在蓝色通道中达到了最大值,因此在蓝色通道中显示不出来。
decompose3算子是比较常见的通道分离方法,对于RGB图像来说,如果要分离出3种颜色分量,在Halcon中可以使用decompose3算子进行RGB颜色的通道分离。举例如下:
read_image (MultiChannelImage, 'beads.jpg')
decompose3 (MultiChannelImage, Red, Green, Blue)
这里读取一个多通道的彩色图像,然后使用decompose3算子将其分割为单个通道的图像,decompose3算子的第1个参数为输入图像的名字,后面的3个参数分别对应输出的3个颜色通道的图像名字。程序运行的效果如图所示。
图(a)为输入的彩色图像,图(b)~(d)分别对应红色、绿色、蓝色通道的图像。
除了3个通道的图像分离以外,也可以使用decompose4算子、decompose5算子、decompose6算子进行多个通道图像的通道分离。还可以使用image_to_channels算子将一幅包含多通道的图像分解为包含多个单通道图像的数组。举例如下:
read_image (MultiChannelImage, 'beads.jpg')
image_to_channels (MultichannelImage, ImageArray)
该段代码运行后,MultiChannelImage的单个通道图像都将被存储在ImageArray数组中。
该算子的功能与decompose3算子正好相反,是将3个通道的图像合并起来。举例如下:
read_image (MultiChannelImage, 'beads.jpg')
decompose3 (MultiChannelImage, Red, Green, Blue)
compose3 (Red, Green, Blue, MultiChannelImage)
compose3算子的前3个参数为输入的3个通道的图像,最后一个参数为输出的结果图像。将上文程序分解出的RGB图像作为compose3算子的输入,并进行通道合并,将得到通道分离前的原始图像。
同样,如果有多个通道的图像,还可以分别使用compose4算子、compose5算子、compose6
算子对四通道、五通道、六通道的图像进行合并。
该算子的功能与image_to_channels算子正好相反,是将数组内的单通道图像合并成一幅多通道图像。举例如下:
read_ image (Images, ['pico','picl','pic2'])
channels _to _image (Images, MultiChannelImage)
该段代码运行后,Images 数组中的图像将成为MultiChannelImage的一个通道。
可以使用access_channcl算子访问指定的通道图像。
分解得到图像的颜色通道之后,可以根据特定的通道图像的颜色特征提取出目标物体。但有时要提取的物体可能有复杂的颜色,无法依赖单一通道进行分割,这时可以进行更进一步的操作。这里可以使用sub_image算子对通道图像做减法运算,以提取出目标色彩区域。举例如下:
read_image (Image, 'data/beads')
decompose3 (Image, Red, Green, Blue)
sub image (Blue, Red, BlueSubRed, 1, 128)
sub image (BlueSubRed, Green, BlueSubRedGreen, 1, 128)
threshold(BlueSubRedGreen, BlueRegion, 230, 255)
图(a)为蓝色通道图像;图(b)为蓝色通道图像与红色通道图像相减的结果;图©为蓝色通道图像与红色通道图像相减后再与绿色通道图像相减的结果:图(d)为在图(c)图像上进行阈值分割,提取出的蓝色珠子的颜色区域。
除了减法操作外,也可以进行两幅图的相加、相乘、相除等操作,还可以对单个通道进行直方图均衡、局部均衡、亮度控制等操作。应根据实际检测的需求对通道进行合适的操作,在此不一一详述。