拉普拉斯锐化

编译环境:QT(4.7.4)+WIN7(64位)   

使用的模板就是书上最简单的laplace模板:

  

0 -1 0
-1 4 -1
0 -1 0

    代码如下:

 1 void MainWindow::on_action_laplace_triggered()
 2 {
 3     //image_png指向原图像
 4     width = image_png.width();
 5     height = image_png.height();
 6     int muban[3][3] = {0,-1,0,-1,4,-1,0,-1,0};
 7     
 8     //grayImg保存锐化后的结果
 9     grayImg = QImage(width,height,QImage::Format_RGB888);
10 
11     for(int i=0;i < width;i++)
12     {
13         for(int j =0;j < height;j ++)
14         {
15             int sum = 0;
16             
17             //对每一个像素使用模板
18             for(int m = i-1;m <= i+1;m++)
19             {
20                 for(int n = j-1;n <= j+1;n++)
21                 {
22                     //边界点像素为0,所以对应相乘时不加和
23                     if(m>=0&&n>=0&&m<width&&n<height)
24                         sum += qGray(image_png.pixel(m,n))*muban[n-j+1][m-i+1];
25                 }
26             }
27             
28             //获取原图像对应点灰度,和拉普拉斯微分后图像对应点相加
29             int ogray = qGray(image_png.pixel(i,j));
30             sum = (sum >= 0)?sum:0;
31             sum = (sum+ogray>255)?255:sum+ogray;
32 
33             //这里只实现了灰度图像,所以RGB值相等。
34             grayImg.setPixel(i,j,qRgb(sum,sum,sum));
35         }
36     }
37     update();
38 }

主要注意以下几点:
1.拉普拉斯微分处理后,有些点像素值为负值,所以有第30行的对sum值的判断和修改。如果没有这句,得到的微分后的图像中有很多白点。

2.拉普拉斯算子处理后的图像要和原图像相加,可以复原背景特性并保持拉普拉斯瑞华处理的效果。如果所使用的模板中心是负数,那么必须将原图像减去经拉普拉斯变换后的图像。如果像我这里使用的模板中心是正数,那么就将原图像加上经过拉普拉斯变换后的图像。

3.经拉普拉斯变换处理后的图像与原图像对应灰度相加,有可能超过最大灰度级255,所以代码31行加了相应的判断。如果没有这个判断,得到的图像看起来更像是平滑过而不是锐化过的。

得到的效果截图如下:

 

转载请注明出处:BY DEMONEDGE
posted @ 2013-11-12 10:18  SunshineAtNoon  阅读(3137)  评论(0编辑  收藏  举报