基于OpenCvSharp的数字图像处理 - 锐化、边缘检测

创建项目  |  文件与显示  |  像素操作  |  图像彩色类型转换  |  模糊、平滑、去噪  |  锐化、边缘检测  |  二值化  |  形态学  |  位置变换  |  直方图  |  霍夫变换  |  图像优化  |  图像分割

完整示例项目

 

一、Sobel算子

Sobel算子是一阶导数的近似,分横向求导和纵向求导,其3阶算子为:

基于OpenCvSharp的数字图像处理 - 锐化、边缘检测_第1张图片

实际运用时,我们可以把两次求导的结果按一定比例结合在一起。

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);

效果如下:

基于OpenCvSharp的数字图像处理 - 锐化、边缘检测_第2张图片

左上:原图,右上:两个方向平均混合,左下:纵向边缘,右下:横向边缘

二、Scharr算子

Scharr算子是对Sobel算子的优化,特别在核为3*3时。其3阶算子为:

基于OpenCvSharp的数字图像处理 - 锐化、边缘检测_第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);

效果如下:

基于OpenCvSharp的数字图像处理 - 锐化、边缘检测_第4张图片

左上:原图,右上:两个方向平均混合,左下:纵向边缘,右下:横向边缘

三、拉普拉斯算子

拉普拉斯算子是二阶导数的近似。其3阶算子为:

基于OpenCvSharp的数字图像处理 - 锐化、边缘检测_第5张图片

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

效果如下:

基于OpenCvSharp的数字图像处理 - 锐化、边缘检测_第6张图片

四、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);

效果如下:

基于OpenCvSharp的数字图像处理 - 锐化、边缘检测_第7张图片

你可能感兴趣的:(数字图像处理,OpenCvSharp,OpenCV,C#,图像处理,边缘检测)