cv::Sobel (
InputArray Src // 输入图像
OutputArray dst// 输出图像,大小与输入图像一致
int depth // 输出图像深度
Int dx. // X方向,几阶导数//求导顺序,范围是0、1、2
int dy // Y方向,几阶导数. //x、y不能同时为0
int ksize// Sobel算子kernel大小,必须是奇数//ksize为SHARR
double scale = 1//缩放因子
double delta = 0//偏移,求导结果可视化
int borderType = BORDER_DEFAULT
)
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src;
src = imread("../path.jpg");
if (src.empty())
{
cout << "could not load image1..." << endl;
return -1;
}
//namedWindow("src", WINDOW_AUTOSIZE);
//imshow("src", src);
Mat dst,gray;
GaussianBlur(src, dst, Size(3, 3), 0, 0);//高斯平滑
cvtColor(dst, gray, COLOR_BGR2GRAY);//图像转灰度
//namedWindow("gray", WINDOW_AUTOSIZE);
//imshow("gray", gray);
Mat xgrad, ygrad;
//Sobel算子
//Sobel(gray, xgrad, CV_16S, 1, 0, 3);//kernel size默认为3
//Sobel(gray, ygrad, CV_16S, 0, 1, 3);//kernel size默认为3
//kernel size为Scharr
//Scharr滤波器
Scharr(gray, xgrad, CV_16S, 1, 0);
Scharr(gray, ygrad, CV_16S, 0, 1);
//取绝对值
convertScaleAbs(xgrad, xgrad);
convertScaleAbs(ygrad, ygrad);
namedWindow("xgrad", WINDOW_AUTOSIZE);
namedWindow("ygrad", WINDOW_AUTOSIZE);
imshow("xgrad", xgrad);
imshow("ygrad", ygrad);
Mat xygrad = Mat(xgrad.size(), xgrad.type());
//addWeighted(xgrad, 0.5, ygrad, 0.5, 0, xygrad);//图像混合
int width = xgrad.cols;
int height = xgrad.rows;
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
int xg = xgrad.at(row, col);
int yg = ygrad.at(row, col);
int xy = xg + yg;//两个图像相加,而不是混合
xygrad.at(row, col) = saturate_cast(xy);
}
}
namedWindow("xygrad", WINDOW_AUTOSIZE);
imshow("xygrad", xygrad);
waitKey(0);
return 0;
}
输出结果: