迭代阀值

迭代阀值_第1张图片

///***************************************************************/           
/*函数名称:Diedaifazhi(int *tongji)                                       
/*函数类型:void
/*参数说明:tonji     ---直方图灰度值统计                                      
/*功能:对图像进行迭代阀值选取。            
/***************************************************************/ 
void BingXingBianJieDib::Diedaifazhi(int *tongji)
{
    // 循环变量
	LONG i;
	LONG j;
	// 指向DIB象素指针
	LPBYTE p_data;
	// 找到DIB图像象素起始位置
	p_data = GetData();
	// DIB的宽度
	LONG wide = this->GetDibWidthBytes();
	// DIB的高度
	LONG height = this->GetHeight();
	// 迭代阀值
	int T1, T2;
	T1 = 127;
	T2 = 0;
	// 临时变量
	int Temp0, Temp1, Temp2, Temp3;
	Temp0 = Temp1 = Temp2 = Temp3 = 0;
	while (true)
	{
		// 计算下一个迭代阀值
		for (i = 0; i < T1 + 1; i++)
		{ 
			//计算该灰度级区间像素灰度总和,tongji[i]为灰度级为i的数量,i为灰度级
			Temp0 += tongji[i] * i; 
			//计算该灰度级区间像素数
			Temp1 += tongji[i];     
		}
		for (i = T1 + 1; i < 256; i++)
		{
			Temp2 += tongji[i] * i;
			Temp3 += tongji[i];
		}
		//计算平均灰度,区间灰度总和/区间像素数
		T2 = (Temp0 / Temp1 + Temp2 / Temp3) / 2;    
		// 看迭代结果是否已收敛
		if (T1 == T2)
			break;
		else
			T1 = T2;
	}
	// 对各像素进行灰度转换
	for (j = 0; j < height; j ++)
	{
		for (i = 0; i < wide; i ++)
		{
			// 读取像素
			unsigned char temp = *((unsigned char *)p_data + wide * j + i);
			// 判断像素灰度值是否超出范围
			if (temp < T1)
				temp = 0;
			else
				temp = 255;
			// 回写处理完的像素
			*((unsigned char *)p_data + wide * j + i) = temp;
		}
	}
}

该Dib类有一成员变量:

int tongji[256];

统计函数如下:

///***************************************************************/           
/*函数名称:Fenbutongji(int *tongji)                                      
/*函数类型:void
/*参数说明:tonji     ---直方图灰度值统计                                      
/*功能:对图像进行灰度值统计。            
/***************************************************************/ 
void BingXingBianJieDib::Fenbutongji(int *tongji)
{
	// 循环变量
	LONG i;
	LONG j;
	//变量初始化
	memset(tongji,0,sizeof(int) * 256);
	// 指向DIB象素指针
	LPBYTE p_data;
	// 找到DIB图像象素起始位置
	p_data = this->GetData();
	// DIB的宽度
	LONG wide = GetDibWidthBytes();
	// DIB的高度
	LONG height = GetHeight();
	// 对各像素进行灰度转换
	for (j = 0; j < height; j ++)
	{
		for (i = 0; i 




你可能感兴趣的:(图像处理)