在OpenCV中有一种快速简便的方法来计算图像的渐变吗?

时间:2011-12-14 16:04:40

标签: c++ opencv

使用最新的OpenCV,有一种简单的方法来计算特定cv :: Mat的渐变图像吗?

3 个答案:

答案 0 :(得分:15)

假设您指的是典型的image gradient;您可以使用Chris提到的Sobel运算符轻松计算这些数据。看看Sobel Derivatives教程here。您可能还对Laplace运算符及其tutorial

感兴趣

以下是使用Sobel计算X和Y渐变的简短片段:

cv::Mat src = ...; // Fill the input somehow.

cv::Mat Dx;
cv::Sobel(src, Dx, CV_64F, 1, 0, 3);

cv::Mat Dy;
cv::Sobel(src, Dy, CV_64F, 0, 1, 3);

答案 1 :(得分:4)

来自:http://en.wikipedia.org/wiki/Image_gradient,你可以这样做:

IplImage * diffsizekernel(IplImage *img, int f, int c) {
    float dkernel[] =  {-1, 0, 1};

    CvMat kernel = cvMat(f, c, CV_32FC1, dkernel);

    IplImage *imgDiff = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_16S, 1);

    cvFilter2D( img, imgDiff, &kernel, cvPoint(-1,-1) );

    return imgDiff;
}

IplImage * diffx(IplImage *img) {
    return diffsizekernel(img, 3, 1);
}

IplImage * diffy(IplImage *img) {
    return diffsizekernel(img, 1, 3);
}

答案 2 :(得分:1)

正如mevatron所说:Sobel和Laplace算子很强大,但是不要忘记Scharr算子,它在3×3内核上具有比Sobel更高的精度。