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;}
|