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