首页 > 代码库 > 图像分割

图像分割

一   图像分割之阈值分割:

  请参见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图像转换为其他颜色模型的图像