?? zaoshengxiaochudib.cpp
字號:
averg2=0;
averg3=0;
//求周圍8近鄰均值
averg=(int)(p_data[(j-1)*wide*3+(i-1)*3]+p_data[(j-1)*wide+i*3]
+p_data[(j-1)*wide*3+(i+1)*3]+p_data[j*wide+(i-1)*3]
+p_data[j*wide*3+(i+1)*3]+p_data[(j+1)*wide+(i-1)*3]
+p_data[(j+1)*wide*3+i*3]+p_data[(j+1)*wide+(i+1)*3])/8;
averg2=(int)(p_data[(j-1)*wide*3+(i-1)*3+1]+p_data[(j-1)*wide+i*3+1]
+p_data[(j-1)*wide*3+(i+1)*3+1]+p_data[j*wide+(i-1)*3+1]
+p_data[j*wide*3+(i+1)*3+1]+p_data[(j+1)*wide+(i-1)*3+1]
+p_data[(j+1)*wide*3+i*3+1]+p_data[(j+1)*wide+(i+1)*3+1])/8;
averg3=(int)(p_data[(j-1)*wide*3+(i-1)*3+2]+p_data[(j-1)*wide+i*3+2]
+p_data[(j-1)*wide*3+(i+1)*3+2]+p_data[j*wide+(i-1)*3+2]
+p_data[j*wide*3+(i+1)*3+2]+p_data[(j+1)*wide+(i-1)*3+2]
+p_data[(j+1)*wide*3+i*3+2]+p_data[(j+1)*wide+(i+1)*3+2])/8;
if(abs(p_temp[j*wide*3+i*3]-averg)>T)
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;
}
}
/***************************************************************/
/*函數(shù)名稱:nn(int n) */
/*函數(shù)類型:void */
/*參數(shù):int n,設(shè)定的屏蔽窗口參數(shù)(奇數(shù)) */
/*功能:對圖像進(jì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)//確認(rèn)n為奇數(shù)
AfxMessageBox("請輸入一個大于等于3的奇數(shù)");
if(n>=3&&n%2==1)
n2=(n-1)/2;
p_data=this->GetData();//取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth(); //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
//用N*N屏蔽窗口平均化
for(int j=n2;j<height-n2;j++)
{
for(int i=n2;i<wide-n2;i++)
{ //求N*N屏蔽窗口內(nèi)的總和sum
sum=0;
for(yy=j-n2;yy<=j+n2;yy++)
for(xx=i-n2;xx<=i+n2;xx++)
sum+=p_data[yy*wide+xx];
//把n*n屏蔽窗口內(nèi)的平均值四舍五入后作為顯示圖像像素值
p_temp[j*wide+i]=(int)((float)sum/(n*n)+0.5);
}
}
memcpy(p_data,p_temp,size);
delete p_temp;
}
else //24位彩色
{
if(n<3||n%2!=1)//確認(rèn)n為奇數(shù)
AfxMessageBox("請輸入一個大于等于3的奇數(shù)");
if(n>=3&&n%2==1)
n2=(n-1)/2;
p_data=this->GetData();//取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth(); //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
BYTE* p_temp=new BYTE [wide*height*3];
memset(p_temp,255,wide*height*3);
//用N*N屏蔽窗口平均化
for(int j=n2;j<height-n2;j++)
{
for(int i=n2;i<wide-n2;i++)
{
//求N*N屏蔽窗口內(nèi)的總和sum
sum=0;
sum2=0;
sum3=0;
for(yy=j-n2;yy<=j+n2;yy++)
for(xx=i-n2;xx<=i+n2;xx++)
{
sum+=p_data[yy*wide*3+xx*3];
sum2+=p_data[yy*wide*3+xx*3+1];
sum3+=p_data[yy*wide*3+xx*3+2];
}
//把n*n屏蔽窗口內(nèi)的平均值四舍五入后作為顯示圖像像素值
p_temp[j*wide*3+i*3]=(int)((float)sum/(n*n)+0.5);
p_temp[j*wide*3+i*3+1]=(int)((float)sum2/(n*n)+0.5);
p_temp[j*wide*3+i*3+2]=(int)((float)sum3/(n*n)+0.5);
}
}
memcpy(p_data,p_temp,wide*height*3);
delete p_temp;
}
}
/***************************************************************/
/*函數(shù)名稱:nnzhong(int n) */
/*函數(shù)類型:void */
/*參數(shù):int n,設(shè)定的屏蔽窗口參數(shù)(奇數(shù)) */
/*功能:對圖像進(jìn)行n*n中值濾波處理。 */
/***************************************************************/
void ZaoShengXiaoChuDib::nnzhong(int n)
{
DWORD size;
size=GetSize();
BYTE* p_temp=new BYTE [size];
memset(p_temp,255,size);
int yy,xx,n2,nn,chuo,chg,m,medi,medi2,medi3,madom,mado[1000],mado2[1000],mado3[1000];
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height; //原圖長、寬
if(n<3||n%2!=1)//檢查取值是否為3.5.7等的奇數(shù)
AfxMessageBox("請輸入一個大于等于3的奇數(shù)");
if(n>=3&&n%2==1)
n2=(n-1)/2;
nn=n*n;
chuo=(nn-1)/2;
p_data=this->GetData();//取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth(); //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
//n*n中值濾波
for(int j=n2;j<height-n2;j++)
for(int i=n2;i<wide-n2;i++)
{
//把n*n屏蔽窗口部分的所有像素值放入mado[m]
m=0;
for(yy=j-n2;yy<=j+n2;yy++)
for(xx=i-n2;xx<=i+n2;xx++)
{
mado[m]=p_data[yy*wide+xx];
m++;
}
//把mado[m]中的值按下降順序用冒泡法排序
do{
chg=0;
for(m=0;m<nn-1;m++)
{
if(mado[m]<mado[m+1])
{
madom=mado[m];
mado[m]=mado[m+1];
mado[m+1]=madom;
chg=1;
}
}
}while(chg==1);
//求中值medi
medi=mado[chuo];
//把中值代入顯示圖像中
p_temp[j*wide+i]=medi;
}
memcpy(p_data,p_temp,size);
delete p_temp;
}
else //24位彩色
{
//n*n中值濾波
for(int j=n2;j<height-n2;j++)
for(int i=n2;i<wide-n2;i++)
{
//把n*n屏蔽窗口部分的所有像素值放入mado[m]
m=0;
for(yy=j-n2;yy<=j+n2;yy++)
for(xx=i-n2;xx<=i+n2;xx++)
{
mado[m]=p_data[yy*wide*3+xx*3];
mado2[m]=p_data[yy*wide*3+xx*3+1];
mado3[m]=p_data[yy*wide*3+xx*3+2];
m++;
}
//把mado[m]中的值按下降順序用冒泡法排序
do{
chg=0;
for(m=0;m<nn-1;m++)
{
if(mado[m]<mado[m+1])
{
madom=mado[m];
mado[m]=mado[m+1];
mado[m+1]=madom;
chg=1;
}
if(mado2[m]<mado2[m+1])
{
madom=mado2[m];
mado2[m]=mado2[m+1];
mado2[m+1]=madom;
chg=1;
}
if(mado3[m]<mado3[m+1])
{
madom=mado3[m];
mado3[m]=mado3[m+1];
mado3[m+1]=madom;
chg=1;
}
}
}while(chg==1);
//求中值medi
medi=mado[chuo];
medi2=mado2[chuo];
medi3=mado3[chuo];
//把中值代入顯示圖像中
p_temp[j*wide*3+i*3]=medi;
p_temp[j*wide*3+i*3+1]=medi2;
p_temp[j*wide*3+i*3+2]=medi3;
}
memcpy(p_data,p_temp,wide*height*3);
delete p_temp;
}
}
/***************************************************************/
/*函數(shù)名稱:shizi(int n) */
/*函數(shù)類型:void */
/*參數(shù):int n,設(shè)定的屏蔽窗口參數(shù)(奇數(shù)) */
/*功能:對圖像進(jìn)行十字型中值濾波。 */
/***************************************************************/
void ZaoShengXiaoChuDib::shizi(int n)
{
DWORD size;
size=GetSize();
BYTE* p_temp=new BYTE [size];
memset(p_temp,255,size);
int yy,xx,n2,nn,chuo,chg,m,medi,medi2,medi3,madom,mado[1000],mado2[1000],mado3[1000];
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height; //原圖長、寬
if(n<3||n%2!=1)//檢查取值是否為3.5.7等的奇數(shù)
AfxMessageBox("請輸入一個大于等于3的奇數(shù)");
if(n>=3&&n%2==1)
n2=(n-1)/2;
nn=n+n-1;
chuo=(nn-1)/2;
p_data=this->GetData();//取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth(); //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
//十字型中值濾波
for(int j=n2;j<height-n2;j++)
for(int i=n2;i<wide-n2;i++)
{
//把十字型屏蔽窗口部分的所有像素值代入mado[m]
//(代入含中心的垂直部分)
m=0;
for(yy=j-n2;yy<=j+n2;yy++)
{
mado[m]=p_data[yy*wide+i];
m++;
}
//(代入中心以外的的水平部分)
for(xx=i-n2;xx<=i+n2;xx++)
{
if(xx==i)continue;
mado[m]=p_data[j*wide+xx];
m++;
}
//把mado[m]的內(nèi)容按下降順序冒泡法分類
do{
chg=0;
for(m=0;m<nn-1;m++)
{
if(mado[m]<mado[m+1])
{
madom=mado[m];
mado[m]=mado[m+1];
mado[m+1]=madom;
chg=1;
}
}
}while(chg==1);
//求中值medi
medi=mado[chuo];
p_temp[j*wide+i]=medi;
}
memcpy(m_pData,p_temp,size);
delete p_temp;
}
else //24位彩色
{
//十字型中值濾波
for(int j=n2;j<height-n2;j++)
for(int i=n2;i<wide-n2;i++)
{
//把十字型屏蔽窗口部分的所有像素值代入mado[m]
//(代入含中心的垂直部分)
m=0;
for(yy=j-n2;yy<=j+n2;yy++)
{
mado[m]=p_data[yy*wide*3+i*3];
mado2[m]=p_data[yy*wide*3+i*3+1];
mado3[m]=p_data[yy*wide*3+i*3+2];
m++;
}
//(代入中心以外的的水平部分)
for(xx=i-n2;xx<=i+n2;xx++)
{
if(xx==i)continue;
mado[m]=p_data[j*wide*3+xx*3];
mado2[m]=p_data[j*wide*3+xx*3+1];
mado3[m]=p_data[j*wide*3+xx*3+2];
m++;
}
//把mado[m]的內(nèi)容按下降順序冒泡法分類
do{
chg=0;
for(m=0;m<nn-1;m++)
{
if(mado[m]<mado[m+1])
{
madom=mado[m];
mado[m]=mado[m+1];
mado[m+1]=madom;
chg=1;
}
if(mado2[m]<mado2[m+1])
{
madom=mado2[m];
mado2[m]=mado2[m+1];
mado2[m+1]=madom;
chg=1;
}
if(mado3[m]<mado3[m+1])
{
madom=mado3[m];
mado3[m]=mado3[m+1];
mado3[m+1]=madom;
chg=1;
}
}
}while(chg==1);
//求中值medi
medi=mado[chuo];
medi2=mado2[chuo];
medi3=mado3[chuo];
p_temp[j*wide*3+i*3]=medi;
p_temp[j*wide*3+i*3+1]=medi2;
p_temp[j*wide*3+i*3+2]=medi3;
}
memcpy(m_pData,p_temp,wide*height*3);
delete p_temp;
}
}
/***************************************************************/
/*函數(shù)名稱:nnzuida(int n) */
/*函數(shù)類型:void */
/*參數(shù):int n,設(shè)定的屏蔽窗口參數(shù)(奇數(shù)) */
/*功能:對圖像進(jìn)行N*N最大值濾波。 */
/***************************************************************/
void ZaoShengXiaoChuDib::nnzuida(int n)
{
DWORD size;
size=GetSize();
int yy,xx,n2,nn,m,madomax,madomax2,madomax3,mado[1000],mado2[1000],mado3[1000];
BYTE *p_data; //原圖數(shù)據(jù)區(qū)指針
int wide,height;
BYTE* p_temp=new BYTE [size];
memset(p_temp,255,size);
if(n<3||n%2!=1)//確認(rèn)n是3以上的奇數(shù)
AfxMessageBox("請輸入一個大于等于3的奇數(shù)");
if(n>=3&&n%2==1)
n2=(n-1)/2;
nn=n*n;
p_data=this->GetData();//取得原圖的數(shù)據(jù)區(qū)指針
wide=this->GetWidth(); //取得原圖的數(shù)據(jù)區(qū)寬
height=this->GetHeight(); //取得原圖的數(shù)據(jù)區(qū)高
if(m_pBitmapInfoHeader->biBitCount<9) //灰度圖像
{
//n*n最大值頻率濾波
for(int j=n2;j<height-n2;j++)
for(int i=n2;i<wide-n2;i++)
{
//把n*n屏蔽窗口部分復(fù)制到mado[m]
m=0;
for(yy=j-n2;yy<=j+n2;yy++)
for(xx=i-n2;xx<=i+n2;xx++)
{
mado[m]=p_data[yy*wide+xx];
m++;
}
//找出mado[m]中的最大值madomax,用作最大頻率值
madomax=mado[0];
for(m=1;m<nn;m++)
if(madomax<mado[m])
madomax=mado[m];
p_temp[j*wide+i]=madomax;
}
memcpy(m_pData,p_temp,size);
delete p_temp;
}
else //24位彩色
{
//n*n最大值頻率濾波
for(int j=n2;j<height-n2;j++)
for(int i=n2;i<wide-n2;i++)
{
//把n*n屏蔽窗口部分復(fù)制到mado[m]
m=0;
for(yy=j-n2;yy<=j+n2;yy++)
for(xx=i-n2;xx<=i+n2;xx++)
{
mado[m]=p_data[yy*wide*3+xx*3];
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -