QQ登录

只需一步,快速开始

工业视觉 halcon 颜色相关滤波器介绍

[ 复制链接 ]
rgb1_to_gray(RGBImage : GrayImage : : )
rgb1_to_gray将RGB图像转换为灰度图像。
RGB图像的三个通道作为输入图像的前三个通道传递。
图像按照如下公式进行变换:

gray = 0.299 * red + 0.587 * green + 0.114 * blue .


如果RGBImage中的一个输入图像是单通道图像,
那么它的引用将被简单地复制到输出灰度图像中。


1.rgb3_to_gray(ImageRed, ImageGreen, ImageBlue : ImageGray : : )
rgb3_to_gray将RGB图像转换为灰度图像。
RGB图像的三个通道作为三个单独的图像ImageRed, ImageGreen, ImageBlue传递。
图像按照如下公式进行变换:
gray = 0.299 * red + 0.587 * green + 0.114 * blue .


2.trans_from_rgb(ImageRed, ImageGreen, ImageBlue : ImageResult1, ImageResult2, ImageResult3 : ColorSpace : )
trans_from_rgb将图像从RGB颜色空间转换为任意颜色空间(ColorSpace )。
图像的三个通道在输入和输出时作为三个独立的图像传递。
输入三个通道对应ImageRed, ImageGreen, ImageBlue,输出三个通道对应ImageResult1, ImageResult2, ImageResult3。


对图像类型进行相应的缩放:
考虑到byte和uint2图像,颜色空间值域通常映射到[0...255年] 或[0 . .65535]的全域。
因此,带符号值的原点(例如CIELab)可能不在域的中心。


色调值由角[0..2PI表示,对特定的图像类型编码不同:

字节图像将角度域映射到[0..255]。


uint2/int4图像以弧分[0..21600]编码,但int4图像的转换“cielchab”和“cielchuv”除外,它们以弧秒[0..1296000]编码。


real图像以弧度[0..2pi]编码,除了转换“cielchab”和“cielchuv”,其中标准ISO 11664-4:2008和ISO 11664-5:2009要求以度数指定色调。


饱和度值以[0..100]的百分比表示,并针对特定的图像类型进行不同的编码:
字节图像将饱和度值映射到[0..255]。
uint2/int4图像将饱和度值映射到[0..10000]。
real图像将饱和度值映射到[0..1]。

函数支持的颜色空间域很多,
有 'argyb', 'cielab', 'cielchab', 'cielchuv', 'cieluv', 'ciexyz', 'ciexyz2', 'ciexyz3', 'ciexyz4', 'hls', 'hsi', 'hsv', 'i1i2i3', 'ihs', 'lms', 'yiq', 'yuv'

3.trans_to_rgb(ImageInput1, ImageInput2, ImageInput3 : ImageRed, ImageGreen, ImageBlue : ColorSpace : )
和函数trans_from_rgb对应,trans_to_rgb将图像从任意颜色空间(ColorSpace)转换为RGB颜色空间。
图像的三个通道在输入和输出时作为三个独立的图像传递。


4.linear_trans_color(Image : ImageTrans : TransMat : )
linear_trans_color对多通道图像的颜色值执行仿射变换,并在ImageTrans中返回结果。
颜色值的仿射变换用变换矩阵TransMat 来描述。
如果n是图像中的通道数,m是ImageTrans中的通道数,那么TransMat就是一个齐次的m×(n+1)矩阵,它逐行存储。
齐次表示TransMat 的左m×n子矩阵描述颜色值的线性变换,
TransMat 的最后一列描述颜色值的恒定偏移量。
转换矩阵通常用gen_principal_comp_trans计算。
特别是,通过选择gen_principal_comp_trans返回的转换的第一个m×(n+1)值,可以将一个图像投射到第一个m个主组件上。
但是,也可以直接指定转换。
例如,从RGB到YIQ的转换,它由以下转换等式描述

工业视觉 halcon 颜色相关滤波器介绍4

工业视觉 halcon 颜色相关滤波器介绍4

将TransMat=[0.299,0.587,0.114,0.0,0.599,-0.276,-0.324,127.5,0.214,-0.522,0.309,127.5], 可求解。
这里需要注意的是,上面的变换是不归一化的,即,则得到的颜色值可能位于范围[0,255]之外。
trans_from_rgb中的转换“yiq”还适当地扩展了矩阵的行(常量偏移除外)。


为了避免丢失信息,linear_trans_color返回一个real类型的图像。
如果需要不同的图像类型,则可以使用convert_image_type转换图像。

上面函数的例程:
read_image (Image, 'montery')
rgb1_to_gray (Image, GrayImage)
*
decompose3 (Image,R, G, B)
rgb3_to_gray (R, G, B, ImageGray)
*
trans_from_rgb (R, G, B, H, S, V, 'hsv')
*
trans_to_rgb (H, S, V, R, G, B, 'hsv')
compose3 (R, G, B, MultiChannelImage)



5.gen_principal_comp_trans(MultichannelImage : : : Trans, TransInv, Mean, Cov, InfoPerComp)
gen_principal_comp_trans计算多通道图像主成分分析的转换矩阵。
这对于用使用陆地卫星的专题地图获得的图像是有用的。
由于谱带高度相关,将其转换为不相关的图像是可取的。
这可以用来保存存储,因为可以丢弃包含少量信息的频带,并在以后的分类步骤中使用。

运算符gen_principal_comp_trans获取一个或多个多通道图像多通道图像,
并计算转换矩阵Trans用于主成分分析及其逆TransInv。
所有输入图像必须具有相同数量的通道。
主成分分析是在采集所有图像数据的基础上进行的。
因此,gen_principal_comp_trans便于使用多个图像的统计信息。


如果n是信道数,则Trans和TransInv是维数n×(n+1)的矩阵,表示多信道灰度值的仿射变换。
它们可以用来转换具有linear_trans_color的多通道图像。
为便于信息处理,分别以Mean和Cov的形式返回信道的平均灰度值和信道的n×n协方差矩阵。
参数InfoPerComp包含每个输出通道的相关信息内容。


函数5和函数4的例程:

*例程演示基于主成分分析的主成分分析数据约化
*使用二维直方图进行分类
*所使用的数据是一个ETM+图像与一个热通道
read_image (BavariaNorth7Channels, 'bavaria_north_7_channels.jp2')
get_image_size (BavariaNorth7Channels, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 主成分分析
gen_principal_comp_trans (BavariaNorth7Channels, Trans, TransInv, Mean, Cov, InfoPerComp)
linear_trans_color (BavariaNorth7Channels, ImageTrans, Trans)
decompose7 (ImageTrans, Channel1, Channel2, Channel3, Channel4, Channel5, Channel6, Channel7)
scale_image (Channel1, ImageScaled1, 1, 100)
scale_image (Channel2, ImageScaled2, 1, 100)
convert_image_type (ImageScaled1, Channel1Byte, 'byte')
convert_image_type (ImageScaled2, Channel2Byte, 'byte')
* 训练
gen_rectangle1 (Water, 970, 598, 998, 624)
gen_rectangle1 (Forest, 38, 428, 95, 488)
gen_rectangle1 (Field, 300, 462, 320, 483)
gen_cluster (Water, Channel1Byte, Channel2Byte, ClusterWater)
gen_cluster (Forest, Channel1Byte, Channel2Byte, ClusterForest)
gen_cluster (Field, Channel1Byte, Channel2Byte, ClusterField)
* 分类
class_2dim_sup (Channel1Byte, Channel2Byte, ClusterWater, Water)
class_2dim_sup (Channel1Byte, Channel2Byte, ClusterForest, Forest)
class_2dim_sup (Channel1Byte, Channel2Byte, ClusterField, Field)
* 结果显示
dev_display (Channel1Byte)
dev_set_color ('blue')
dev_display (Water)
dev_set_color ('lime green')
dev_display (Field)
dev_set_color ('forest green')
dev_display (Forest)
disp_message (WindowHandle, 'Forest', 'window', 10, 10, 'forest green', 'true')
disp_message (WindowHandle, 'Water', 'window', 50, 10, 'blue', 'true')
disp_message (WindowHandle, 'Field', 'window', 90, 10, 'lime green', 'true')
例程执行结果

工业视觉 halcon 颜色相关滤波器介绍2

工业视觉 halcon 颜色相关滤波器介绍2



6.cfa_to_rgb(CFAImage : RGBImage : CFAType, Interpolation : )
cfa_to_rgb将单通道彩色滤波器阵列图像CFAImage转换为RGB图像RGBImage。
彩色滤波器阵列图像通常由单片CCD相机产生。
从彩色滤光片阵列图像到RGB图像的转换通常在相机本身完成,
或者由用于抓取图像的帧抓取器的设备驱动程序执行。
然而,在某些情况下,设备驱动程序只是不加更改地传递颜色过滤器阵列图像。


在这种情况下,相应的HALCON帧抓取接口通常将图像转换为RGB图像。
因此,如果没有使用HALCON frame grabber接口(grab_image或grab_image_async)抓取图像,
而是使用frame grabber SDK中的函数调用抓取图像,
并使用gen_image1或gen_image1_extern将图像传递给HALCON,则通常使用操作符cfa_to_rgb。


参数:
CFAImage,RGBImage 分别为输入输出图像
CFAType 颜色过滤器数组类型,有'bayer_bg', 'bayer_gb', 'bayer_gr', 'bayer_rg'。
Interpolation 插值的类型,有 'bilinear', 'bilinear_dir', 'bilinear_enhanced'。


例程:
read_image (Image, 'patras')
simulate_bayer_image (Image, ImageCFA)
cfa_to_rgb (ImageCFA, RGBImage, 'bayer_gb', 'bilinear')
函数simulate_bayer_image 为halcon自带本地函数,

7.create_color_trans_lut( : : ColorSpace, TransDirection, NumBits : ColorTransLUTHandle)
create_color_trans_lut返回一个查找表(LUT),用于将8位RGB图像的颜色空间转换为不同的颜色空间,反之亦然。
这意味着,该操作符只对三个通道图像有效,其中每个通道都有类型为“byte”的像素。
如果输入图像具有不同的域,则只使用三个输入图像的交集进行转换。


参数ColorSpace标识初始或目标颜色空间转换,转换方向由TransDirection设置。
ColorTransLUTHandle包含创建的查找表的句柄。


使用LUT可以显著加快RGB图像到另一个颜色空间的转换过程,反之亦然,
除了“yiq”、“yuv”、“argyb”、“ciexyz”和“i1i2i3”颜色空间之外。
注意,LUT已经需要48MB的内存空间。
有关可能的颜色空间转换的进一步信息,请参见trans_from_rgb和trans_to_rgb操作符的描述。


8.clear_color_trans_lut( : : ColorTransLUTHandle : )
clear_color_trans_lut释放由create_color_trans_lut创建的查找表的内存。
调用clear_color_trans_lut后,句柄ColorTransLUTHandle无效。


9.apply_color_trans_lut(Image1, Image2, Image3 : ImageResult1, ImageResult2, ImageResult3 : ColorTransLUTHandle : )
apply_color_trans_lut使用预先生成的查找表将3通道图像从RGB颜色空间转换为其他颜色空间,反之亦然。
三个输入通道为Image1, Image2, Image3 ,对应三个输出通道为ImageResult1, ImageResult2, ImageResult3 。

函数7,8,9例程为:
* 比较使用带或不带LUT的trans_from/to_rgb进行颜色空间转换的处理时间差
dev_update_off ()
duration_without_lut := []
duration_with_lut := []
duration_without_lut2 := []
duration_with_lut2 := []
Spaces := ['',' ','  ','   ','    ','     ']
NumLoops := 10
read_image (Image, 'montery')
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, [600,800], [400,600], WindowHandle)
decompose3 (Image, Image1, Image2, Image3)
* 从RGB进行颜色空间转换
get_param_info ('trans_from_rgb', 'ColorSpace', 'value_list', ColorSpace)
for Index := 0 to |ColorSpace| - 1 by 1
    Time1 := 0
    Time2 := 0
    Time3 := 0
    create_color_trans_lut (ColorSpace[Index], 'from_rgb', 8, ColorTransLUTHandle)
    trans_from_rgb (Image1, Image2, Image3, ImageResult11, ImageResult21, ImageResult31, ColorSpace[Index])
    apply_color_trans_lut (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, ColorTransLUTHandle)
    for Index1 := 0 to NumLoops by 1
        count_seconds (Seconds1)
        trans_from_rgb (Image1, Image2, Image3, ImageResult11, ImageResult21, ImageResult31, ColorSpace[Index])
        count_seconds (Seconds2)
        apply_color_trans_lut (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, ColorTransLUTHandle)
        count_seconds (Seconds3)
        Time1 := Seconds1 + Time1
        Time2 := Seconds2 + Time2
        Time3 := Seconds3 + Time3
    endfor
    TimeWithoutLUT := (Time2 - Time1) / NumLoops * 1000
    TimeWithLUT := (Time3 - Time2) / NumLoops * 1000
    if (TimeWithLUT > TimeWithoutLUT * 1.1)
        FontColor := 'red'
    elseif (TimeWithoutLUT > TimeWithLUT * 1.1)
        FontColor := 'forest green'
    else
        FontColor := 'black'
    endif
    Tab := '         ' + Spaces[8 - strlen(ColorSpace[Index])]
    disp_message (WindowHandle, ColorSpace[Index] + Tab + TimeWithLUT$'.2f' + ' ms' + TimeWithoutLUT$'11.2f' + ' ms  ', 'window', 80 + Index * 20, 12, FontColor, 'true')
    duration_without_lut := [duration_without_lut,TimeWithoutLUT]
    duration_with_lut := [duration_with_lut,TimeWithLUT]
    clear_color_trans_lut (ColorTransLUTHandle)
endfor
执行结果

工业视觉 halcon 颜色相关滤波器介绍1

工业视觉 halcon 颜色相关滤波器介绍1

可以看出带LUT的转换要快很多。


  

halcon从自学到接项目视频教程,另外再赠送全网最全资源  

  

欢迎围观我录制的一套halcon自学视频教程(进入)





回复

使用道具 举报

快速回复 返回列表 客服中心 搜索