2011-12-14 9 views

risposta

14

Supponendo che si stia facendo riferimento al tipico image gradient; puoi calcolarli abbastanza facilmente con l'operatore Sobel come menzionato da Chris. Dai un'occhiata al tutorial di Sobel Derivatives here. Potresti anche essere interessato all'operatore Laplace e al suo tutorial.

Ecco un breve frammento di calcolare i gradienti X e Y con 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

Come mevatron detto: il Sobel e gli operatori di Laplace sono potenti, ma non dimenticare l'operatore Scharr, che ha una maggiore precisione in un kernel 3 × 3 rispetto a Sobel.

4

Da: http://en.wikipedia.org/wiki/Image_gradient, si può fare:

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); 
} 
Problemi correlati