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,1]範圍內的-0.24,如上面的代碼中所示。
作爲比較,在Matlab這不會發生(我知道加權計劃略有差異,如下所示:imresize comparison - Matlab/openCV)。
這裏是一個簡短的Matlab代碼片段,保存在任何的1000點隨機小型化矩陣(eahc矩陣1000×1000的原始尺寸)的最小值:
currentMinVal = 1e6;
for k=1:1000
x = rand(1000);
x = imresize(x,0.5);
minVal = min(currentMinVal,min(x(:)));
end
這似乎是合理的。我想可以歸結爲Matlab中使用的隨機數生成器與openCV的比較 - 因爲在Matlab中它從來沒有變爲負值,而在openCV中它總是產生負值。你是否同意這個假設(RNG)? –
@CV_User OpenCv和Matlab使用的內核也有所不同。 – Shai
如果內核在Matlab中是非負的,並且在openCV中不是非負的,這將是一個有效的解釋。然而,在這兩種情況下,似乎它不是非負的,但在Matlab中,我沒有得到負面結果,而在openCV中,我做到了。這可能是無關緊要的,但我嘗試編輯imgwarp.cpp中的係數並保存它,但我想它不僅僅需要保存。一個人如何重建openCV所以這個編輯棒?謝謝Shai! –