使用最新的OpenCV,有一种简单的方法来计算特定cv :: Mat的渐变图像吗?
答案 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更高的精度。