本篇主要讲全局阈值的处理
使用的方法主要是迭代法
使用迭代法的主要步骤
1:确定一个全局阈值T(一般初始值为整幅图像的平均值,书上这么说的)
2:用T将图像分割成两类,分别求两类的均值m1和m2,得到T1=(m1+m2)/2
3:取T和T1的差值,如果要小于预定义参数△T(预定义参数不知道如何设置),则取为阈值,反之重复步骤2,3
也是照着被人的代码写的,结合自己自己理解,但是感觉这种方法没有多大的用,有经验的大神指点下
在这里插入代码片
void Iteration_Threshold(unsigned char *src_image, unsigned char *dst_iamge, int height, int width, int delt)
{
int i = 0, j = 0;
double image_sum = 0.0;
double image_ave = 0.0;
double image_ave1 = 0.0;
int index = 0;
double m1 = 0.0, m2 = 0.0;
double m1_sum = 0.0, m2_sum = 0.0;
int m1_num = 0, m2_num = 0;
unsigned char *psrc_image = src_image;
unsigned char *pdst_image = dst_iamge;
//求所有像素的和
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
index = i * width + j;
image_sum += psrc_image[index];
}
}
//求平均灰度值
image_ave = image_sum / (double)(height * width);
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
index = i * width + j;
if (psrc_image[index] <= image_ave)
{
m1_sum += psrc_image[index];
m1_num++;
}
else
{
m2_sum += psrc_image[index];
m2_num++;
}
}
}
//平均值
if (m1_num != 0)
m1 = m1_sum / m1_num;
if (m2_num != 0)
m2 = m2_sum / m2_num;
image_ave1 = 0.5*(m1 + m2);
while (fabs(image_ave-(0.5*(m1 + m2))) > delt)
{
image_ave = 0.5*(m1 + m2);
m1_sum = 0.0;
m2_sum = 0.0;
m1_num = 0;
m2_num = 0;
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
index = i * width + j;
if (psrc_image[index] <= image_ave)
{
m1_sum += psrc_image[index];
m1_num++;
}
else
{
m2_sum += psrc_image[index];
m2_num++;
}
}
}
//平均值
if (m1_num != 0)
m1 = m1_sum / m1_num;
if (m2_num != 0)
m2 = m2_sum / m2_num;
}
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
index = i * width + j;
if (psrc_image[index] > image_ave)
pdst_image[index] = 0xff;
else
pdst_image[index] = 0;
}
}
}