综述
Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,然而在很多实际应用的场合,sobel边缘却是首选,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是在对效率要求较高,而对细纹理不太关系的时候。
其中,Gx是横向的算子,Gy是纵向的算子。
函数
void cv::Sobel
(
InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
int ksize = 3,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
)
src | 源图像 |
dst | 输出图像 |
ddepth | 输出图像的深度 CV_8U CV_16U CV_32F CV_64F |
dx | x 方向上的差分阶数,1或0 |
dy | y 方向上的差分阶数,1或0 |
ksize | 卷积核的大小(取值必须为1、3、5或7,默认值为3) |
scale | 计算的导数的可选比例因子(默认情况下不用缩放) |
dalta | 可选的增量值,在将结果存储到dst之前添加到结果中 |
borderType | 图像边框扩展模式(可查阅BorderTypes,但不支持BORDER_WRAP) |
测试代码
#include "widget.h"
#include "ui_widget.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//载入图像
cv::Mat mat1 = imread("C:/opencv/333.jpg");
//输出图片
cv::Mat matx;
cv::Mat maty;
cv::Mat matxy;
//x方向梯度
cv::Sobel(mat1,matx,CV_8U,1,0,3);
//y方向梯度
cv::Sobel(mat1,maty,CV_8U,0,1,3);
//合并梯度(近似)
cv::addWeighted(matx,0.8,maty,0.8,0,matxy);
namedWindow("显示器0", WINDOW_AUTOSIZE );
imshow("显示器0", mat1 );
namedWindow("显示器1", WINDOW_AUTOSIZE );
imshow("显示器1", matx );
namedWindow("显示器2", WINDOW_AUTOSIZE );
imshow("显示器2", maty );
namedWindow("显示器3", WINDOW_AUTOSIZE );
imshow("显示器3", matxy );
}
Widget::~Widget()
{
delete ui;
}