Я заметил, что при матрицах понижающей дискретизации в 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
Это кажется разумным. Я думаю, это сводится к генератору случайных чисел, используемому в Matlab vs. openCV, потому что в Matlab он никогда не становился отрицательным, тогда как в openCV он всегда вызывал отрицательные значения. Согласны ли вы с этим допущением (RNG)? –
@CV_User также существует разница в ядре, используемом OpenCv и Matlab. – Shai
Если ядро было неотрицательным в Matlab и не было неотрицательным в openCV, это было бы обоснованным объяснением. Однако, похоже, в обоих случаях это не является неотрицательным, но в Matlab I не получаются отрицательные результаты, тогда как в openCV я делаю. Это может быть не по теме, но я попытался отредактировать коэффициент в imgwarp.cpp и сохранить его, но я думаю, что это требует больше, чем просто сохранения. Как можно перестроить openCV, чтобы это редактирование палочки? Спасибо, Шай! –