1、平滑濾波(均值濾波) void CTextView::OnSmooth() { //功能:實(shí)現(xiàn)均值濾波處理 //判斷圖像是否打開,沒(méi)打開,則彈出提示框并退出函數(shù) if(!m_dib.m_bLoaded) { AfxMessageBox("圖像還打開,請(qǐng)先打開圖像!"); return; } //獲取圖像寬和高 intnw=m_dib.GetDIBWidth(); int nh=m_dib.GetDIBHeight(); int i,j,m,n; BYTE* ptmp=newBYTE[nw*nh]; //開辟一個(gè)與m_dib.m_pdata指向同樣大小的緩沖區(qū),可以進(jìn)一步了解BYTE是什么數(shù)據(jù)類型 memcpy(ptmp,m_dib.m_pdata,nw*nh);//將m_dib.m_pdata指向的nw*nh個(gè)字節(jié)內(nèi)容復(fù)制給ptmp指向的緩沖區(qū) intmask[9]={1,1,1, 1,1,1, 1,1,1}; // 建立算子模板 int w_mask=3; //定義模板的大小 //對(duì)每一個(gè)象素進(jìn)行模板運(yùn)算處理 for(j=w_mask/2;j<nh-w_mask/2;j++) //注意,行和列的起始和結(jié)束位置,思考為什么會(huì)要這樣? for(i=w_mask/2;i<nw-w_mask/2;i++) { //對(duì)圖像的第j行、第i列的像素 intresult=0; for(m=-w_mask/2;m<=w_mask/2;m++) for(n=-w_mask/2;n<=w_mask/2;n++) result+=ptmp[(j+m)*nw+i+n]*mask[(m+w_mask/2)*w_mask+n+w_mask/2]; result=(result)/9; //因?yàn)檫\(yùn)算后有點(diǎn)值小于零 if(result>255) result=255; m_dib.m_pdata[j*nw+i]=result; } //將修改的m_pdata的數(shù)據(jù)賦值給m_pDIBData,以顯示修改的結(jié)果 m_dib.UpdateData(); //刷新屏幕 Invalidate(); delete ptmp; } 2、銳化(拉普拉斯算子) voidCTextView::OnMask() { //功能:實(shí)現(xiàn)銳化處理 //判斷圖像是否打開,沒(méi)打開,則彈出提示框并退出函數(shù) if(!m_dib.m_bLoaded) { AfxMessageBox("圖像還打開,請(qǐng)先打開圖像!"); return; //獲取圖像寬和高 intnw=m_dib.GetDIBWidth(); intnh=m_dib.GetDIBHeight(); int i,j,m,n; BYTE* ptmp=newBYTE[nw*nh]; //開辟一個(gè)與m_dib.m_pdata指向同樣大小的緩沖區(qū),可以進(jìn)一步了解BYTE是什么數(shù)據(jù)類型 memcpy(ptmp,m_dib.m_pdata,nw*nh);//將m_dib.m_pdata指向的nw*nh個(gè)字節(jié)內(nèi)容復(fù)制給ptmp指向的緩沖區(qū) intmask[9]={0,1,0, 1,-4,1, 0,1,0}; // 建立算子模板Laplace 3*3 intw_mask=3; //定義模板的大小 for(j=w_mask/2;j<nh-w_mask/2;j++) for(i=w_mask/2;i<nw-w_mask/2;i++) { //對(duì)圖像的第j行、第i列的像素 intresult=0; for(m=-w_mask/2;m<=w_mask/2;m++) { for(n=-w_mask/2;n<=w_mask/2;n++) {result+=ptmp[(j+m)*nw+i+n]*mask[(m+w_mask/2)*w_mask+n+w_mask/2];} } result=abs(result+ptmp[(j+m)*nw+i+n]); //因?yàn)檫\(yùn)算后有點(diǎn)值小于零 if(result>255) result=255; m_dib.m_pdata[j*nw+i]=result; } //將修改的m_pdata的數(shù)據(jù)賦值給m_pDIBData,以顯示修改的結(jié)果 m_dib.UpdateData(); //刷新屏幕 Invalidate(); deleteptmp;}
|