【数字图像处理】7.1:灰度图像-图像分割 阈值处理之平均阈值

Abstract: 数字图像处理:第50天
Keywords: 阈值处理,平均阈值

本文最初发表于csdn,于2018年2月17日迁移至此

灰度图像-图像分割 阈值处理之平均阈值

好久没写博客了,已然不熟练了,过完年整个人都不好了,哈哈,到刚才为止算是把图像分割学习了一下,这两天把学习结果和代码简单总结一下。
前面已经介绍了边缘检测,和边缘修复,阈值处理的基本概念也进行了一定介绍。阈值处理速度快,算法简单,所以应用比较广泛,算法的基本问题在于计算出阈值处理的阈值,在接下来的几篇我可,介绍几种确定阈值的算法,基本数学知识都来自统计学,包括最简单的平均数,p-分位数,方差等数学知识。
下面就从最简单的均值阈值开始介绍。

平均阈值

均值处理属于阈值中最简单的一种,其使用的一副图像所有灰度的均值作为阈值,分割图像。
根据统计学知识,求均值可以使用概率方法:

  1. 计算图像灰度直方图
  2. 归一化直方图,得出直方图每一项的概率
  3. 直方图的横坐标与概率的成绩然后求和
    $threshold=mean=\sum^{L-1}_{i=0}p(i)\times i$

根据以上均值得到阈值,然后根据阈值处理基本公示处理整幅图像。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
////计算从start到end的直方图的平均值,hist未归一化
double getMeaninHist(int start,int end,int *hist){
int hist_count=0;
double hist_value=0;
for(int i=start;i<end;i++){
hist_count+=hist[i];
hist_value+=(double)hist[i]*i;
}
return hist_value/(double)hist_count;
}
/*********************************************************************************/
/*********************************************************************************/
//均值法求阈值
//阈值等于全图的像素的平均值
void MeanThreshold(double *src,double *dst,int width,int height,int type){
int hist[GRAY_LEVEL];
double threshold_value=0.0;
InitHistogram(hist);
setHistogram(src, hist, width,height);
threshold_value=getMeaninHist(0, GRAY_LEVEL, hist);
Threshold(src,dst, width, height, threshold_value,type);
}

结果

观察一下结果:


原图:

原图直方图:

平均阈值:

阈值处理结果:


原图加入1%的高斯噪声
未处理:

直方图:

平均阈值:

阈值处理结果:


原图加入5%的高斯噪声
未处理:

直方图:

平均阈值:

阈值处理结果:


原图加入7%的高斯噪声
未处理:

直方图:

平均阈值:

阈值处理结果:


lena图均值阈值处理:
原图:

处理后结果:

阈值:

总结

均值阈值可以完成一些较为简单的的处理,但对目标与背景的大小敏感,也就是直方图那两个峰的面积大小有关,如果这两个峰相对大小相差不多,那么均值相对效果较好,如果两个峰相差太多,也就是背景比目标大很多或相反目标比背景大很多时,结果失效。其次也受到噪声影响,但没有上一因素影响大。

0%