创建项目 | 文件与显示 | 像素操作 | 图像彩色类型转换 | 模糊、平滑、去噪 | 锐化、边缘检测 | 二值化 | 形态学 | 位置变换 | 直方图 | 霍夫变换 | 图像优化 | 图像分割
完整示例项目
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算子是对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算法做了大量的优化,是比较稳定和高质量的边缘检测算法。
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);
效果如下: