void CSDIELSView::OnSmoothingChooseMask()
{
//选择式掩膜平滑,从多个模板中选择一个最优模板来使用
//程序设计:
//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();
}
MFC实现图像选择式掩膜平滑
原创
©著作权归作者所有:来自51CTO博客作者superdont的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:图像平滑-加权平均
下一篇:图像平滑-邻域平均法

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
图像采集入门篇—labview实现USB相机图像采集
图像采集入门篇—labview实现USB相机图像采集
错误信息 LabVIEW Image