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