c语言数字图像处理(十):阈值处理

定义 全局阈值处理

假设某一副灰度图有如下的直方图,该图像由暗色背景下的较亮物体组成,从背景中提取这一物体时,将阈值T作为分割点,分割后的图像g(x, y)由下述公式给出,称为全局阈值处理

c语言数字图像处理(十):阈值处理

c语言数字图像处理(十):阈值处理

 

多阈值处理

c语言数字图像处理(十):阈值处理

c语言数字图像处理(十):阈值处理

本文仅完成全局阈值处理的算法实现

基本全局阈值处理方法

1. 为全局阈值T选择一个初始的估计值

2. 用T分割图像,产生两组像素:G1由大于T的像素组成,G2由小于T的像素组成

3. 对G1和G2的像素分别计算平均灰度值m1和m2

4. 计算新的阈值T = 1/2 * (m1 + m2)

5. 重复步骤2-4,直到连续迭代中的T值差小于一个预定义的参数ΔT

算法实现

1 void threshold(short** in_array, short** out_array, long height, long width, int delt_t) 2 { 3 double T = 0xff / 2.0; 4 double m1 = 0.0, m2 = 0.0; 5 int m1_num = 0, m2_num = 0; 6 7 while(dabs(T, 0.5*(m1 + m2)) > delt_t){ 8 T = 0.5 * (m1 + m2); 9 m1 = 0.0; 10 m2 = 0.0; 11 m1_num = 0; 12 m2_num = 0; 13 14 for (int i = 0; i < height; i++){ 15 for (int j = 0; j < width; j++){ 16 if (in_array[i][j] <= T){ 17 m1 += in_array[i][j]; 18 m1_num++; 19 } 20 else{ 21 m2 += in_array[i][j]; 22 m2_num++; 23 } 24 } 25 } 26 if (m1_num != 0) 27 m1 /= m1_num; 28 if (m2_num != 0) 29 m2 /= m2_num; 30 printf("%lf\n", T); 31 } 32 for (int i = 0; i < height; i++){ 33 for (int j = 0; j < width; j++){ 34 if (in_array[i][j] <= T) 35 out_array[i][j] = 0xff; 36 else 37 out_array[i][j] = 0x00; 38 } 39 } 40 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyysj.html