zoukankan      html  css  js  c++  java
  • 图像分割

    一   图像分割之阈值分割:

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

      

      

      

      

      

  • 相关阅读:
    BZOJ1119: [POI2009]SLO
    BZOJ1486: [HNOI2009]最小圈
    BZOJ1098: [POI2007]办公楼biu
    BZOJ2242: [SDOI2011]计算器
    PAT A1023
    SpringCloud之整合Feign
    SpringCloud之整合Feign
    小程序在wxml页面格式化类似的2019-02-16T10:54:47.831000时间
    小程序在wxml页面格式化类似的2019-02-16T10:54:47.831000时间
    Javascript基础之-var,let和const深入解析(二)
  • 原文地址:https://www.cnblogs.com/xiejiulong/p/3822231.html
Copyright © 2011-2022 走看看