Halcon 中实现 Otsu 算法

Halcon 中的全局阈值分割算子 binary_threshold 中,Method =  'max_separability' 指的就是Otsu法(最大类间方差法,有时也称之为大津算法)。

Otsu 算法也叫全局最优阈值处理,使用聚类思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找一个合适的灰度级别来划分。 所以可以在二值化的时候采用otsu算法来自动选取阈值进行二值化。otsu算法被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响。因此,使类间方差最大的分割意味着错分概率最小。

设t为设定的阈值。

wo: 分开后 前景像素点数占图像的比例

uo: 分开后 前景像素点的平均灰度

w1:分开后 被景像素点数占图像的比例

u1: 分开后 被景像素点的平均灰度

u=w0*u0 + w1*u1 :图像总平均灰度


从L个灰度级遍历t,使得t为某个值的时候,前景和背景的方差最大, 则 这个 t 值便是我们要求得的阈值。

其中,方差的计算公式如下:

g=wo * (uo - u) * (uo - u) + w1 * (u1 - u) * (u1 - u)

[ 此公式计算量较大,可以采用: g = wo * w1 * (uo - u1) * (uo - u1) ]

基本的计算步骤如上面讲的那样,然后我们在Haclon中自己来实现代码:

get_image_size (srcImage, Width, Height)
* 最大方差初始化为0
otu:=[]
MaxVariance := 0.0
* 自动计算的最佳阈值
BsetThreshold := []
* 前景区域的灰度均值
Mean0 := []
* 背景区域的灰度均值
Mean1 := []
* 图像像素点总个数
PixelSum := Width * Height
tuple_real (PixelSum, PixelSum)
* 前景区域的像素点个数
Area0 := []
* 背景区域的像素点个数
Area1 := []
for ImgThreshold := 1 to 255 by 1
    dev_display (srcImage)
    * 区域分割
    threshold (srcImage, Region, ImgThreshold, 255)
    * 获得前景区域像素个数
    area_center (Region, Area0, Row, Column)
    * 获得前景区域均值和方差
    intensity (Region, srcImage, Mean0, Deviation)
    * 获得背景区域像素个数、均值和方差
    difference (srcImage, Region, RegionDifference)
    area_center (RegionDifference, Area1, Row1, Column1)
    intensity (RegionDifference, srcImage, Mean1, Deviation1)
    * 计算类间方差
    Otsu := Area0/PixelSum * Area1/PixelSum * pow(Mean0-Mean1,2)
    * 获取最大类间方差最佳阈值
    otu:=[otu,Otsu]
    if (Otsu > MaxVariance)
        MaxVariance := Otsu
        BestThreshold := ImgThreshold
    endif 
endfor

我在Halcon中对代码进行了封装,生成了一个.hdvp外部函数 threshold_Otsu(Image : Region : LightDark : UsedThreshold) ,可以直接调用使用,调用方法如下所示:

read_image (Image, 'particle')
threshold_Otsu (Image, Region1, 'Light', UsedThreshold1)
binary_threshold (Image, Region2, 'max_separability', 'light', UsedThreshold2)

看一下最终的实现效果:

(1)使用 threshold_Otsu 自动阈值分割后的图像

(2)使用 binary_threshold 自动阈值分割后的图像

从图像上看结果与 Halcon 中算子的实现效果一样,看一下输出的自动计算出的阈值:

计算出的结果基本一样,说明我们写的算法正确。


附完整代码的下载链接:

threshold_Otsu.hdvp

https://download.csdn.net/download/integralforlove/11620453


转载自:https://blog.csdn.net/IntegralforLove/article/details/100102105


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864