图像锐化【检测和完善过代码】

此函数利用Lapacian算子实现了图像的锐化,可见于《数字图像获取,处理及实践应用》此书第四章p175页有此程序及相关详细算法说明,下面的程序已经经过在下的修改,接口更好。

/*************************************************************************
 *
 * /函数名称:
 *   LinearSharpen()
 *
 * /输入参数:
 *   unsigned char* lpImage  - 指向图象数据得指针
 *   int nWidth   - 图象数据宽度
 *   int nHeight  - 图象数据高度

 *   unsigned char* SharpenImage - 指向输出图像数据的指针
 *
 * /返回值:
 *   无
 *
 * /说明:
 *   线性锐化图象增强
 *   本函数采用拉普拉斯算子对图象进行线性锐化
 *   在原来图象上加上拉普拉斯算子锐化的信息
 *
 *************************************************************************
 */
void LinearSharpen(unsigned char* lpImage, int nWidth, int nHeight, unsigned char* SharpenImage)
{
 // 遍历图象的纵坐标
 int y;

 // 遍历图象的横坐标
 int x;

 double * pdGrad ;
 
 // 设置模板系数
 static int nWeight[3][3] = {{-1,-1,-1},{-1,8,-1},{-1,-1,-1}};

 //这个变量用来表示Laplacian算子象素值
 int nTmp[3][3];

 // 临时变量
 double dGrad;

 // 模板循环控制变量
 int yy ;
 int xx ;

 pdGrad = (double *)malloc(nWidth*nHeight*sizeof(double));

 // 初始化为0
 memset(pdGrad, 0, nWidth*nHeight*sizeof(double));

 for(y=1; y<nHeight-1 ; y++ )
  for(x=1 ; x<nWidth-1 ; x++ )
  {
   dGrad = 0 ;
   // Laplacian算子需要的各点象素值
  
   // 模板第一行
   nTmp[0][0] = lpImage[(y-1)*nWidth + x - 1 ] ;
   nTmp[0][1] = lpImage[(y-1)*nWidth + x     ] ;
   nTmp[0][2] = lpImage[(y-1)*nWidth + x + 1 ] ;
  
   // 模板第二行
   nTmp[1][0] = lpImage[y*nWidth + x - 1 ] ;
   nTmp[1][1] = lpImage[y*nWidth + x     ] ;
   nTmp[1][2] = lpImage[y*nWidth + x + 1 ] ;
  
   // 模板第三行
   nTmp[2][0] = lpImage[(y+1)*nWidth + x - 1 ] ;
   nTmp[2][1] = lpImage[(y+1)*nWidth + x     ] ;
   nTmp[2][2] = lpImage[(y+1)*nWidth + x + 1 ] ;
  
   // 计算梯度
   for(yy=0; yy<3; yy++)
    for(xx=0; xx<3; xx++)
    {
     dGrad += nTmp[yy][xx] * nWeight[yy][xx] ;
    }
   
    // 梯度值写入内存
    *(pdGrad+y*nWidth+x)=dGrad;
  }
 for(y=0; y<nHeight ; y++ )
 {
  for(x=0 ; x<nWidth ; x++ )
  {
   int temp = lpImage[y*nWidth+x] + (int)pdGrad[y*nWidth+x];
   if(temp > 255)
    temp = 255;
   else if(temp < 0)
    temp = 0;
   
   SharpenImage[y*nWidth+x] = (unsigned char)temp;

  }
 }
 free(pdGrad) ;
 pdGrad = NULL   ;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值