2011-12-14 21 views

Respuesta

14

Suponiendo que se refiere a la típica image gradient; puede calcular esto con bastante facilidad con el operador Sobel mencionado por Chris. Eche un vistazo al tutorial de Derivados de Sobel here. También podría estar interesado en el operador Laplace, y es tutorial.

Aquí es un breve fragmento de calcular los gradientes X e Y usando Sobel:

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); 
0

Como MEVATRON dijo: Sobel y los operadores de Laplace son poderosos, pero no se olvide de que el operador Scharr, que tiene una mayor precisión en un núcleo de 3 × 3 que Sobel tiene.

4

Desde: http://en.wikipedia.org/wiki/Image_gradient, que puede hacer:

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); 
} 
Cuestiones relacionadas