拉普拉斯銳化


編譯環境: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM