图像锐化-拉普拉斯算子


转自:http://blog.csdn.net/devil_pull/article/details/17246855

图像锐化(拉普拉斯算子):

将一副图像减去经过拉普拉斯滤波滞后的图像,这幅图像的边缘部分将得到放大,计算公式如下:

滤波后的像素值=5*中-左-右-上-下:

[cpp]  view plain  copy
 
  1. /** 
  2.  * @file 2_6.cpp 
  3.  * @Synopsis  图像锐化,拉普拉斯算子 
  4.  * @author weih.cao 
  5.  * @version 1.0.0.0 
  6.  * @date 2013-12-10 
  7.  */  
  8. #include  
  9. #include  
  10. #include  
  11.   
  12. /* --------------------------------------------------------------------------*/  
  13. /** 
  14.  * @Synopsis  sharpen  
  15.  * 
  16.  * @Param image 
  17.  * @Param result 
  18.  */  
  19. /* ----------------------------------------------------------------------------*/  
  20. void sharpen(const cv::Mat image, cv::Mat &result)  
  21. {  
  22.     result.create(image.size(), image.type());  
  23.     for(int j = 1; j < image.rows-1; j++)  
  24.     {  
  25.         const uchar* previous = image.ptr<const uchar>(j-1);  
  26.         const uchar* current  = image.ptr<const uchar>(j);  
  27.         const uchar* next     = image.ptr<const uchar>(j+1);  
  28.   
  29.         uchar* output = result.ptr(j);  
  30.         for(int i = 1; i < image.cols-1; i++)  
  31.         {  
  32.             //sharpened_pixel = 5*current-left-right-up-down;  
  33.             //cv::saturate_cast用以对计算结果进行截断(0-255)  
  34.             *output++ = cv::saturate_cast(  
  35.                     5*current[i]-current[i-1]  
  36.                     -current[i+1]-previous[i]-next[i]);  
  37.         }  
  38.     }  
  39.     result.row(0).setTo(cv::Scalar(0));  
  40.     result.row(result.rows-1).setTo(cv::Scalar(0));  
  41.     result.col(0).setTo(cv::Scalar(0));  
  42.     result.col(result.cols-1).setTo(cv::Scalar(0));  
  43. }  
  44.   
  45. int main(int argc,char** argv)  
  46. {  
  47.     cv::Mat img = cv::imread(argc == 2 ? argv[1] : "lena.jpg");  
  48.     cv::cvtColor(img,img,CV_BGR2GRAY);  
  49.     cv::Mat result;  
  50.     result.create(img.size(), img.type());  
  51.     sharpen(img, result);  
  52.     cv::namedWindow("sharpen");  
  53.     cv::namedWindow("img");  
  54.     cv::imshow("img",img);  
  55.     cv::imshow("sharpen", result);  
  56.     cv::waitKey(0);  
  57. }  

1.cv::saturate_cast被用来对计算结果进行截断,对数值的数学计算常常超出允许的计算范围,解决方案是直接映射到0~255.

2.rowcol方法。返回一个特殊的、仅包含一行或一列的cv::Mat实例。在这个过程中没任何形式的数据拷贝,如果该一维矩阵遭到修改也会相应的修改原始图像。

3.setTo函数将矩阵的所有元素设为指定的值。

[cpp]  view plain  copy
 
  1. result.row(0).setTo(cv::Scalar(0));  

将图像的第一行的所有像素设置为0。三通道的爱色图像,需要使用cv::Scalar(a,b,c)来指定像素三个通道的目标值。


效果图:


你可能感兴趣的:(图像处理)