我是OpenCV的新手,并尝试使用C++将以下MATLAB代码转换为OpenCV:

    [FX,FY]=gradient(mycell{index});

到目前为止,我已经尝试了以下方法,但是我的值与MATLAB结果完全不同
    Mat abs_FXR;
    Mat abs_FYR;
    int scale = 1;
    int delta = 0;

    // Gradient X
    Sobel(myImg, FXR, CV_64F, 1, 0, 3, scale, delta, BORDER_DEFAULT);
    convertScaleAbs( FXR, abs_FXR );
    imshow( window_name2, abs_FXR );

    // Gradient Y
    Sobel(myImg, FYR, CV_64F, 0, 1, 3, scale, delta, BORDER_DEFAULT);
    convertScaleAbs( FYR, abs_FYR );
    imshow( window_name3, abs_FYR );

我也尝试根据此问题使用filter2D,但它仍然给出不同的结果:Matlab gradient equivalent in opencv
Mat kernelx = (Mat_<float>(1,3)<<-0.5, 0, 0.5);
Mat kernely = (Mat_<float>(3,1)<<-0.5, 0, 0.5);
filter2D(myImg, FXR, -1, kernelx);
filter2D(myImg, FYR, -1, kernely);
imshow( window_name2, FXR );
imshow( window_name3, FYR );

我不知道这是否偏离了轨道,还是只是我需要更改的参数。任何帮助,将不胜感激。

更新
这是我从MATLAB得到的预期输出:

但是这是我从使用Sobel的OpenCV获得的东西:

这是我使用Filter2D方法从OpenCV中获得的输出(我尝试增加高斯滤波器的大小,但与MATLAB相比仍然得到不同的结果)

我还使用以下方法将图像转换为 double :
eye_rtp.convertTo(eye_rt,CV_64F);

最佳答案

正确的是,您需要进行集中差异计算,而不是使用Sobel过滤器(尽管Sobel确实提供了一个很好的导数)才能匹配gradient。顺便说一句,如果您有图像处理工具箱,则imgradientimgradientxy可以选择使用Sobel计算梯度。 (请注意the answer in the question you referenced是错误的,因为存在一阶和二阶Sobel运算符,所以Sobel仅提供二阶导数)。

关于您看到的差异,您可能需要将myImg转换为float或double,再转换为filter2D。检查FXL的输出类型,等等。

同样, double 是CV_64F,单精度是CV_32F,尽管在这种情况下这可能只会造成很小的差异。

关于c++ - 将MATLAB代码转换为OpenCV C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22943336/

10-11 22:46
查看更多