(一)OpenCV图像处理基础_16_Sobel算子

Diana ·
更新时间:2024-09-21
· 855 次阅读

卷积应用-图像边缘提取
边缘是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。
如何捕捉/提取边缘 – 对图像求它的一阶导数delta = f(x) – f(x-1), delta越大,说明像素在X方向变化越大,边缘信号越强。 Sobel算子(锚点为 0)
水平梯度^2 + 垂直梯度^2 = 最终图像梯度^2 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; }

输出结果:
在这里插入图片描述


作者:丶小早



opencv sobel

需要 登录 后方可回复, 如果你还没有账号请 注册新账号