2011-12-14 11 views
5

En yeni OpenCV'yi kullanarak, belirli bir cv :: Mat'nin degrade görüntüsünü hesaplamanın kolay bir yolu var mı?Bir görüntünün gradyanını hesaplamak için OpenCV'de hızlı ve kolay bir yol var mı?

+0

Bir numune görüntüsünü ve beklenen sonuçlar güzel olurdu: http://en.wikipedia.org/wiki/Image_gradient, sen yapabilirsiniz. – Sonaten

+0

Türevleri hesaplayan Sobel operatörünü mi arıyorsunuz? [Belgeler burada] (http://opencv.itseez.com/modules/imgproc/doc/filtering.html#sobel). – Chris

cevap

14

Tipik image gradient; Bunları Chris tarafından belirtildiği gibi Sobel operatörüyle kolayca hesaplayabilirsiniz. Sobel Türevleri öğretici here bir göz atın. Ayrıca, Laplace işleci ve tutorial ile de ilgilenebilirsiniz.

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

mevatron söylediği gibi: İşte

sobel kullanarak X ve Y geçişlerini hesaplama kısa snippet'tir Sobel ve Laplace operatörleri güçlü, ama Scharr operatörü, unutma ki Sobel'in sahip olduğu 3 × 3 çekirdeğinde daha fazla doğruluk var. Gönderen

4

:

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); 
} 
İlgili konular