基於OpenCvSharp的數字圖像處理 - 銳化、邊緣檢測

一、Sobel算子

Sobel算子是一階導數的近似,分橫向求導和縱向求導,其3階算子爲:

實際運用時,我們可以把兩次求導的結果按一定比例結合在一起。

Mat src = new Mat(img_lenna, ImreadModes.Grayscale);

Mat grad_x = new Mat();
Mat grad_x2 = new Mat();
Cv2.Sobel(src, grad_x, MatType.CV_16S, 1, 0);
Cv2.ConvertScaleAbs(grad_x, grad_x2);

Mat grad_y = new Mat();
Mat grad_y2 = new Mat();
Cv2.Sobel(src, grad_y, MatType.CV_16S, 0, 1);
Cv2.ConvertScaleAbs(grad_y, grad_y2);

Mat result = new Mat();
Cv2.AddWeighted(grad_x2, 0.5, grad_y2, 0.5, 0, result);
result.SaveImage(img_result);

效果如下:

左上:原圖,右上:兩個方向平均混合,左下:縱向邊緣,右下:橫向邊緣

二、Scharr算子

Scharr算子是對Sobel算子的優化,特別在覈爲3*3時。其3階算子爲:

Mat src = new Mat(img_lenna, ImreadModes.Grayscale);

Mat grad_x = new Mat();
Mat grad_x2 = new Mat();
Cv2.Scharr(src, grad_x, MatType.CV_16S, 1, 0);
Cv2.ConvertScaleAbs(grad_x, grad_x2);

Mat grad_y = new Mat();
Mat grad_y2 = new Mat();
Cv2.Scharr(src, grad_y, MatType.CV_16S, 0, 1);
Cv2.ConvertScaleAbs(grad_y, grad_y2);

Mat result = new Mat();
Cv2.AddWeighted(grad_x2, 0.5, grad_y2, 0.5, 0, result);
result.SaveImage(img_result);

效果如下:

左上:原圖,右上:兩個方向平均混合,左下:縱向邊緣,右下:橫向邊緣

三、拉普拉斯算子

拉普拉斯算子是二階導數的近似。其3階算子爲:

Mat src = new Mat(img_lenna, ImreadModes.Grayscale);
Mat result = new Mat();
Cv2.Laplacian(src, result, MatType.CV_16S, 3);
result.SaveImage(img_result);

效果如下:

四、Canny邊緣檢測

Canny算法做了大量的優化,是比較穩定和高質量的邊緣檢測算法。

Mat src = new Mat(img_lenna, ImreadModes.Grayscale);
Mat result = new Mat();
//Cv2.Blur(src, src, new OpenCvSharp.Size(3, 3));
Cv2.Canny(src, result, 40, 120, 3);
result.SaveImage(img_result);

效果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章