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

效果如下:

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值