影像銳化有分一階微分或是二階微分,兩者的核心參數都是基於數學算式推導而成,這邊介紹基於二階微分的拉普拉斯算子,在影像銳化方面有很廣泛的運用,使用時通常對原始圖進行拉普拉斯運後取絕對值得到輸出圖,再將輸出圖和原始圖進行混和相加,得到一個和原始圖類似,但是細節被強調的圖。
二階微分定義為:
從上面兩式相加,我們可得到:
我們以模板表示計算結果,上式的結果相等於下面的模板:
在影像銳化中,響應只跟絕對值大小有關和正負號無關,故也可寫成以下模板:
void Laplacian(InputArray src, OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, intborderType=BORDER_DEFAULT)
src:輸入圖。dst:輸出圖,和輸入圖有相同的尺寸和通道數。ddepth:輸出圖的深度,假設輸入圖為CV_8U, 支援CV_8U、CV_16S、CV_32F、CV_64F,假設輸入圖為 CV_16U, 支援CV_16U、CV_32F、CV_64F。ksize:核心,預設為1,輸入值必須為正整數。假設ksize為預設的1,則使用以下的模板進行迴積:
以下示範Laplacian()的用法:
#include <cstdio> #include <opencv2/opencv.hpp> using namespace cv; int main(){ Mat src = imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE); GaussianBlur(src, src, Size(3,3), 0, 0); Mat dst1, dst2, dst3; Laplacian(src, dst1, CV_16S, 3, 1, 0, BORDER_DEFAULT ); convertScaleAbs(dst1, dst2); //轉成CV_8U threshold(dst2, dst3, 80, 255, THRESH_BINARY|THRESH_OTSU); imshow("origin", src); imshow("Laplacian_1", dst2); imshow("Laplacian_2", dst3); waitKey(0); return 0; }
转自:http://monkeycoding.com/?p=638