Halcon 图像分割

一   图像分割之阈值分割:

请参见halcon例程:gray_histo.hdev

此例程中主要用到两个算了:

1.gray_histo(Regions,Image:::AbsoluteHisto,RelativeHisto)

作用:获得图像的某一指定区域内的灰度分布,将数据写入到参数AbsoluteHisto和RelativeHisto

其中AbsoluteHisto是指图像内0-255灰度值出现的次数。

RelativeHisto:将上面的出现次数转化为频率,总合为1。

 

2.gen_region_histo(:Region:Histogram,Row,Column,Scale:)

作用:把获得的灰度分布图转换为区域region输出

region:输出参数,

Histogram:上一个算子中提到的图像内0-255灰度值出现的次数。

Row,Column:生成的区域的中心坐标

Scale:region直方图的缩小尺度

 

3.阈值分割算子:

threshold(Image:Region:MinGray,MaxGray:)

作用:将灰度值在MinGray-MaxGray范围的region输出

此算子之前提到过,要注意的是 此算子如果是输入的是一张RGB彩色图,那么它只对此图的第一通道进行阈值分析。

4.阈值分割算子:

auto_threshold(Image:Regions:Sigma:)

作用:对单通道图像做自动阈值,多阈值分割。

其中Sigma为灰度直方图的高斯标准差,光滑消除噪声

5.阈值分割算子:

bin_threshold(Image:Region::)

作用:提取背景为白色,且前后背景较为分明,自动选取Sigma值进行高斯光滑处理,光滑直到最后只有一个最小值。例如提取白纸黑字,可以应用此算子。

 

6.阈值分割算子:

char_threshold(Image,HistoRegion:Characters:Sigma,Percent:Threshold)

作用:阈值分割提取字符

Image:原图像,要做字符提取的图像

HistoRegion:要提取字符所在的region

Characters:提取到的region

Sigma:高斯光滑因子

Percent:灰度直方图中的灰度值差的百分比

Threshold:输出用于阈值处理的阈值

此方法关键在于找到直方图中的最大值,在最大值的左侧找到读取阈值。可参考char_threshold.hdev例程

 

7.阈值分割算子:

dual_threshold(Image:RegionCrossings:MinSize,MinGray,Threshold:)

作用:分割符号图像的阈值处理,通常和算子:diff_of_gauss  sum_image等算子一起使用,就像前后两帧做差得到的图像(差帧法),像素值有正值有负值(灰度值有正负之分)

Image:输入的符号图像

RegionCrossings:输出的区域

MinSize:输出的区域最小值(限制条件)

MinGray:输出的区域灰度值的绝对值必须大于MinGray

Threshold:输出的区域灰度值的绝对值必须大于Threshold  注意这里是绝对值 参见帮助文档

具体使用可参见dual_threshold.hdev例程

算子:

convert_image_type(Image:ImageConverted:NewType:)

作用:转换图像类型

Image:要转换的图像类型

ImageConverted:转换后的图像

NewType:指定一种图像类型(int1, int2, uint2, int4, int8, byte,  real,  direction, cyclic, complex)

然后两图做差,获得的是,像素值有正有负,图像做差算子:

sub_image(ImageMinuend, ImageSubtrahend, ImageSub,Mult,Add)

作用:两图像对应灰度值做差。

运算:ImageSub = (ImageMinuend-ImageSubtrahend)*Mult+Add

 

8.阈值分割算子:

dyn_threshold(OriImage,ThresholdImage:RegionDynThreh:Offset,LightDark:)

作用:动态阈值,不是全局阈值,而是局部阈值,它是根据像素周围的情况来决定阈值,一般和光滑算子mean_image()一起使用,这样才能将其他像素值与它周围的像素做比较,这个  算子可以取暗边界区域,或者亮边界区域,一般应用灰度值边界区域提取。

OriImage:单通道原图像

ThresholdImage:用于对比局部阈值的图像

RegionDynThreh:阈值分割后获得的区域

Offset:原图像与对比图像的像素值比较抵消值

LightDark:决定选取是暗边界还是亮边界及相似边界。。。如果LightDark='light'等价于:OriImage >= ThresholdImage+Offset。如果LightDark='dark' 等价于OrigImage>=ThresholdImage+Offset 。 如果LightDark='equal'等价于:ThresholdImage-Offset <=OrigImage<=ThresholdImage+Offset。 如果LightDark='not_equal'等价于:ThresholdImage-Offset>OrigImage  or  OrigImage>ThresholdImage+Offset

 

 

9.阈值分割算子var_threshold

var_threshold也是局部阈值,根据(掩模)局部均值和标准差来做阈值分割;与dyn_threshold有相似之处。

 

参见dyn_threshold.hdev例程

其中有个算子:fill_interlace()作用是修改在采集图像过程中造成的两个半幅图像拼接的问题

 

 

二 图像分割之彩色分割:

彩色图像有多种常见的颜色模式,比如RGB,YUV,HSV,CMYK等,这里介绍RGB和HSV颜色模型

1.RGB通道

RGB分别代表哪种颜色就不用多说了,在图像数据的存储中,每一个像素点颜色都是有RGB三个颜色综合表示,其中RGB各占一个字节,也就是RGB它们的值范围是0-255,这样就把颜色分为256个等级,三通道共可以表示 256*256*256种颜色,大约1600W种颜色,可以代表了自然界中所有的颜色。

那么假如我们现在有一幅图像,是纯红色的图像,那它的每一个像素值都应该是:R 255,G 0, B 0; 我们先准备这样一张图像.

然后我们用halcon打开这个图像,打开图像后,把这幅图分开三通道RGB:

选择菜单..算子..image..channel..decompose3;

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

作用:转换三通道图像为三个单通道的图像

MultiChannelImage:输入的要转换的多通道图像

Image1:转换的第一个通道图像,对应Red红色

Image2:转换的第二个通道图像,对应Green绿色

Image3:转换的第三个通道图像,对应Blue蓝色

 

应用以上算子分解后,其中得到的第一通道图像红色通道是一副白色图像,,而绿色和蓝色通道是黑色图像,为什么会出现这种现象????

因为这是一张纯红色图像,那么他的所有像素值应该是R 255,G 0, B 0, 所以转换后,R通道的所有像素值是255,纯白色图像,而G和B通道都是0,纯黑色图像...红颜色在R通道中比较明显,同理,绿颜色和蓝色分别在G和B通道中比较明显;

 

这里有个技巧:在图形窗口上,显示一张图像时,按住Ctrl键不放,鼠标放在图像上,显示:位置和像素值

 

HSV颜色模型:

这个模型中颜色的参数分别是:色相(H),饱和度(S),明亮度(V)

色相(H):是色彩基本属性,就是平常所说的颜色,如红色,黄色等取值0-360

饱和度(S)是色彩的纯度,越高色彩越纯,低则逐渐变淡,取值0-1;它表示成所选颜色的纯度和该颜色最大的纯度之间的比率.S=0时,只有灰度.

明亮度(V)是色彩的明亮程度,范围从0-1.有一点要注意,它和光强度之间并没有直接的联系.

那么HSV怎么表示颜色呢? 以我们上面的问题为例,怎么表示红色??首先从色相H上来说,基本属性颜色,大致H取360左右为红色,饱和度S取值0-1,当S取1时,颜色最浓,取0时最淡.

利用算子:trans_from_rgb(ImageRed, ImageGreen, ImageBlue:ImageResult1, ImageResult2,ImageResult3:ColorSpace:)

可以将一个rgb图像转换为其他颜色模型的图像

原文地址:https://www.cnblogs.com/ybqjymy/p/14439783.html