标题: 图像锐化处理c++语言 [打印本页]
作者: choi_hui 时间: 2017-11-3 18:09
标题: 图像锐化处理c++语言
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;}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |