图像边缘检测

目录

Sobel算子

Scharr算子

Laplacian算子

Canny边缘检测


图像梯度是计算图像变化速度的方法,对于图像边缘部分,灰度值如果变化幅度较大,则其对应梯度值也较大,反之,图像中比较平滑的部分,灰度值变化较小,相应的梯度值变化也小

Sobel算子

Sobel算子是高斯平滑与微分操作的结合体,所以它的抗噪声能力很好

CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,
                         int dx, int dy, int ksize = 3,
                         double scale = 1, double delta = 0,
                         int borderType = BORDER_DEFAULT );

dst表示边缘检测结果图像
src表示原图像
depth为目标图像的深度
dx为导数x的阶数
dy为导数y的阶数
ksize为扩展的Sobel内核大小, 必须为1、3、5或7
scale为计算导数的可选比例因子
delat为添加到边缘检测结果中的可选增量值
borderType为边界值类型
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;



int main()
{
  
    Mat image = imread("./111.png", IMREAD_GRAYSCALE);
    //resize(image, image, Size(0, 0), 0.3, 0.3);
    imshow("原图", image);
    Mat sobel_x, sobel_x_abs;
    Mat sobel_y, sobel_y_abs;
    //对X方向求导
    Sobel(image, sobel_x, CV_64F, 1, 0);
    convertScaleAbs(sobel_x, sobel_x_abs);
    imshow("sobel_x_abs", sobel_x_abs);
    //对y方向求导
    Sobel(image, sobel_y, CV_64F, 0, 1);
    convertScaleAbs(sobel_y, sobel_y_abs);
    imshow("sobel_y_abs", sobel_y_abs);
    Mat sobel;
    addWeighted(sobel_x_abs, 0.5, sobel_y_abs, 0.5, 0, sobel);
    imshow("sobelabs", sobel);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

Scharr算子

Scharr与Sobel算子类似

Laplacian算子

通过拉普拉斯卷积核与图像矩阵进行卷积运算

void demo_laplacian()
{
    Mat image = imread("./test4.jpg", IMREAD_GRAYSCALE);
    resize(image, image, Size(0, 0), 0.3, 0.3);
    imshow("原图", image);
    Mat dst,dst1;
    Laplacian(image, dst, CV_32F);
    convertScaleAbs(dst, dst1);
    imshow("dst", dst1);
   
}

Canny边缘检测

Canny边缘检测的步骤

(1) 使用高斯滤波除去图像噪声
(2) 使用Sobel核进行滤波,计算梯度
(3) 在边缘使用非最大值抑制
(4) 对检测出的边缘使用双阈值以去除假阳性
(5) 分析边缘之间的连续性,保留真正的边缘

CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize = 3, bool L2gradient = false );


dst表示边缘检测结果图像
src表示原图像
threshold1为第1阈值
threshold2为第2阈值
apertureSize为计算梯度时使用的Sobel核大小
L2gradient为标志
int main()
{
    Mat image = imread("./test4.jpg", IMREAD_GRAYSCALE);
    resize(image, image, Size(0, 0), 0.3, 0.3);
    imshow("原图", image);
    Mat dst, dst1;
    Canny(image, dst, 80, 150);
    imshow("Canny", dst);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值