概述
- scharr算子实际上是sobel算子的优化。
- 两种算子唯一的区别就是他们的卷积核不同,他们无论在计算时间还是复杂度都是一样的。
函数
void cv::Scharr
(
InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
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 |
scale | 计算的导数的可选比例因子(默认情况下不用缩放) |
delta | 可选的增量值,在将结果存储到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 src = imread("C:/opencv/fruit.jpg");
imshow("src",src);
//x方向梯度
cv::Mat matx;
cv::Scharr(src,matx,CV_8U,1,0);
imshow("matx",matx);
//y方向梯度
cv::Mat maty;
cv::Scharr(src,maty,CV_8U,0,1);
imshow("maty",maty);
//合并梯度
cv::Mat dst;
cv::addWeighted(matx,0.8,maty,0.8,0,dst);
imshow("dst",dst);
}
Widget::~Widget()
{
delete ui;
}