基于阈值的图像分割方法

1. 直方图双峰法(mode 法)

  Prewitt 等人于六十年代中期提出的直方图双峰法(也称 mode 法) 是典型的全局单阈值分割方法。该方法的基本思想是:假设图像中有明显的目标和背景,则其灰度直方图呈双峰分布,当灰度级直方图具有双峰特性时,选取两峰之间的谷对应的灰度级作为阈值。如果背景的灰度值在整个图像中可以合理地看作为恒定,而且所有物体与背景都具有几乎相同的对比度,那么,选择一个正确的、固定的全局阈值会有较好的效果。例如图4.1所示:

图4.1原始灰度图像

图4.2灰度直方图

选定阈值M为100

 

算法实现:找到第一个峰值和第二个峰值, 再找到第一和第二个峰值之间的谷值,谷值就是那个阀值了。

 

2. 固定阈值分割

  就是设定一个固定的值, 像素灰度大于就该像素编程0或者255或者其他的,小于的又等于什么的。

 1 for (int i = 0; i < nWidth; ++i)
 2 {
 3     for (int j = 0; j < nHigh; ++j)
 4     {
 5         if (Image[i][j] >= 阈值)
 6         {
 7             Image[i][j] = 255;
 8         }
 9         else
10         {
11             Image[i][j] = 0;
12         }
13     }
14 }

 

  这个阈值选什么值呢, 1中的双峰法就是一个阈值产生的方法。

 

3. 半阈值分割

 1 for (j = 0; j < height; j++)
 2 {
 3     for (i = 0; i < wide; i++)
 4     {
 5         lpSrc = p_data + wide*j + i;
 6         lpDst = temp + wide*j + i;
 7 
 8         if ((*lpSrc - 阈值) < 30)
 9             *lpDst = *lpSrc;
10         else
11             *lpDst = 255;
12     }
13 }

  不知道为什么这么做, 为什么这样就叫做半阈值?

 

4. 迭代阈值图像分割

http://topic.csdn.net/u/20080402/10/d3cb6789-fa60-4758-b232-7a89926f07b9.html

迭代法是基于逼近的思想,其步骤如下: 

1. 求出图象的最大灰度值和最小灰度值,分别记为ZMAX和ZMIN,令初始阈值T0=(ZMAX+ZMIN)/2; 

2. 根据阈值TK将图象分割为前景和背景,分别求出两者的平均灰度值ZO和ZB 

3. 求出新阈值TK+1=(ZO+ZB)/2; 

4. 若TK==TK+1,则所得即为阈值;否则转2,迭代计算。 

我想问下,ZO和ZB怎么求??

 

1. 统计图像灰度直方图

2. 找到最大灰度值ZMAX和最小灰度值ZMIN,并计算T0 =(ZMAX+ZMIN)/2

3. 计算小于T0的所有灰度的均值ZO和大于T0的所有灰度的均值ZB(用直方图求就可以)。

例如,你的直方图从10到250有值,则T0 = 260/2 = 130.

1 ZO = Sum(nHist[i] * i) / Sum(nHist[i]); 10 <= i <= 130
2 BO = Sum(nHist[i] * i) / Sum(nHist[i]); 131 <= i <= 250

  /

 1 ZO = .0, ZB = .0;
 2 int nB = 0, nO = 0;
 3 BYTE bytVal = 0;
 4 
 5 while (还有图像数据没读完)
 6 {
 7     bytVal = ReadNextPixel();
 8     if (bytVal > T0)
 9     {
10         ZB += bytVal;
11         ++nB;
12     }
13     else
14     {
15         ZO += bytVal;
16         ++nO;
17     }
18 }
19 ZO /= nO;
20 ZB /= nB;

  //

伪代码1

A. 找到灰度图中最大灰度nZmax和最小灰度nZmin(代码略)

B. 求T0。

1 T0 = (nZmax + nZmin) / 2;

C. 迭代了求出阈值

 1 int i;
 2 while (true)
 3 {
 4     // 计算下一个迭代阀值
 5     for (i = 0; i < T0 + 1; i++)
 6     {
 7         Temp0 += tongji[i] * i;
 8         Temp1 += tongji[i];
 9     }
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值