找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3383|回复: 0
打印 上一主题 下一主题
收起左侧

图像锐化处理c++语言

[复制链接]
跳转到指定楼层
楼主
ID:245772 发表于 2017-11-3 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表