www.pudn.com > vcpinhuachuli.rar > ZaoShengXiaoChuDib.cpp


#include "stdafx.h" 
#include "windowsx.h" 
#include "math.h" 
#include "ZaoShengXiaoChuDib.h" 
#include "MainFrm.h" 
#include "DSplitView.h" 
  
ZaoShengXiaoChuDib::ZaoShengXiaoChuDib() 
{ 
 
} 
 
ZaoShengXiaoChuDib::~ZaoShengXiaoChuDib() 
{ 
} 
 
/***************************************************************/            
/*函数名称:GuDing()                                           */ 
/*函数类型:void                                               */ 
/*参数:int Yuzhi,设定的阈值                                  */ 
/*功能:对图像使用固定阈值法进行二值化。                       */ 
/***************************************************************/ 
void ZaoShengXiaoChuDib::GuDing(int YuZhi) 
{ 
	LPBYTE  p_data;     //原图数据区指针 
	int wide,height;    //原图长、宽 
	p_data=this->GetData ();     //取得原图的数据区指针 
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像		 
	{ 
		wide=this->GetWidth (); 
		height=this->GetHeight (); 
		for(int j=0;jYuZhi)          //灰度值大于给定阈值,置为255 
					*p_data=255; 
				else 
					*p_data=0;             //不大于置为0 
				p_data++; 
			} 
		} 
	} 
	else	//24位彩色 
	{ 
		wide=this->GetWidth(); 
		height=this->GetHeight (); 
		for(int j=0;jYuZhi)          //若像素值不为0 
					*p_data=255;   //将其置为255 
				else 
					*p_data=0;             //不大于置为0 
				p_data++; 				  
			} 
		} 
	} 
} 
 
/***************************************************************/  
/*函数名称:HeiBaiFanZhuan()                                   */ 
/*函数类型:void                                               */ 
/*功能:对二值图像的黑白点噪声消除。                           */ 
/***************************************************************/ 
void ZaoShengXiaoChuDib::HeiBaiFanZhuan() 
{ 
	int averg,averg2,averg3; 
	BYTE *p_data;		//原图数据区指针 
	int wide,height;    //原图长、宽 
	p_data=this->GetData ();//取得原图的数据区指针 
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像 
	{ 
		wide=this->GetWidth ();		//取得原图的数据区宽 
		height=this->GetHeight ();  //取得原图的数据区高 
		GuDing(100);				//进行二值化 
		BYTE* p_temp=new BYTE[wide*height];// 申请并分配中间缓存 
		memcpy(p_temp,m_pData,wide*height);// 复制图象数据到中间缓存 
		//用3*3屏蔽窗口的8近邻均值进行滤波 
		for(int j=1;j127.5) 
					p_temp[j*wide+i]=averg; 
			} 
		} 
		memcpy(p_data,p_temp,wide*height); 
		delete p_temp; 
	} 
	else	//24位彩色 
	{ 
		wide=this->GetWidth();  //取得原图的数据区宽 
		height=this->GetHeight ();  //取得原图的数据区高 
		GuDing(100);  //进行二值化 
		BYTE* p_temp=new BYTE[wide*height*3];// 申请并分配中间缓存 
		memcpy(p_temp,m_pData,wide*height*3);// 复制图象数据到中间缓存 
		//用3*3屏蔽窗口的8近邻均值进行滤波 
		for(int j=1;j127.5) 
					p_temp[j*wide*3+i*3]=averg; 
				if(abs(averg2-p_temp[j*wide*3+i*3+1])>127.5) 
					p_temp[j*wide*3+i*3+1]=averg2; 
				if(abs(averg3-p_temp[j*wide*3+i*3+2])>127.5) 
					p_temp[j*wide*3+i*3+2]=averg3; 
			} 
		} 
		memcpy(p_data,p_temp,wide*height*3); 
		delete p_temp; 
	} 
} 
 
/***************************************************************/  
/*函数名称:black(int connec)                                  */ 
/*函数类型:void                                               */ 
/*参数:int connec,设定的连通选择                             */ 
/*功能:对二值图像进行消除孤立黑像素点。                       */ 
/***************************************************************/ 
void ZaoShengXiaoChuDib::black(int connec) 
{ 
	// 指向DIB象素指针 
	BYTE *p_data; 
    p_data=this->GetData();  	//取得原图的数据区指针  
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像 
	{ 
		int wide=this->GetWidth();  //取得原图的数据区宽 
		int height=this->GetHeight();  //取得原图的数据区高 
		//二值化 
		GuDing(100);	 
		// 申请并分配中间缓存 
		BYTE* p_temp=new BYTE[wide*height]; 	 
		// 复制图象数据到中间缓存 
		memcpy(p_temp,p_data,wide*height); 
		// 4连接的情况下,消去上下左右都为255(白点)的孤立黑点	 
		if (connec==4) 
		{ 
			for (int j=1;jGetWidth();  //取得原图的数据区宽 
		int height=this->GetHeight();  //取得原图的数据区高 
		//二值化 
		GuDing(100);	 
		// 申请并分配中间缓存 
		BYTE* p_temp=new BYTE[wide*height*3]; 	 
		// 复制图象数据到中间缓存 
		memcpy(p_temp,p_data,wide*height*3); 
		// 4连接的情况下,消去上下左右都为255(白点)的孤立黑点	 
		if (connec==4) 
		{ 
			for (int j=1;jGetData ();//取得原图的数据区指针 
	wide=this->GetWidth (); //取得原图的数据区宽 
    height=this->GetHeight ();  //取得原图的数据区高 
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像 
	{     
		BYTE* p_temp=new BYTE[wide*height]; 
		int size=wide*height; 
		memset(p_temp,255,size); 
		//用3*3屏蔽窗口的8近邻均值进行滤波 
		for(int j=1;jGetData ();//取得原图的数据区指针 
	wide=this->GetWidth (); //取得原图的数据区宽 
    height=this->GetHeight ();  //取得原图的数据区高 
	if(m_pBitmapInfoHeader->biBitCount<9)		//灰度图像 
	{     
		BYTE* p_temp=new BYTE[wide*height]; 
		int size=wide*height; 
		memset(p_temp,255,size); 
		//用3*3屏蔽窗口的8近邻均值进行滤波 
		for(int j=1;jT) 
					p_temp[j*wide+i]=averg; 
			} 
		} 
		memcpy(p_data,p_temp,wide*height); 
		delete p_temp; 
	} 
	else	//24位彩色 
	{	 
		BYTE* p_temp=new BYTE[wide*height*3]; 
		int size=wide*height*3; 
		memset(p_temp,255,size); 
		//用3*3屏蔽窗口的8近邻均值进行滤波 
		for(int j=1;jT) 
					p_temp[j*wide*3+i*3]=averg; 
				if(abs(p_temp[j*wide*3+i*3+1]-averg2)>T) 
					p_temp[j*wide*3+i*3+1]=averg2; 
				if(abs(p_temp[j*wide*3+i*3+2]-averg3)>T) 
					p_temp[j*wide*3+i*3*2]=averg3; 
			} 
		} 
		memcpy(p_data,p_temp,wide*height*3); 
		delete p_temp; 
	} 
} 
 
/***************************************************************/  
/*函数名称:nn(int n)                                          */ 
/*函数类型:void                                               */ 
/*参数:int n,设定的屏蔽窗口参数(奇数)                      */ 
/*功能:对图像进行n*n均值滤波处理。                            */ 
/***************************************************************/ 
void ZaoShengXiaoChuDib::nn(int n) 
{ 
    DWORD size; 
	size=GetSize(); 
	BYTE *p_data; 
	int xx,yy,n2,sum,sum2,sum3; 
	int wide,height;    //原图长、宽 
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像 
	{ 
		BYTE* p_temp=new BYTE [size]; 
		memset(p_temp,255,size); 
		if(n<3||n%2!=1)//确认n为奇数 
			AfxMessageBox("请输入一个大于等于3的奇数"); 
		if(n>=3&&n%2==1) 
			n2=(n-1)/2; 
		p_data=this->GetData();//取得原图的数据区指针 
		wide=this->GetWidth(); //取得原图的数据区宽 
		height=this->GetHeight();  //取得原图的数据区高 
		//用N*N屏蔽窗口平均化 
		for(int j=n2;j=3&&n%2==1) 
			n2=(n-1)/2; 
		p_data=this->GetData();//取得原图的数据区指针 
		wide=this->GetWidth(); //取得原图的数据区宽 
		height=this->GetHeight();  //取得原图的数据区高 
		BYTE* p_temp=new BYTE [wide*height*3]; 
		memset(p_temp,255,wide*height*3); 
		//用N*N屏蔽窗口平均化 
		for(int j=n2;j=3&&n%2==1) 
		n2=(n-1)/2; 
    nn=n*n; 
	chuo=(nn-1)/2; 
	p_data=this->GetData();//取得原图的数据区指针 
	wide=this->GetWidth(); //取得原图的数据区宽 
    height=this->GetHeight();  //取得原图的数据区高 
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像 
	{ 
		//n*n中值滤波 
		for(int j=n2;j=3&&n%2==1) 
    n2=(n-1)/2; 
    nn=n+n-1; 
    chuo=(nn-1)/2; 
	p_data=this->GetData();//取得原图的数据区指针 
	wide=this->GetWidth(); //取得原图的数据区宽 
    height=this->GetHeight();  //取得原图的数据区高 
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像 
	{ 
		//十字型中值滤波 
		for(int j=n2;j=3&&n%2==1) 
	n2=(n-1)/2; 
	nn=n*n; 
	p_data=this->GetData();//取得原图的数据区指针 
   	wide=this->GetWidth(); //取得原图的数据区宽 
    height=this->GetHeight();  //取得原图的数据区高 
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像 
	{ 
		//n*n最大值频率滤波 
		for(int j=n2;jbiBitCount<9)	//灰度图像 
	{ 
		BYTE* p_temp=new BYTE [size]; 
		memset(p_temp,255,size); 
		p_data=this->GetData();//取得原图的数据区指针 
		memcpy(p_temp,p_data,size); 
		wide=this->GetWidth(); //取得原图的数据区宽 
		height=this->GetHeight();  //取得原图的数据区高 
		//产生随机噪声 
		for(int j=0;jGetData();//取得原图的数据区指针 
		memcpy(p_temp,p_data,size); 
		wide=this->GetWidth()*3; //取得原图的数据区宽 
		height=this->GetHeight();  //取得原图的数据区高 
		//产生随机噪声 
		for(int j=0;jGetData();//取得原图的数据区指针 
	memcpy(p_temp,p_data,size); 
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像 
	{ 
		wide=this->GetWidth(); //取得原图的数据区宽 
		height=this->GetHeight();  //取得原图的数据区高 
		for(int j=0;j31500) 
				p_temp[j*wide+i]=0; 
		} 
		memcpy(m_pData,p_temp,size); 
		delete p_temp; 
	} 
	else	//24位彩色 
	{ 
		size=GetSize(); 
		BYTE* p_temp=new BYTE [size]; 
		p_data=this->GetData();//取得原图的数据区指针 
		memcpy(p_temp,p_data,size); 
		wide=this->GetWidth()*3; //取得原图的数据区宽 
		height=this->GetHeight();  //取得原图的数据区高 
		for(int j=0;j31500) 
				p_temp[j*wide+i]=0; 
		} 
		memcpy(m_pData,p_temp,size); 
		delete p_temp; 
	} 
} 
 
/***************************************************************/  
/*函数名称:jubupingjun()                                      */ 
/*函数类型:void                                               */ 
/*功能:对图像进行局部平均化处理。                             */ 
/***************************************************************/ 
void ZaoShengXiaoChuDib::jubupingjun()  
{ 
    DWORD size; 
	size=GetSize(); 
	BYTE *p_data;//原图数据区指针 
	BYTE* p_temp=new BYTE[size]; 
	int wide,height; 
    int n,ji[9],nmin; 
	float mean[9],bunsan[9],bmin; 
	p_data=this->GetData();//取得原图的数据区指针 
	wide=this->GetWidth(); //取得原图的数据区宽 
    height=this->GetHeight();  //取得原图的数据区高 
	if(m_pBitmapInfoHeader->biBitCount<9)	//灰度图像 
	{     
		memset(p_temp,255,size); 
		for(int j=2;j<=height-3;j++) 
		for(int i=2;i<=wide-3;i++) 
		{ 
		//求9种近邻区域的均值及其方差 
			//第1近邻区域 
			ji[0]=p_data[(j-1)*wide+(i-1)]; 
			ji[1]=p_data[(j-1)*wide+i]; 
			ji[2]=p_data[(j-1)*wide+(i+1)]; 
			ji[3]=p_data[j*wide+(i-1)]; 
			ji[4]=p_data[j*wide+i]; 
			ji[5]=p_data[j*wide+(i+1)]; 
			ji[6]=p_data[(j+1)*wide+(i-1)]; 
			ji[7]=p_data[(j+1)*wide+i]; 
			ji[8]=p_data[(j+1)*wide+(i+1)]; 
			mean[0]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6]+ji[7]+ji[8])/9; 
			bunsan[0]=0; 
			for(n=0;n<=8;n++) 
				bunsan[0]+=ji[n]*ji[n]-mean[0]*mean[0]; 
			//第2近邻区域 
			ji[0]=p_data[(j-2)*wide+(i-1)]; 
			ji[1]=p_data[(j-2)*wide+i]; 
			ji[2]=p_data[(j-2)*wide+(i+1)]; 
			ji[3]=p_data[(j-1)*wide+(i-1)]; 
			ji[4]=p_data[(j-1)*wide+i]; 
			ji[5]=p_data[(j-1)*wide+(i+1)]; 
			ji[6]=p_data[j*wide+i]; 
			mean[1]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
			bunsan[1]=0; 
			for(n=0;n<=6;n++) 
				bunsan[1]+=ji[n]*ji[n]-mean[1]*mean[1]; 
			//第3近邻区域 
			ji[0]=p_data[(j-1)*wide+(i-2)]; 
			ji[1]=p_data[(j-1)*wide+(i-1)]; 
			ji[2]=p_data[j*wide+(i-2)]; 
			ji[3]=p_data[j*wide+(i-1)]; 
			ji[4]=p_data[j*wide+i]; 
			ji[5]=p_data[(j+1)*wide+(i-2)]; 
			ji[6]=p_data[(j+1)*wide+(i-1)]; 
			mean[2]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
			bunsan[2]=0; 
			for(n=0;n<=6;n++) 
				bunsan[2]+=ji[n]*ji[n]-mean[2]*mean[2]; 
			//第4近邻区域 
			ji[0]=p_data[j*wide+i]; 
			ji[1]=p_data[(j+1)*wide+(i-1)]; 
			ji[2]=p_data[(j+1)*wide+i]; 
			ji[3]=p_data[(j+1)*wide+(i+1)]; 
			ji[4]=p_data[(j+2)*wide+(i-1)]; 
			ji[5]=p_data[(j+2)*wide+i]; 
			ji[6]=p_data[(j+2)*wide+(i+1)]; 
			mean[3]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	  		bunsan[3]=0; 
			for(n=0;n<=6;n++) 
				bunsan[3]+=ji[n]*ji[n]-mean[3]*mean[3]; 
			//第5近邻区域 
			ji[0]=p_data[(j-1)*wide+(i+1)]; 
			ji[1]=p_data[(j-1)*wide+(i+2)]; 
			ji[2]=p_data[j*wide+i]; 
			ji[3]=p_data[j*wide+(i+1)]; 
			ji[4]=p_data[j*wide+(i+2)]; 
			ji[5]=p_data[(j+1)*wide+(i+1)]; 
			ji[6]=p_data[(j+1)*wide+(i+2)];  
			mean[4]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
			bunsan[4]=0; 
			for(n=0;n<=6;n++) 
				bunsan[4]+=ji[n]*ji[n]-mean[4]*mean[4];	 
			//第6近邻区域 
			ji[0]=p_data[(j-2)*wide+(i+1)]; 
			ji[1]=p_data[(j-2)*wide+(i+2)]; 
			ji[2]=p_data[(j-1)*wide+i]; 
			ji[3]=p_data[(j-1)*wide+(i+1)]; 
			ji[4]=p_data[(j-1)*wide+(i+2)]; 
			ji[5]=p_data[j*wide+i]; 
			ji[6]=p_data[j*wide+(i+1)];  
			mean[5]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	  		bunsan[5]=0; 
			for(n=0;n<=6;n++) 
				bunsan[5]+=ji[n]*ji[n]-mean[5]*mean[5]; 
			//第7近邻区域 
			ji[0]=m_pData[(j-2)*wide+(i-2)]; 
			ji[1]=p_data[(j-2)*wide+(i-1)]; 
			ji[2]=p_data[(j-1)*wide+(i-2)]; 
			ji[3]=p_data[(j-1)*wide+(i-1)]; 
			ji[4]=p_data[(j-1)*wide+i]; 
			ji[5]=p_data[j*wide+(i-1)]; 
			ji[6]=p_data[j*wide+i]; 
			mean[6]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	 		bunsan[6]=0; 
			for(n=0;n<=6;n++) 
				bunsan[6]+=ji[n]*ji[n]-mean[6]*mean[6]; 
			//第8近邻区域 
			ji[0]=m_pData[j*wide+(i-1)]; 
			ji[1]=p_data[j*wide+i]; 
			ji[2]=p_data[(j+1)*wide+(i-2)]; 
			ji[3]=p_data[(j+1)*wide+(i-1)]; 
			ji[4]=p_data[(j+1)*wide+i]; 
			ji[5]=p_data[(j+2)*wide+(i-2)]; 
			ji[6]=p_data[(j+2)*wide+(i-1)]; 
			mean[7]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	  		bunsan[7]=0; 
			for(n=0;n<=6;n++) 
				bunsan[7]+=ji[n]*ji[n]-mean[7]*mean[7]; 
			//第9近邻区域 
			ji[0]=p_data[j*wide+i]; 
			ji[1]=p_data[j*wide+(i+1)]; 
			ji[2]=p_data[(j+1)*wide+i]; 
			ji[3]=p_data[(j+1)*wide+(i+1)]; 
			ji[4]=p_data[(j+1)*wide+(i+2)]; 
			ji[5]=p_data[(j+2)*wide+(i+1)]; 
			ji[6]=p_data[(j+2)*wide+(i+2)]; 
			mean[8]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	  		bunsan[8]=0; 
			for(n=0;n<=6;n++) 
				bunsan[8]+=ji[n]*ji[n]-mean[8]*mean[8]; 
			//求方差最小的近邻区域nmin 
			bmin=bunsan[0]; 
			nmin=0; 
			for(n=0;n<=8;n++) 
			{ 
				if(bmin>bunsan[n]) 
				{ 
					bmin=bunsan[n]; 
					nmin=n; 
				} 
				//把nmin的值四舍五入后作为显示图像的值 
				p_temp[j*wide+i]=(int)(mean[nmin]+0.5); 
			}				  
		} 
		memcpy(p_data,p_temp,size); 
		delete p_temp;	 
	} 
	else	//24位彩色 
	{		     
		p_temp=new BYTE[wide*height*3]; 
		memset(p_temp,255,wide*height*3); 
		for(int k=0;k<3;k++) 
		for(int j=2;j<=height-3;j++) 
		{ 
			for(int i=2;i<=wide-3;i++) 
			{ 
			//求9种近邻区域的均值及其方差 
				//第1近邻区域 
				ji[0]=p_data[(j-1)*wide*3+(i-1)*3+k+k]; 
				ji[1]=p_data[(j-1)*wide*3+i*3+k]; 
				ji[2]=p_data[(j-1)*wide*3+(i+1)*3+k]; 
				ji[3]=p_data[j*wide*3+(i-1)*3+k]; 
				ji[4]=p_data[j*wide*3+i*3+k]; 
				ji[5]=p_data[j*wide*3+(i+1)*3+k]; 
				ji[6]=p_data[(j+1)*wide*3+(i-1)*3+k]; 
				ji[7]=p_data[(j+1)*wide*3+i*3+k]; 
				ji[8]=p_data[(j+1)*wide*3+(i+1)*3+k]; 
				mean[0]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6]+ji[7]+ji[8])/9; 
				bunsan[0]=0; 
				for(n=0;n<=8;n++) 
					bunsan[0]+=ji[n]*ji[n]-mean[0]*mean[0]; 
				//第2近邻区域 
				ji[0]=p_data[(j-2)*wide*3+(i-1)*3+k]; 
				ji[1]=p_data[(j-2)*wide*3+i*3+k]; 
				ji[2]=p_data[(j-2)*wide*3+(i+1)*3+k]; 
				ji[3]=p_data[(j-1)*wide*3+(i-1)*3+k]; 
				ji[4]=p_data[(j-1)*wide*3+i*3+k]; 
				ji[5]=p_data[(j-1)*wide*3+(i+1)*3+k]; 
				ji[6]=p_data[j*wide*3+i*3+k]; 
				mean[1]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
				bunsan[1]=0; 
				for(n=0;n<=6;n++) 
					bunsan[1]+=ji[n]*ji[n]-mean[1]*mean[1]; 
				//第3近邻区域 
				ji[0]=p_data[(j-1)*wide*3+(i-2)*3+k]; 
				ji[1]=p_data[(j-1)*wide*3+(i-1)*3+k]; 
				ji[2]=p_data[j*wide*3+(i-2)*3+k]; 
				ji[3]=p_data[j*wide*3+(i-1)*3+k]; 
				ji[4]=p_data[j*wide*3+i*3+k]; 
				ji[5]=p_data[(j+1)*wide*3+(i-2)*3+k]; 
				ji[6]=p_data[(j+1)*wide*3+(i-1)*3+k]; 
				mean[2]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
				bunsan[2]=0; 
				for(n=0;n<=6;n++) 
					bunsan[2]+=ji[n]*ji[n]-mean[2]*mean[2]; 
				//第4近邻区域 
				ji[0]=p_data[j*wide*3+i*3+k]; 
				ji[1]=p_data[(j+1)*wide*3+(i-1)*3+k]; 
				ji[2]=p_data[(j+1)*wide*3+i*3+k]; 
				ji[3]=p_data[(j+1)*wide*3+(i+1)*3+k]; 
				ji[4]=p_data[(j+2)*wide*3+(i-1)*3+k]; 
				ji[5]=p_data[(j+2)*wide*3+i*3+k]; 
				ji[6]=p_data[(j+2)*wide*3+(i+1)*3+k]; 
				mean[3]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	  			bunsan[3]=0; 
				for(n=0;n<=6;n++) 
					bunsan[3]+=ji[n]*ji[n]-mean[3]*mean[3]; 
				//第5近邻区域 
				ji[0]=p_data[(j-1)*wide*3+(i+1)*3+k]; 
				ji[1]=p_data[(j-1)*wide*3+(i+2)*3+k]; 
				ji[2]=p_data[j*wide*3+i*3+k]; 
				ji[3]=p_data[j*wide*3+(i+1)*3+k]; 
				ji[4]=p_data[j*wide*3+(i+2)*3+k]; 
				ji[5]=p_data[(j+1)*wide*3+(i+1)*3+k]; 
				ji[6]=p_data[(j+1)*wide*3+(i+2)*3+k];  
				mean[4]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
				bunsan[4]=0; 
				for(n=0;n<=6;n++) 
					bunsan[4]+=ji[n]*ji[n]-mean[4]*mean[4];	 
				//第6近邻区域 
				ji[0]=p_data[(j-2)*wide*3+(i+1)*3+k]; 
				ji[1]=p_data[(j-2)*wide*3+(i+2)*3+k]; 
				ji[2]=p_data[(j-1)*wide*3+i*3+k]; 
				ji[3]=p_data[(j-1)*wide*3+(i+1)*3+k]; 
				ji[4]=p_data[(j-1)*wide*3+(i+2)*3+k]; 
				ji[5]=p_data[j*wide*3+i*3+k]; 
				ji[6]=p_data[j*wide*3+(i+1)*3+k];  
				mean[5]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	  			bunsan[5]=0; 
				for(n=0;n<=6;n++) 
					bunsan[5]+=ji[n]*ji[n]-mean[5]*mean[5]; 
				//第7近邻区域 
				ji[0]=m_pData[(j-2)*wide*3+(i-2)*3+k]; 
				ji[1]=p_data[(j-2)*wide*3+(i-1)*3+k]; 
				ji[2]=p_data[(j-1)*wide*3+(i-2)*3+k]; 
				ji[3]=p_data[(j-1)*wide*3+(i-1)*3+k]; 
				ji[4]=p_data[(j-1)*wide*3+i*3+k]; 
				ji[5]=p_data[j*wide*3+(i-1)*3+k]; 
				ji[6]=p_data[j*wide*3+i*3+k]; 
				mean[6]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	 			bunsan[6]=0; 
				for(n=0;n<=6;n++) 
					bunsan[6]+=ji[n]*ji[n]-mean[6]*mean[6]; 
				//第8近邻区域 
				ji[0]=m_pData[j*wide*3+(i-1)*3+k]; 
				ji[1]=p_data[j*wide*3+i*3+k]; 
				ji[2]=p_data[(j+1)*wide*3+(i-2)*3+k]; 
				ji[3]=p_data[(j+1)*wide*3+(i-1)*3+k]; 
				ji[4]=p_data[(j+1)*wide*3+i*3+k]; 
				ji[5]=p_data[(j+2)*wide*3+(i-2)*3+k]; 
				ji[6]=p_data[(j+2)*wide*3+(i-1)*3+k]; 
				mean[7]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	  			bunsan[7]=0; 
				for(n=0;n<=6;n++) 
					bunsan[7]+=ji[n]*ji[n]-mean[7]*mean[7]; 
				//第9近邻区域 
				ji[0]=p_data[j*wide*3+i*3+k]; 
				ji[1]=p_data[j*wide*3+(i+1)*3+k]; 
				ji[2]=p_data[(j+1)*wide*3+i*3+k]; 
				ji[3]=p_data[(j+1)*wide*3+(i+1)*3+k]; 
				ji[4]=p_data[(j+1)*wide*3+(i+2)*3+k]; 
				ji[5]=p_data[(j+2)*wide*3+(i+1)*3+k]; 
				ji[6]=p_data[(j+2)*wide*3+(i+2)*3+k]; 
				mean[8]=(float)(ji[0]+ji[1]+ji[2]+ji[3]+ji[4]+ji[5]+ji[6])/7; 
	  			bunsan[8]=0; 
				for(n=0;n<=6;n++) 
					bunsan[8]+=ji[n]*ji[n]-mean[8]*mean[8]; 
				//求方差最小的近邻区域nmin 
				bmin=bunsan[0]; 
				nmin=0; 
				for(n=0;n<=8;n++) 
				{ 
					if(bmin>bunsan[n]) 
					{ 
						bmin=bunsan[n]; 
						nmin=n; 
					} 
					//把nmin的值四舍五入后作为显示图像的值 
					p_temp[j*wide*3+i*3+k]=(int)(mean[nmin]+0.5);		 
				}				  
			} 
		} 
		memcpy(p_data,p_temp,size); 
		delete p_temp; 
	} 
}