преобразование кода свертки matlab в opencv в cpp

Вот мои результаты горизонтального градиента. Левый - результат opencv, а другой - результат Matlab.

Я пытаюсь сделать горизонтальный и вертикальный градиент, который H = [1,-1] и V=[1;-1]

    Mat H_gradient,G_Filter1,kernel,V_gradient;

    Mat kernelH(1, 2, CV_32F);  
    kernelH.at<float>(0,0) = 1.0f;
    kernelH.at<float>(0,1) = -1.0f;


    Mat kernelV(2, 1, CV_32F);
    kernelV.at<float>(0,0) = 1.0f;
    kernelV.at<float>(1,0) = -1.0f;

    cvtColor( image, image, CV_RGB2GRAY );

    filter2D( image, H_gradient, -1 ,kernelH , Point( -1, -1 ), 0, BORDER_DEFAULT ); 
    filter2D( image, V_gradient, -1 ,kernelV , Point( -1, -1 ), 0, BORDER_DEFAULT );

Но все еще не соответствует моим результатам кода Matlab. Я не знаю, почему?

Мой код Matlab для градиентов

image=double(image);
% horizontal and vertical gradient
H=[1 -1];
V=[1;-1];

H_Gradient=conv2(image,H,'same'); 
V_Gradient=conv2(image,V,'same');

person MerveMeriç    schedule 04.07.2014    source источник
comment
Можете ли вы показать нам разницу на примере изображения?   -  person ypnos    schedule 05.07.2014
comment
Я добавляю изображение слева, результат opencv @ypnos   -  person MerveMeriç    schedule 07.07.2014


Ответы (2)


попробуй сделать

cvtColor( image, image, **CV_BGR2GRAY** );

вместо

cvtColor( image, image, **CV_RGB2GRAY** );

Если вы используете параметры imread по умолчанию, OpenCv по умолчанию использует цветовой формат BGR вместо RGB!

person André    schedule 06.07.2014
comment
Я изменил на * CV_BGR2GRAY, но все же мой результат opencv и matlab не совпадает - person MerveMeriç; 07.07.2014

Сделайте то же самое, что и в Matlab, сначала преобразуйте изображение в двойное.

image.convertTo(image, CV_32F);

Теперь я получил тот же результат в OpenCv и Matlab.

person André    schedule 07.07.2014
comment
Я изменил ядро ​​с H=[1 -1] на H=[-1 1], и теперь оно работает, теперь не знаю, почему. спасибо за советы @André - person MerveMeriç; 07.07.2014