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