拉普拉斯锐化

编译环境: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

你可能感兴趣的:(拉普拉斯锐化)