2015-05-10 10 views
4

Я заметил, что при матрицах понижающей дискретизации в openCV с использованием бикубической интерполяции я получаю отрицательные значения, хотя исходная матрица была положительной.openCV bicubic imresize создает отрицательные значения

прилагает следующий код в качестве примера:

// Declaration of variables 
cv::Mat M, MLinear, MCubic; 
double minVal, maxVal; 
cv::Point minLoc, maxLoc; 
// Create random values in M matrix 
M = cv::Mat::ones(1000, 1000, CV_64F); 
cv::randu(M, cv::Scalar(0), cv::Scalar(1)); 
minMaxLoc(M, &minVal, &maxVal, &minLoc, &maxLoc); 
// Printout smallest value in M 
std::cout << "smallest value in M = "<< minVal << std::endl; 

// Resize M to quarter area with bicubic interpolation and store in MCubic 
cv::resize(M, MCubic, cv::Size(0, 0), 0.5, 0.5, cv::INTER_CUBIC); 
// Printout smallest value in MCubic 
minMaxLoc(MCubic, &minVal, &maxVal, &minLoc, &maxLoc); 
std::cout << "smallest value in MCubic = " << minVal << std::endl; 

// Resize M to quarter area with linear interpolation and store in MLinear 
cv::resize(M, MLinear, cv::Size(0, 0), 0.5, 0.5, cv::INTER_LINEAR); 
// Printout smallest value in MLinear 
minMaxLoc(MLinear, &minVal, &maxVal, &minLoc, &maxLoc); 
std::cout << "smallest value in MLinear = " << minVal << std::endl; 

Я не понимаю, почему это происходит. Я заметил, что если я выбираю случайные значения между [0,100], наименьшее значение после изменения размера обычно составляет ~ -24 против -0,24 для диапазона [0,1], как в приведенном выше коде.

Для сравнения, в Matlab этого не происходит (я знаю небольшую разницу в схемах взвешивания, как показано здесь: imresize comparison - Matlab/openCV).

Вот краткий Matlab фрагмент кода, который сохраняет наименьшее значение в любом из 1000 случайных сокращенных матриц (исходные размеры EAHC матрицы 1000x1000):

currentMinVal = 1e6; 
for k=1:1000   
    x = rand(1000); 
    x = imresize(x,0.5); 
    minVal = min(currentMinVal,min(x(:))); 
end 

ответ

3

Как вы можете видеть на this answer бикубического ядра не не Следовательно, в некоторых случаях отрицательные коэффициенты могут доминировать и давать отрицательные результаты.

Следует также отметить, что Matlab используется 'Antialiasing' по умолчанию, который оказывает влияние на результат:

I = zeros(9);I(5,5)=1; 
imresize(I,[5 5],'bicubic') %// with antialiasing 
ans = 
    0   0   0   0   0 
    0 0.0000 -0.0000 -0.0000   0 
    0 -0.0000 0.3055 0.0000   0 
    0 -0.0000 0.0000 0.0000   0 
    0   0   0   0   0 

imresize(I,[5 5],'bicubic','Antialiasing',false) %// without antialiasing 
ans = 
    0   0   0   0   0 
    0 0.0003 -0.0160 0.0003   0 
    0 -0.0160 1.0000 -0.0160   0 
    0 0.0003 -0.0160 0.0003   0 
    0   0   0   0   0 
+0

Это кажется разумным. Я думаю, это сводится к генератору случайных чисел, используемому в Matlab vs. openCV, потому что в Matlab он никогда не становился отрицательным, тогда как в openCV он всегда вызывал отрицательные значения. Согласны ли вы с этим допущением (RNG)? –

+1

@CV_User также существует разница в ядре, используемом OpenCv и Matlab. – Shai

+0

Если ядро ​​было неотрицательным в Matlab и не было неотрицательным в openCV, это было бы обоснованным объяснением. Однако, похоже, в обоих случаях это не является неотрицательным, но в Matlab I не получаются отрицательные результаты, тогда как в openCV я делаю. Это может быть не по теме, но я попытался отредактировать коэффициент в imgwarp.cpp и сохранить его, но я думаю, что это требует больше, чем просто сохранения. Как можно перестроить openCV, чтобы это редактирование палочки? Спасибо, Шай! –