Otsu

博客介绍了Otsu算法及其变种。Otsu是最简单的分割算法,原理是将像素分类,找到使类间方差最大的阈值,与机器学习聚类思想一致。其变种包括多阈值处理和基于局部的阈值,还给出代码并用opencv自带算法验证结果一致。

Otsu及变种

 

Otsu基本上最简单的分割了,原理很简单,就是将像素分类,找到使类间方差最大的阈值。就和机器学习中聚类思想一致。

其变种就是多阈值处理,和基于局部的阈值。

过程总结如下:

代码如下:

 1 int Otsu_local(Mat src)
 2 {
 3     int hist[256] = { 0 };
 4     int IMGH = src.rows;
 5     int IMGW = src.cols;
 6     
 7     for (int i = 0; i < IMGH; i++)
 8     {
 9         for (int j = 0; j < IMGW; j++)
10         {
11             hist[int(src.at<uchar>(i,j))]++;
12         }
13     }
14     float w0 ; 
15     float w1 ;
16     float u0 ;
17     float u1 ;
18     float maxvar = 0;
19     int T;
20     for (int k = 0; k < 256; k++)
21     {
22          w0 = 0;
23          w1 = 0;
24          u0 = 0;
25          u1 = 0;
26          for (int i = 0; i < k; i++)
27          {
28              w0 += hist[i];
29              u0 += i*hist[i];
30          }
31          for (int j = k; j < 256; j++)
32          {
33              w1 += hist[j];
34              u1 += j*hist[j];
35          }
36 
37          w0 /= (IMGW*IMGH);
38          w1 /= (IMGW*IMGH);
39          u0 /= w0;
40          u1 /= w1;
41         
42          float var = w0*w1*(u1 - u0)*(u1 - u0);
43          if (var > maxvar){
44              maxvar = var;
45              T = k;
46          }
47 
48     }
49     return T;
50 
51 }

使用opencv自带的算法做验证,结果一致

 1 int n=threshold(gray, temp, 0, 255, CV_THRESH_OTSU); 

转载于:https://www.cnblogs.com/the-home-of-123/p/10927921.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值