一、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);
效果如下: