?? zaoshengxiaochudib.cpp
字號:
mado2[m]=p_data[yy*wide*3+xx*3+1];
mado3[m]=p_data[yy*wide*3+xx*3+2];
m++;
}
//找出mado[m]中的最大值madomax,用作最大頻率值
madomax=mado[0];
madomax2=mado2[0];
madomax3=mado3[0];
for(m=1;m<nn;m++)
{
if(madomax<mado[m])
madomax=mado[m];
if(madomax2<mado2[m])
madomax2=mado2[m];
if(madomax3<mado3[m])
madomax3=mado3[m];
}
p_temp[j*wide*3+i*3]=madomax;
p_temp[j*wide*3+i*3+1]=madomax2;
p_temp[j*wide*3+i*3+2]=madomax3;
}
memcpy(m_pData,p_temp,wide*height*3);
delete p_temp;
}
}
/***************************************************************/
/*函數(shù)名稱:suijizaosheng() */
/*函數(shù)類型:void */
/*功能:對圖像進(jìn)行隨機(jī)噪聲處理。 */
/***************************************************************/
void ZaoShengXiaoChuDib::suijizaosheng()
{
int noisepoint;
DWORD size;
size=GetSize();
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height;
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
BYTE* p_temp=new BYTE [size];
memset(p_temp,255,size);
p_data=this->GetData();//取得原圖的數(shù)據(jù)區(qū)指針
memcpy(p_temp,p_data,size);
wide=this->GetWidth(); //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
//產(chǎn)生隨機(jī)噪聲
for(int j=0;j<height;j++)
for(int i=0;i<wide;i++)
{
noisepoint=rand()/1024;
p_temp[j*wide+i]=(p_temp[j*wide+i]*224/256+(int)noisepoint);
}
memcpy(m_pData,p_temp,size);
delete p_temp;
}
else //24位彩色
{
size=GetSize();
BYTE* p_temp=new BYTE [size];
memset(p_temp,255,size);
p_data=this->GetData();//取得原圖的數(shù)據(jù)區(qū)指針
memcpy(p_temp,p_data,size);
wide=this->GetWidth()*3; //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
//產(chǎn)生隨機(jī)噪聲
for(int j=0;j<height;j++)
for(int i=0;i<wide;i++)
{
noisepoint=rand()/1024;
p_temp[j*wide+i]=(p_temp[j*wide+i]*224/256+(int)noisepoint);
}
memcpy(m_pData,p_temp,size);
delete p_temp;
}
}
/***************************************************************/
/*函數(shù)名稱:jiaoyanzaosheng() */
/*函數(shù)類型:void */
/*功能:對圖像進(jìn)行椒鹽噪聲處理。 */
/***************************************************************/
void ZaoShengXiaoChuDib::jiaoyanzaosheng()
{
DWORD size;
size=GetSize();
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height;
BYTE* p_temp=new BYTE [size];
p_data=this->GetData();//取得原圖的數(shù)據(jù)區(qū)指針
memcpy(p_temp,p_data,size);
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
wide=this->GetWidth(); //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
for(int j=0;j<height;j++)
for(int i=0;i<wide;i++)
{
if(rand()>31500)
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();//取得原圖的數(shù)據(jù)區(qū)指針
memcpy(p_temp,p_data,size);
wide=this->GetWidth()*3; //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
for(int j=0;j<height;j++)
for(int i=0;i<wide;i++)
{
if(rand()>31500)
p_temp[j*wide+i]=0;
}
memcpy(m_pData,p_temp,size);
delete p_temp;
}
}
/***************************************************************/
/*函數(shù)名稱:jubupingjun() */
/*函數(shù)類型:void */
/*功能:對圖像進(jìn)行局部平均化處理。 */
/***************************************************************/
void ZaoShengXiaoChuDib::jubupingjun()
{
DWORD size;
size=GetSize();
BYTE *p_data;//原圖數(shù)據(jù)區(qū)指針
BYTE* p_temp=new BYTE[size];
int wide,height;
int n,ji[9],nmin;
float mean[9],bunsan[9],bmin;
p_data=this->GetData();//取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth(); //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
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種近鄰區(qū)域的均值及其方差
//第1近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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];
//求方差最小的近鄰區(qū)域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種近鄰區(qū)域的均值及其方差
//第1近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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近鄰區(qū)域
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];
//求方差最小的近鄰區(qū)域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;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -