Sobel算子

Sobel算子就是对图像求导,得到图像边缘梯度。

 

 

 

 

 

 

 

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv) {
    Mat src, dst;
    int ksize = 0;

    src = imread("L:/5.jpg");
    if (!src.data) {
        printf("could not load image...\n");
        return -1;
    }

    char INPUT_WIN[] = "input image";
    char OUTPUT_WIN[] = "sobel-demo";
    namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
    namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
    imshow(INPUT_WIN, src);
    GaussianBlur(src, dst, Size(3, 3), 0, 0);  //高斯平滑,高斯滤波
    Mat gray_src;
    cvtColor(dst, gray_src,CV_BGR2GRAY);
    imshow("gray image", gray_src);
    
    Mat xgrad, ygrad;
    Sobel(gray_src, xgrad, CV_16S, 1, 0, 3);  //X轴方向梯度
    Sobel(gray_src, ygrad, CV_16S, 0, 1, 3); //Y轴方向梯度 
    convertScaleAbs(xgrad, xgrad);          //X梯度线性变换转换输入数组元素成8位无符号整形
    convertScaleAbs(ygrad, ygrad);          //Y梯度线性变换转换输入数组元素成8位无符号整形
    imshow("xgrad", xgrad);
    imshow("ygrad", ygrad);

    Mat xygrad;
    addWeighted(xgrad, 0.5, ygrad, 0.5, 0, xygrad);  //X、Y梯度各占权重0.5
    imshow("Final Result",xygrad);

    waitKey(0);
    return 0;
}

结果:

灰度图像

 

 

 X轴方向梯度:

 

 

 Y轴方向梯度:

 

 0.5X+0.5Y方向:

 

posted @ 2019-09-02 08:45  量子与太极  阅读(424)  评论(0编辑  收藏  举报