找邊緣(Laplacian)

影像銳化有分一階微分或是二階微分,兩者的核心參數都是基於數學算式推導而成,這邊介紹基於二階微分的拉普拉斯算子,在影像銳化方面有很廣泛的運用,使用時通常對原始圖進行拉普拉斯運後取絕對值得到輸出圖,再將輸出圖和原始圖進行混和相加,得到一個和原始圖類似,但是細節被強調的圖。


二階微分定義為:

Laplacian

從上面兩式相加,我們可得到:

Laplacian

我們以模板表示計算結果,上式的結果相等於下面的模板:

Laplacian

在影像銳化中,響應只跟絕對值大小有關和正負號無關,故也可寫成以下模板:

Laplacian


OpenCV Laplace

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


以下示範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;
}

Laplacian

Laplacian

Laplacian

回到首頁

回到OpenCV教學


參考資料:

OpenCV 教程