目录
图像梯度是计算图像变化速度的方法,对于图像边缘部分,灰度值如果变化幅度较大,则其对应梯度值也较大,反之,图像中比较平滑的部分,灰度值变化较小,相应的梯度值变化也小
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;
}