MFC实现图像选择式掩膜平滑



void CSDIELSView::OnSmoothingChooseMask()
	{
//选择式掩膜平滑,从多个模板中选择一个最优模板来使用
//程序设计:李立宗 lilizong@gmail.com
//2012-8-8
		if(myImage1.IsNull())
			OnOpenResourceFile();
		if(!myImage2.IsNull())
			myImage2.Destroy();
		if(myImage2.IsNull()){
			myImage2.Create(myImage1.GetWidth(),myImage1.GetHeight(),24,0);
		}
		//COLORREF pixel; 
		int maxY = myImage1.GetHeight();
		int maxX=myImage1.GetWidth();
		byte* pRealData;
		byte* pRealData2;
		pRealData=(byte*)myImage1.GetBits();
		pRealData2=(byte*)myImage2.GetBits();
		int pit=myImage1.GetPitch();
		int pit2=myImage2.GetPitch();
		//需要注意,pit和pit2的值并不一样,所以如果使用一个值,会导致不同的结果出现
		//CString str;
		//str.Format(TEXT("%d"),pit);
		//MessageBox(str);
		//str.Format(TEXT("%d"),pit2);
		//MessageBox(str);
		int bitCount=myImage1.GetBPP()/8;
		int bitCount2=myImage2.GetBPP()/8;
		int tempR,tempG,tempB;
		int temp,tempX,tempY;
		float mean[9][3];  //用于存储每个邻域的均值9个邻域,每个邻域考虑RGB
		float var[9][3];   //存储方差
		float value[9];  //用来存储邻域个点的像素值
		float varRGB[9];  //用来存储每个邻域的RGB方差和 
		float min;   //存储最小方差
		int minIndex;   //存储最小方差的邻域号码
		//	tempR=tempG=tempG=0;
		//说明:将生产的图像作为24位图处理。
		for (int y=2; y<maxY-3; y++) {
			for (int x=2; x<maxX-3; x++) {
				//=====第1个邻域开始
				//第1个邻域第1个色彩空间
				value[0]=*(pRealData+pit*(y-1)+(x-1)*bitCount);
				value[1]=*(pRealData+pit*(y-1)+(x)*bitCount);
				value[2]=*(pRealData+pit*(y-1)+(x+1)*bitCount);
				value[3]=*(pRealData+pit*(y)+(x-1)*bitCount);
				value[4]=*(pRealData+pit*(y)+(x)*bitCount);
				value[5]=*(pRealData+pit*(y)+(x+1)*bitCount);
				value[6]=*(pRealData+pit*(y+1)+(x-1)*bitCount);
				value[7]=*(pRealData+pit*(y+1)+(x)*bitCount);
				value[8]=*(pRealData+pit*(y+1)+(x+1)*bitCount);
				//for(int n=0;n<=1;n++)
				//	mean[0][0]+=(float)value[n]/2.0;
				//mean[0][0]=(value[0]+value[1])/2;
				mean[0][0]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6]+value[7]+value[8])/9;
				//mean[0][0]=mean[0][0]/9;
				//		CString str;
				//		str.Format(TEXT("%f"),mean[0][0]);
				//MessageBox(str);
				var[0][0]=0;
				for(int n=0;n<=8;n++)
					var[0][0]+=value[n]*value[n]-mean[0][0]*mean[0][0];
				if(bitCount==1)
				{
					var[0][1]=0;
					var[0][2]=0;
					mean[0][1]=mean[0][0];
					mean[0][2]=mean[0][0];
				}
				else
				{
					//第1个邻域第2个色彩空间
					value[0]=*(pRealData+pit*(y-1)+(x-1)*bitCount+1);
					value[1]=*(pRealData+pit*(y-1)+(x)*bitCount+1);
					value[2]=*(pRealData+pit*(y-1)+(x+1)*bitCount+1);
					value[3]=*(pRealData+pit*(y)+(x-1)*bitCount+1);
					value[4]=*(pRealData+pit*(y)+(x)*bitCount+1);
					value[5]=*(pRealData+pit*(y)+(x+1)*bitCount+1);
					value[6]=*(pRealData+pit*(y+1)+(x-1)*bitCount+1);
					value[7]=*(pRealData+pit*(y+1)+(x)*bitCount+1);
					value[8]=*(pRealData+pit*(y+1)+(x+1)*bitCount+1);
					mean[0][1]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6]+value[7]+value[8])/9;
					var[0][1]=0;
					for(int n=0;n<=8;n++)
						var[0][1]+=value[n]*value[n]-mean[0][1]*mean[0][1];
					//第1个邻域第3个色彩空间
					value[0]=*(pRealData+pit*(y-1)+(x-1)*bitCount+2);
					value[1]=*(pRealData+pit*(y-1)+(x)*bitCount+2);
					value[2]=*(pRealData+pit*(y-1)+(x+1)*bitCount+2);
					value[3]=*(pRealData+pit*(y)+(x-1)*bitCount+2);
					value[4]=*(pRealData+pit*(y)+(x)*bitCount+2);
					value[5]=*(pRealData+pit*(y)+(x+1)*bitCount+2);
					value[6]=*(pRealData+pit*(y+1)+(x-1)*bitCount+2);
					value[7]=*(pRealData+pit*(y+1)+(x)*bitCount+2);
					value[8]=*(pRealData+pit*(y+1)+(x+1)*bitCount+2);
					mean[0][2]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6]+value[7]+value[8])/9;
					var[0][2]=0;
					for(int n=0;n<=8;n++)
						var[0][2]+=value[n]*value[n]-mean[0][2]*mean[0][2];
				}
				varRGB[0]=var[0][0]+var[0][1]+var[0][2];
				//=====第2个邻域开始
				//第2个邻域第1个色彩空间
				value[0]=*(pRealData+pit*(y-2)+(x-1)*bitCount);
				value[1]=*(pRealData+pit*(y-2)+(x)*bitCount);
				value[2]=*(pRealData+pit*(y-2)+(x+1)*bitCount);
				value[3]=*(pRealData+pit*(y-1)+(x-1)*bitCount);
				value[4]=*(pRealData+pit*(y-1)+(x)*bitCount);
				value[5]=*(pRealData+pit*(y-1)+(x+1)*bitCount);
				value[6]=*(pRealData+pit*(y)+(x)*bitCount);
				mean[1][0]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
				var[1][0]=0;
				for(int n=0;n<=8;n++)
					var[1][0]+=value[n]*value[n]-mean[1][0]*mean[1][0];
				if(bitCount==1)
				{
					var[1][1]=0;
					var[1][2]=0;
					mean[1][1]=mean[1][2]=mean[1][0];
				}
				else
				{
					//第2个邻域第2个色彩空间
					value[0]=*(pRealData+pit*(y-2)+(x-1)*bitCount+1);
					value[1]=*(pRealData+pit*(y-2)+(x)*bitCount+1);
					value[2]=*(pRealData+pit*(y-2)+(x+1)*bitCount+1);
					value[3]=*(pRealData+pit*(y-1)+(x-1)*bitCount+1);
					value[4]=*(pRealData+pit*(y-1)+(x)*bitCount+1);
					value[5]=*(pRealData+pit*(y-1)+(x+1)*bitCount+1);
					value[6]=*(pRealData+pit*(y)+(x)*bitCount+1);
					mean[1][1]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[1][1]=0;
					for(int n=0;n<=8;n++)
						var[1][1]+=value[n]*value[n]-mean[1][1]*mean[1][1];
					//第2个邻域第3个色彩空间
					value[0]=*(pRealData+pit*(y-2)+(x-1)*bitCount);
					value[1]=*(pRealData+pit*(y-2)+(x)*bitCount+2);
					value[2]=*(pRealData+pit*(y-2)+(x+1)*bitCount+2);
					value[3]=*(pRealData+pit*(y-1)+(x-1)*bitCount+2);
					value[4]=*(pRealData+pit*(y-1)+(x)*bitCount+2);
					value[5]=*(pRealData+pit*(y-1)+(x+1)*bitCount+2);
					value[6]=*(pRealData+pit*(y)+(x)*bitCount+2);
					mean[0][2]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[1][2]=0;
					for(int n=0;n<=8;n++)
						var[1][2]+=value[n]*value[n]-mean[1][2]*mean[1][2];
				}
				varRGB[1]=var[1][0]+var[1][1]+var[1][2];
				//=====第3个邻域开始
				//第3个邻域第1个色彩空间
				
				value[0]=*(pRealData+pit*(y-1)+(x-2)*bitCount);
				value[1]=*(pRealData+pit*(y-1)+(x-1)*bitCount);
				value[2]=*(pRealData+pit*(y)+(x-2)*bitCount);
				value[3]=*(pRealData+pit*(y)+(x-1)*bitCount);
				value[4]=*(pRealData+pit*(y)+(x)*bitCount);
				value[5]=*(pRealData+pit*(y+1)+(x-2)*bitCount);
				value[6]=*(pRealData+pit*(y+1)+(x-1)*bitCount);
				mean[2][0]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
				var[2][0]=0;
				for(int n=0;n<=8;n++)
					var[2][0]+=value[n]*value[n]-mean[2][0]*mean[2][0];
				if(bitCount==1)
				{
					var[2][1]=0;
					var[2][2]=0;
					mean[2][1]=mean[2][2]=mean[2][0];
				}
				else
				{
					//第3个邻域第2个色彩空间
				value[0]=*(pRealData+pit*(y-1)+(x-2)*bitCount+1);
				value[1]=*(pRealData+pit*(y-1)+(x-1)*bitCount+1);
				value[2]=*(pRealData+pit*(y)+(x-2)*bitCount+1);
				value[3]=*(pRealData+pit*(y)+(x-1)*bitCount+1);
				value[4]=*(pRealData+pit*(y)+(x)*bitCount+1);
				value[5]=*(pRealData+pit*(y+1)+(x-2)*bitCount+1);
				value[6]=*(pRealData+pit*(y+1)+(x-1)*bitCount+1);
					mean[2][1]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[2][1]=0;
					for(int n=0;n<=8;n++)
						var[2][1]+=value[n]*value[n]-mean[2][1]*mean[2][1];
					//第3个邻域第3个色彩空间
				value[0]=*(pRealData+pit*(y-1)+(x-2)*bitCount+2);
				value[1]=*(pRealData+pit*(y-1)+(x-1)*bitCount+2);
				value[2]=*(pRealData+pit*(y)+(x-2)*bitCount+2);
				value[3]=*(pRealData+pit*(y)+(x-1)*bitCount+2);
				value[4]=*(pRealData+pit*(y)+(x)*bitCount+2);
				value[5]=*(pRealData+pit*(y+1)+(x-2)*bitCount+2);
				value[6]=*(pRealData+pit*(y+1)+(x-1)*bitCount+2);
					mean[2][2]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[2][2]=0;
					for(int n=0;n<=8;n++)
						var[2][2]+=value[n]*value[n]-mean[2][2]*mean[2][2];
				}
				varRGB[2]=var[2][0]+var[2][1]+var[2][2];
				//=====第4个邻域开始
				//第4个邻域第1个色彩空间
				value[0]=*(pRealData+pit*(y)+(x)*bitCount);
				value[1]=*(pRealData+pit*(y+1)+(x-1)*bitCount);
				value[2]=*(pRealData+pit*(y+1)+(x)*bitCount);
				value[3]=*(pRealData+pit*(y+1)+(x+1)*bitCount);
				value[4]=*(pRealData+pit*(y+2)+(x-1)*bitCount);
				value[5]=*(pRealData+pit*(y+2)+(x)*bitCount);
				value[6]=*(pRealData+pit*(y+2)+(x+1)*bitCount);
				mean[3][0]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
				var[3][0]=0;
				for(int n=0;n<=8;n++)
					var[3][0]+=value[n]*value[n]-mean[3][0]*mean[3][0];
				if(bitCount==1)
				{
					var[3][1]=0;
					var[3][2]=0;
					mean[3][1]=mean[3][2]=mean[1][0];
				}
				else
				{
					//第4个邻域第2个色彩空间
				value[0]=*(pRealData+pit*(y)+(x)*bitCount+1);
				value[1]=*(pRealData+pit*(y+1)+(x-1)*bitCount+1);
				value[2]=*(pRealData+pit*(y+1)+(x)*bitCount+1);
				value[3]=*(pRealData+pit*(y+1)+(x+1)*bitCount+1);
				value[4]=*(pRealData+pit*(y+2)+(x-1)*bitCount+1);
				value[5]=*(pRealData+pit*(y+2)+(x)*bitCount+1);
				value[6]=*(pRealData+pit*(y+2)+(x+1)*bitCount+1);
					mean[3][1]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[3][1]=0;
					for(int n=0;n<=8;n++)
						var[3][1]+=value[n]*value[n]-mean[3][1]*mean[3][1];
					//第4个邻域第3个色彩空间
				value[0]=*(pRealData+pit*(y)+(x)*bitCount+2);
				value[1]=*(pRealData+pit*(y+1)+(x-1)*bitCount+2);
				value[2]=*(pRealData+pit*(y+1)+(x)*bitCount+2);
				value[3]=*(pRealData+pit*(y+1)+(x+1)*bitCount+2);
				value[4]=*(pRealData+pit*(y+2)+(x-1)*bitCount+2);
				value[5]=*(pRealData+pit*(y+2)+(x)*bitCount+2);
				value[6]=*(pRealData+pit*(y+2)+(x+1)*bitCount+2);
					mean[3][2]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[3][2]=0;
					for(int n=0;n<=8;n++)
						var[3][2]+=value[n]*value[n]-mean[3][2]*mean[3][2];
				}
				varRGB[3]=var[3][0]+var[3][1]+var[3][2];
				//=====第5个邻域开始
				//第5个邻域第1个色彩空间
				value[0]=*(pRealData+pit*(y-1)+(x+1)*bitCount);
				value[1]=*(pRealData+pit*(y-1)+(x+2)*bitCount);
				value[2]=*(pRealData+pit*(y)+(x)*bitCount);
				value[3]=*(pRealData+pit*(y)+(x+1)*bitCount);
				value[4]=*(pRealData+pit*(y)+(x+2)*bitCount);
				value[5]=*(pRealData+pit*(y+1)+(x+1)*bitCount);
				value[6]=*(pRealData+pit*(y+1)+(x+2)*bitCount);
				mean[4][0]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
				var[4][0]=0;
				for(int n=0;n<=8;n++)
					var[4][0]+=value[n]*value[n]-mean[4][0]*mean[4][0];
				if(bitCount==1)
				{
					var[4][1]=0;
					var[4][2]=0;
					mean[4][1]=mean[4][2]=mean[4][0];
				}
				else
				{
					//第5个邻域第2个色彩空间
				value[0]=*(pRealData+pit*(y-1)+(x+1)*bitCount+1);
				value[1]=*(pRealData+pit*(y-1)+(x+2)*bitCount+1);
				value[2]=*(pRealData+pit*(y)+(x)*bitCount+1);
				value[3]=*(pRealData+pit*(y)+(x+1)*bitCount+1);
				value[4]=*(pRealData+pit*(y)+(x+2)*bitCount+1);
				value[5]=*(pRealData+pit*(y+1)+(x+1)*bitCount+1);
				value[6]=*(pRealData+pit*(y+1)+(x+2)*bitCount+1);
					mean[4][1]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[4][1]=0;
					for(int n=0;n<=8;n++)
						var[4][1]+=value[n]*value[n]-mean[4][1]*mean[4][1];
					//第5个邻域第3个色彩空间
				value[0]=*(pRealData+pit*(y-1)+(x+1)*bitCount+2);
				value[1]=*(pRealData+pit*(y-1)+(x+2)*bitCount+2);
				value[2]=*(pRealData+pit*(y)+(x)*bitCount+2);
				value[3]=*(pRealData+pit*(y)+(x+1)*bitCount+2);
				value[4]=*(pRealData+pit*(y)+(x+2)*bitCount+2);
				value[5]=*(pRealData+pit*(y+1)+(x+1)*bitCount+2);
				value[6]=*(pRealData+pit*(y+1)+(x+2)*bitCount+2);
					mean[4][2]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[4][2]=0;
					for(int n=0;n<=8;n++)
						var[4][2]+=value[n]*value[n]-mean[4][2]*mean[4][2];
				}
				varRGB[4]=var[4][0]+var[4][1]+var[4][2];
				//=====第6个邻域开始
				//第6个邻域第1个色彩空间
				value[0]=*(pRealData+pit*(y-2)+(x+1)*bitCount);
				value[1]=*(pRealData+pit*(y-2)+(x+2)*bitCount);
				value[2]=*(pRealData+pit*(y-1)+(x)*bitCount);
				value[3]=*(pRealData+pit*(y-1)+(x+1)*bitCount);
				value[4]=*(pRealData+pit*(y-1)+(x+2)*bitCount);
				value[5]=*(pRealData+pit*(y)+(x)*bitCount);
				value[6]=*(pRealData+pit*(y)+(x+1)*bitCount);
				mean[5][0]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
				var[5][0]=0;
				for(int n=0;n<=8;n++)
					var[5][0]+=value[n]*value[n]-mean[5][0]*mean[5][0];
				if(bitCount==1)
				{
					var[5][1]=0;
					var[5][2]=0;
					mean[5][1]=mean[5][2]=mean[5][0];
				}
				else
				{
					//第6个邻域第2个色彩空间
				value[0]=*(pRealData+pit*(y-2)+(x+1)*bitCount+1);
				value[1]=*(pRealData+pit*(y-2)+(x+2)*bitCount+1);
				value[2]=*(pRealData+pit*(y-1)+(x)*bitCount+1);
				value[3]=*(pRealData+pit*(y-1)+(x+1)*bitCount+1);
				value[4]=*(pRealData+pit*(y-1)+(x+2)*bitCount+1);
				value[5]=*(pRealData+pit*(y)+(x)*bitCount+1);
				value[6]=*(pRealData+pit*(y)+(x+1)*bitCount+1);
					mean[5][1]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[5][1]=0;
					for(int n=0;n<=8;n++)
						var[5][1]+=value[n]*value[n]-mean[5][1]*mean[5][1];
					//第6个邻域第3个色彩空间
				value[0]=*(pRealData+pit*(y-2)+(x+1)*bitCount+2);
				value[1]=*(pRealData+pit*(y-2)+(x+2)*bitCount+2);
				value[2]=*(pRealData+pit*(y-1)+(x)*bitCount+2);
				value[3]=*(pRealData+pit*(y-1)+(x+1)*bitCount+2);
				value[4]=*(pRealData+pit*(y-1)+(x+2)*bitCount+2);
				value[5]=*(pRealData+pit*(y)+(x)*bitCount+2);
				value[6]=*(pRealData+pit*(y)+(x+1)*bitCount+2);
					mean[5][2]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6]+value[7]+value[8])/9;
					var[5][2]=0;
					for(int n=0;n<=8;n++)
						var[5][2]+=value[n]*value[n]-mean[5][2]*mean[5][2];
				}
				varRGB[5]=var[5][0]+var[5][1]+var[5][2];
				//=====第7个邻域开始
				//第7个邻域第1个色彩空间
				value[0]=*(pRealData+pit*(y-2)+(x-2)*bitCount);
				value[1]=*(pRealData+pit*(y-2)+(x-1)*bitCount);
				value[2]=*(pRealData+pit*(y-1)+(x-2)*bitCount);
				value[3]=*(pRealData+pit*(y-1)+(x-1)*bitCount);
				value[4]=*(pRealData+pit*(y-1)+(x)*bitCount);
				value[5]=*(pRealData+pit*(y)+(x-1)*bitCount);
				value[6]=*(pRealData+pit*(y)+(x)*bitCount);
				mean[6][0]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/9;
				var[6][0]=0;
				for(int n=0;n<=8;n++)
					var[6][0]+=value[n]*value[n]-mean[6][0]*mean[6][0];
				if(bitCount==1)
				{
					var[6][1]=0;
					var[6][2]=0;
					mean[6][1]=mean[6][2]=mean[6][0];
				}
				else
				{
					//第7个邻域第2个色彩空间
				value[0]=*(pRealData+pit*(y-2)+(x-2)*bitCount+1);
				value[1]=*(pRealData+pit*(y-2)+(x-1)*bitCount+1);
				value[2]=*(pRealData+pit*(y-1)+(x-2)*bitCount+1);
				value[3]=*(pRealData+pit*(y-1)+(x-1)*bitCount+1);
				value[4]=*(pRealData+pit*(y-1)+(x)*bitCount+1);
				value[5]=*(pRealData+pit*(y)+(x-1)*bitCount+1);
				value[6]=*(pRealData+pit*(y)+(x)*bitCount+1);
					mean[6][1]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[6][1]=0;
					for(int n=0;n<=8;n++)
						var[6][1]+=value[n]*value[n]-mean[6][1]*mean[6][1];
					//第7个邻域第3个色彩空间
				value[0]=*(pRealData+pit*(y-2)+(x-2)*bitCount+2);
				value[1]=*(pRealData+pit*(y-2)+(x-1)*bitCount+2);
				value[2]=*(pRealData+pit*(y-1)+(x-2)*bitCount+2);
				value[3]=*(pRealData+pit*(y-1)+(x-1)*bitCount+2);
				value[4]=*(pRealData+pit*(y-1)+(x)*bitCount+2);
				value[5]=*(pRealData+pit*(y)+(x-1)*bitCount+2);
				value[6]=*(pRealData+pit*(y)+(x)*bitCount+2);
					mean[6][2]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[6][2]=0;
					for(int n=0;n<=8;n++)
						var[6][2]+=value[n]*value[n]-mean[6][2]*mean[6][2];
				}
				varRGB[6]=var[6][0]+var[6][1]+var[6][2];
				//=====第8个邻域开始
				//第8个邻域第1个色彩空间
				value[0]=*(pRealData+pit*(y)+(x-1)*bitCount);
				value[1]=*(pRealData+pit*(y)+(x)*bitCount);
				value[2]=*(pRealData+pit*(y+1)+(x-2)*bitCount);
				value[3]=*(pRealData+pit*(y+1)+(x-1)*bitCount);
				value[4]=*(pRealData+pit*(y+1)+(x)*bitCount);
				value[5]=*(pRealData+pit*(y+2)+(x-2)*bitCount);
				value[6]=*(pRealData+pit*(y+2)+(x-1)*bitCount);
				mean[7][0]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
				var[7][0]=0;
				for(int n=0;n<=8;n++)
					var[7][0]+=value[n]*value[n]-mean[7][0]*mean[7][0];
				if(bitCount==1)
				{
					var[7][1]=0;
					var[7][2]=0;
					mean[7][1]=mean[7][2]=mean[7][0];
				}
				else
				{
					//第8个邻域第2个色彩空间
				value[0]=*(pRealData+pit*(y)+(x-1)*bitCount+1);
				value[1]=*(pRealData+pit*(y)+(x)*bitCount+1);
				value[2]=*(pRealData+pit*(y+1)+(x-2)*bitCount+1);
				value[3]=*(pRealData+pit*(y+1)+(x-1)*bitCount+1);
				value[4]=*(pRealData+pit*(y+1)+(x)*bitCount+1);
				value[5]=*(pRealData+pit*(y+2)+(x-2)*bitCount+1);
				value[6]=*(pRealData+pit*(y+2)+(x-1)*bitCount+1);
					mean[7][1]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[7][1]=0;
					for(int n=0;n<=8;n++)
						var[7][1]+=value[n]*value[n]-mean[7][1]*mean[7][1];
					//第8个邻域第3个色彩空间
				value[0]=*(pRealData+pit*(y)+(x-1)*bitCount+2);
				value[1]=*(pRealData+pit*(y)+(x)*bitCount+2);
				value[2]=*(pRealData+pit*(y+1)+(x-2)*bitCount+2);
				value[3]=*(pRealData+pit*(y+1)+(x-1)*bitCount+2);
				value[4]=*(pRealData+pit*(y+1)+(x)*bitCount+2);
				value[5]=*(pRealData+pit*(y+2)+(x-2)*bitCount+2);
				value[6]=*(pRealData+pit*(y+2)+(x-1)*bitCount+2);
					mean[7][2]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[7][2]=0;
					for(int n=0;n<=8;n++)
						var[7][2]+=value[n]*value[n]-mean[7][2]*mean[7][2];
				}
				varRGB[1]=var[7][0]+var[7][1]+var[7][2];
				//=====第9个邻域开始
				//第9个邻域第1个色彩空间
				value[0]=*(pRealData+pit*(y)+(x)*bitCount);
				value[1]=*(pRealData+pit*(y)+(x+1)*bitCount);
				value[2]=*(pRealData+pit*(y+1)+(x)*bitCount);
				value[3]=*(pRealData+pit*(y+1)+(x+1)*bitCount);
				value[4]=*(pRealData+pit*(y+1)+(x+2)*bitCount);
				value[5]=*(pRealData+pit*(y+2)+(x+1)*bitCount);
				value[6]=*(pRealData+pit*(y+2)+(x+2)*bitCount);
				mean[8][0]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
				var[8][0]=0;
				for(int n=0;n<=8;n++)
					var[8][0]+=value[n]*value[n]-mean[8][0]*mean[8][0];
				if(bitCount==1)
				{
					var[8][1]=0;
					var[8][2]=0;
					mean[8][1]=mean[8][2]=mean[8][0];
				}
				else
				{
					//第9个邻域第2个色彩空间
				value[0]=*(pRealData+pit*(y)+(x)*bitCount+1);
				value[1]=*(pRealData+pit*(y)+(x+1)*bitCount+1);
				value[2]=*(pRealData+pit*(y+1)+(x)*bitCount+1);
				value[3]=*(pRealData+pit*(y+1)+(x+1)*bitCount+1);
				value[4]=*(pRealData+pit*(y+1)+(x+2)*bitCount+1);
				value[5]=*(pRealData+pit*(y+2)+(x+1)*bitCount+1);
				value[6]=*(pRealData+pit*(y+2)+(x+2)*bitCount+1);
					mean[8][1]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[8][1]=0;
					for(int n=0;n<=8;n++)
						var[8][1]+=value[n]*value[n]-mean[8][1]*mean[8][1];
					//第9个邻域第3个色彩空间
				value[0]=*(pRealData+pit*(y)+(x)*bitCount+2);
				value[1]=*(pRealData+pit*(y)+(x+1)*bitCount+2);
				value[2]=*(pRealData+pit*(y+1)+(x)*bitCount+2);
				value[3]=*(pRealData+pit*(y+1)+(x+1)*bitCount+2);
				value[4]=*(pRealData+pit*(y+1)+(x+2)*bitCount+2);
				value[5]=*(pRealData+pit*(y+2)+(x+1)*bitCount+2);
				value[6]=*(pRealData+pit*(y+2)+(x+2)*bitCount+2);
					mean[8][2]=(value[0]+value[1]+value[2]+value[3]+value[4]+value[5]+value[6])/7;
					var[8][2]=0;
					for(int n=0;n<=8;n++)
						var[8][2]+=value[n]*value[n]-mean[8][2]*mean[8][2];
				}
				varRGB[8]=var[8][0]+var[8][1]+var[8][2];

				min=varRGB[0];
				minIndex=0;
				for(int i=1;i<=8;i++)
				{
					if(min>varRGB[0])
					{
						min=varRGB[i];
						minIndex=i;
					}
				}
				*(pRealData2+pit2*y+x*bitCount2)=(int)mean[minIndex][0];
				*(pRealData2+pit2*y+x*bitCount2+1)=(int)mean[minIndex][1];
				*(pRealData2+pit2*y+x*bitCount2+2)=(int)mean[minIndex][2];
			}
		}
		Invalidate();
	}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superdont

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值