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 }