2011-12-14 47 views
5

Sử dụng OpenCV mới nhất, có cách nào dễ dàng để tính toán hình ảnh gradient của một cv cụ thể :: Mat?Có cách nào nhanh chóng và dễ dàng trong OpenCV để tính toán độ dốc của hình ảnh không?

+0

Một hình ảnh mẫu, và kết quả mong đợi sẽ được tốt đẹp. – Sonaten

+0

Bạn đang tìm kiếm toán tử Sobel, tính toán các dẫn xuất? [Tài liệu tại đây] (http://opencv.itseez.com/modules/imgproc/doc/filtering.html#sobel). – Chris

Trả lời

14

Giả sử bạn đang tham chiếu đến image gradient điển hình; bạn có thể tính toán chúng khá dễ dàng với nhà điều hành Sobel như đã đề cập bởi Chris. Hãy xem hướng dẫn Sobel Derivatives here. Bạn cũng có thể quan tâm đến nhà điều hành Laplace và số tutorial.

Dưới đây là một đoạn ngắn của tính toán gradient X và Y bằng 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

Như mevatron nói: các Sobel và các nhà khai thác Laplace là mạnh mẽ, nhưng đừng quên về các nhà điều hành SCHARR, mà có độ chính xác cao hơn với hạt nhân 3 × 3 so với Sobel.

4

Từ: http://en.wikipedia.org/wiki/Image_gradient, bạn có thể làm:

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); 
} 
Các vấn đề liên quan