Halcon 第四章『图像特征和提取』◆第8节:图像的颜色特征

        1、图像的彩色

        通常用于区别颜色的特性是亮度、色调饱和度

亮度:表示了色彩明亮程度;
色调:表示构成该颜色光的不同波长光波中比重最大的光的颜色;
饱和度:是有色调所对应的光在构成该颜色光中所占的比例,它与所加白光数量成反比。

        色调与饱和度一起称为色度。

        2、图像的色彩空间

        机器视觉中常用的颜色图像有灰度图像RGB(红、绿、蓝)图像、HSI(色调、亮度、饱和度)图像、HSV(色调、饱和度、亮度)图像等。

        ①灰度图像

        灰度图像即单通道图像,每个像素的灰度值为0~255,其中0表示全黑,255表示全白。对于显示或者形态学处理等操作来说,灰度图像已经足够满足要求。因此,为了节约计算量并加快处理速度,一般会将彩色图像转化为灰度图像进行处理。

        ②RGB图像

        彩色图像的表示则需要通道(channel)的概念。在计算机中,我们用红色、绿色和蓝色这三种颜色的组合来表达任意一种色彩。于是对于每一个像素,就要记录其R、G、B 三个数值,每一个数值就称为一个通道。例如,最常见的彩色图像有三个通道,每个通道都由8 位整数表示。在这种规定下,一个像素占据24 位空间。每个通道分别表示R(Red红色)、G(Green绿色)、B(Blue蓝色)3个分量,各自的取值范围都为0~255。将这3种分量组合,可以得到更多的颜色表达方式。

        RGB指的是R(red)红色、G(green)绿色、B(blue)蓝色,三种颜色;目前来说,所有的颜色都可以用这三种颜色配出来,RGB各有256级亮度,用数字表示为从0-255,最多为256×256×256=16777216;简称为1600万色或千万色。也称为24位色(2的24次方)。

        RGB模型建立在笛卡尔坐标系中。坐标的三个轴分别表示红R,绿G,蓝B三原色。模型的空间是一个正方体,原点对应黑色,距离原点最远的点对应白色。从黑色到白色的灰度值分布再从原点到距离原点最远顶点间的连线上,而立方体内其余各点则对应着不同的彩色,可以用原点到该点的矢量表示。

        RGB色彩模型的像素深度即指图像深度。像素深度是指每个像素所用位数(bit),像素深度确定了彩色图像中的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能的灰度级数。它决定了彩色图像中可出现的最多颜色数,或灰度图像中的最大灰度等级。

像素深度(图像深度)与颜色深度(色彩深度)的区别

        1、概念不同

        像素深度,是指存储每个像素所用的位数,也用它来度量图像的分辨率。像素深度决定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数。

        例如,一幅彩色图像的每个像素用R,G,B三个分量表示,若每个分量用8位,那么一个像素共用24位表示,就说像素的深度为24,每个像素可以是16 777 216(2的24次方)种颜色中的一种。在这个意义上,往往把像素深度说成是图像深度。表示一个像素的位数越多,它能表达的颜色数目就越多,而它的深度就越深。

        颜色深度,简单说就是最多支持多少种颜色。一般是用“位”来描述的。例如,如果一个图片支持256种颜色(如GIF格式),那么就需要256个不同的值来表示不同的颜色,也就是从0到255。用二进制表示就是从00000000到11111111,总共需要8位二进制数。所以颜色深度是8。

        2、原理不同

        RGB图像的每个像素用R,G,B三个分量表示,若每个分量用8位,那么一个像素共用24位表示,就说像素的深度为24。

        例如:BMP格式,支持红、绿、蓝各256种,不同的红绿蓝组合可以构成256的3次方种颜色,就需要3个8位的2进制数,总共24位。所以颜色深度是24。

        色彩深度表示的就是一个图像中的色彩精度,深度越大表示的色彩就越多。

         ③HSI模型、HSV模型

        HSI模型找那个H、S、I三分量分别表示色调、饱和度和亮度。

        H:(Hue)表示色调,用角度表示。它反映了该颜色最接近什么样的光谱波长,即反映了人眼对颜色的感觉。其中0°为红色,120°为绿色,240°为蓝色。0~240°覆盖了所有可见光谱的颜色,240°~300°是人眼可见的非光谱色。

        S:(Saturation)表示饱和度。它表示颜色浓淡的物理量,即颜色中所含的颜色数量的差别,通常用混入白光的比例来衡量。

        I:(Intensity)表示光照强度或亮度。它体现像素的整体亮度,亮度与具体的颜色无关。

         HSV(色调Hue,饱和度Saturation,纯度Value)也称HSB(B指Brightness)它与HSI很近似,最本质的区别是HSV中的V(亮度)和HSI中的I(亮度)不同。HSV中纯白的点对应在HSI中是中值灰度的点。由于两种模型中的I和V的不同导致了S(饱和度)的不同,即HSV的饱和度是相对纯自而言的,而HSI的饱和度是相对纯中值灰度而言的。

        当RGB颜色空间不足以区分检测目标与背景时,可以使用HSV/HSI进行尝试。例如,检测深蓝背景上的浅蓝色目标,可以使用饱和度或者明度进行区别;又如,当对RGB通道的图像进行平滑滤波等降噪操作时,图像的颜色分量将发生变化,而如果在HSI分量上操作则不会有这个问题。

        ④Bayer图像

        某些专业级相机会使用3个滤镜,分别将光线分为红绿蓝3个分量,以此来获取彩色图像。但是缺点成本搞,实用性不强。更多的做法是使用单芯片和一个Bayer滤色片过滤不同的颜色的光线并得到不同通道的颜色信息,用这种方法输出的图像就是Bayer图像,即每个像素只有一个颜色分量的图像。

        一般情况下,相机或者其驱动会自动对Bayer图像进行一些转换,并输出正常的RGB图像。但是有些时候,如果未使用Halcon的图像采集接口,而是用相机SDK采集的图像,则可能会输出未经过处理的Bayer图像。Bayer格式是相机内部的原始图像,一般后缀名为 .raw。

        将Bayer图像转换为RGB图像,可以使用cfa_to_rgb算子进行色彩转换。cfa_to_rgb将一个单通道彩色滤波器阵列图像转换为RGB图像。彩色滤波器阵列图像通常是由单片机CCD相机产生的。从彩色过滤器阵列图像到RGB图像的转换通常是在相机上完成的,或者是由用于抓取图像的帧抓取器的设备驱动程序执行的。然而,在某些情况下,设备驱动程序只是简单地将颜色过滤器数组图像不加修改地传递过去。在这种情况下,对应的HALCON帧捕获器接口通常将图像转换为RGB图像。因此,如果图像不是通过HALCON帧捕获器接口(grab_image或grab_image_async)捕获的,而是通过从帧捕获器SDK中调用函数获取的,并通过gen_imagel或gen_imagel_extern传递给HALCON,则通常使用cfa_to_rgb。

        Filters / Color图像颜色处理

        将单通道彩色滤波阵列图像为RGB图像。

cfa_to_rgb(CFAImage : RGBImage : CFAType, Interpolation : )

        CFAImage:输入参数,输入CFA图像。

        RGBImage:输出参数,输出RGB图像。

        CFAType:输入参数,表示CFA图像的类型,即采用哪种编码方式。默认'bayer_gb'。【'bayer_bg', 'bayer_gb', 'bayer_gr', 'bayer_rg'】

        Interpolation:输入参数,表示插值的方法。默认'bilinear'。【'bilinear', 'bilinear_dir'会减少插值后的锯齿,使边缘更平滑, 'bilinear_enhanced'在bilinear_dir的基础上优化了插值结果,使颜色更加真实,但是增加了更多的计算量】

        3、颜色的空间转换

        在图像处理的过程中,有时仅参考RGB颜色的空间无法得到理想的结果,这就需要对颜色空间做一些转换。

        Filters / Color

        将一个RGB图像转换成任意的颜色空间。

trans_from_rgb(ImageRed, ImageGreen, ImageBlue : ImageResult1, ImageResult2, ImageResult3 : ColorSpace : )

        ImageRed:输入参数,输入图像(红色通道)。

        ImageGreen:输入参数,输入图像(绿色通道)。

        ImageBlue:输入参数,输入图像(蓝色通道)。

        ImageResult1:输出参数,输出颜色变换后的第1通道图像。

        ImageResult2:输出参数,输出颜色变换后的第2通道图像。

        ImageResult3:输出参数,输出颜色变换后的第3通道图像。

        ColorSpace:输入参数,图像的颜色空间。默认'hsv'

【 'argyb', 'cielab', 'cielchab', 'cielchuv', 'cieluv', 'ciexyz', 'ciexyz2', 'ciexyz3', 'ciexyz4', 'hls', 'hsi', 'hsv', 'i1i2i3', 'ihs', 'lms', 'yiq', 'yuv'】

        Filters / Color

        将任意颜色空间的3个通道图像转换成RGB图像。

trans_to_rgb(ImageInput1, ImageInput2, ImageInput3 : ImageRed, ImageGreen, ImageBlue : ColorSpace : )

        ImageInput1:输入参数,输入第1通道图像。

        ImageInput2:输入参数,输入第2通道图像。

        ImageInput3:输入参数,输入第3通道图像。

        ImageRed:输出参数,输出变换后的red通道图像。

        ImageGreen:输出参数,输出变换后的green通道图像。

        ImageBlue:输出参数,输出变换后的blue通道图像。

        ColorSpace :输入参数,图像的颜色空间。默认'hsv'

【 'argyb', 'cielab', 'cielchab', 'cielchuv', 'cieluv', 'ciexyz', 'ciexyz2', 'ciexyz3', 'ciexyz4', 'hls', 'hsi', 'hsv', 'i1i2i3', 'ihs', 'lms', 'yiq', 'yuv'】

        Filters / Color

        创建一个颜色查找表(Look up Table,LUT),用于将RGB图像转换成另一个颜色空间。颜色查找表是一种预定义的颜色“索引”,可以将256色的RGB值进行指定。即将原始颜色通过查表的方法赋值为另一种颜色。

create_color_trans_lut( : : ColorSpace, TransDirection, NumBits : ColorTransLUTHandle)

        ColorSpace:输入参数,要转换操作的另一种颜色空间。默认'hsv',

范围【'argyb', 'cielab', 'cielchab', 'cielchuv', 'cieluv', 'ciexyz', 'ciexyz3', 'ciexyz4', 'ciexyz4', 'hls', 'hls', 'hsi', 'hsv', 'i1i2i3', 'ihs', 'lms', 'yiq', 'yuv'】

        TransDirection:输入参数,转换的方向。默认'from_rgb',范围'from_rgb', 'to_rgb'。

        NumBits:输入参数,输入图像的位数,也是输出图像的位数。默认8。

        ColorTransLUTHandle:输出参数,输出颜色空间变换查找表的LUT句柄。

        4、颜色通道的处理

        图像的通道是图像的组成像素的描述方式。举例来说,如果图像全部由灰色的点组成,只需要用一个灰度值就可以表示这个点的颜色,那么这个图像就是单通道的。如果这个点有彩色信息,那么描述这个点需要用到R、G、B3个通道,即用红色分量的颜色数量、绿色分量的颜色数量、蓝色分量的颜色数量共同描述这个点的颜色。因此,这样的彩色点组成的图像就具有3个通道。

        如果除了R、G、B颜色信息外,还想要用一张灰度图表示像素的透明度, 像素点在灰度图上对应的值是0,表示像素完全不发光;对应的值是255,表示像素完全显示,那么这个点就加入了透明度信息, 因而有4个通道。 这样的点组成的图像就是一幅四通道图像。     

        Image / Channel

        获取一个多通道图像的一个通道。

access_channel(MultiChannelImage : Image : Channel : )

        MultiChannelImage:输入参数,输入多通道图像。

        Image:输出参数,输出指定通道图像,存储并命名。

        Channel:输入参数,范围 1 ≤ Channel。

        Image / Channel

        计算图像的通道数。

count_channels(MultiChannelImage : : : Channels)

        MultiChannelImage:输入参数,输入多通道图像。

        Channels:输出参数,输出通道数。

        5、通道的分离与合并

        有时完整的RGB信息对于图像分析并没有明显的帮助,特定的颜色反而能帮助区分目标对象。

        Image / Channel

        把一个三通道的图像分解成三个图像。

decompose3(MultiChannelImage : Image1, Image2, Image3 : : )

        MultiChannelImage:输入参数,输入多通道图像。

        Image1:输出参数,输出图像1。

        Image2:输出参数,输出图像2。

        Image3:输出参数,输出图像3。

其他类似的算子还有:decompose2、decompose4、decompose5、decompose6、decompose7。

read_image(Image,'pcb_color.png')
decompose3(Image, ImageR, ImageG, ImageB)
threshold(ImageR, Region, 98, 255)
pcb_color
ImageR
ImageG
ImageB
阈值分割后的ROI

        Image / Channel

        将多通道图像转换为单通道图像

image_to_channels(MultiChannelImage : Images : : )

        MultiChannelImage:输入参数,输入需要分解的多通道图像。

        Images:输出参数,生成一个单通道图像。

        Image / Channel

        将3个通道图像合成一个多通道图像。

compose3(Image1, Image2, Image3 : MultiChannelImage : : )

        Image1:输入参数,输入图像1。

        Image2:输入参数,输入图像2。

        Image3:输入参数,输入图像3。

        MultiChannelImage:输出参数,输出多通道图像。

其他类似的算子有:compose2、compose4、compose5、compose6、compose7。

        Image / Channel

        将单通道图像转换为多通道图像。

channels_to_image(Images : MultiChannelImage : : )

        Images:输入参数,输入单通道图像。

        MultiChannelImage:输出参数,输出多通道图像。

参考文献:

杨青—《Halcon机器视觉算法原理与编程实战》

杜斌—《机器视觉 使用HALCON描述与实现》

图像处理--RGB与HSI颜色模型的转换方法介绍https://blog.csdn.net/yangleo1987/article/details/53171623RGB图像-像素、分辨率、相关概念https://blog.csdn.net/weixin_42914706/article/details/124080924

猜你喜欢

转载自blog.csdn.net/qq_45336030/article/details/124201670