zoukankan      html  css  js  c++  java
  • 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图像转换为其他颜色模型的图像

  • 相关阅读:
    MySQL 快速删除大量数据(千万级别)的几种实践方案——附源码
    Elasticsearch 通过Scroll遍历索引,构造pandas dataframe 【Python多进程实现】
    MySQL LOAD DATA INFILE—从文件(csv、txt)批量导入数据
    【Java】 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、ArrayIndexOutOfBoundsException、ArrayStoreException、ArithmeticException等没有异常堆栈信息
    技术人“结构化思维”训练的一点想法和实践
    gitlab内存消耗大,频繁出现502错误的解决办法
    Tesseract-OCR 4.1.0 安装和使用— windows及CentOS
    Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址
    记一次Elasticsearch OOM(内存溢出)的优化过程—基于segments force merge 和 store type 转为 hybridfs
    ElasticSearch如何一次查询出全部数据——基于Scroll
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14439783.html
Copyright © 2011-2022 走看看