2015-05-10 47 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,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 

回答

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中使用的隨機數生成器與openCV的比較 - 因爲在Matlab中它從來沒有變爲負值,而在openCV中它總是產生負值。你是否同意這個假設(RNG)? –

+1

@CV_User OpenCv和Matlab使用的內核也有所不同。 – Shai

+0

如果內核在Matlab中是非負的,並且在openCV中不是非負的,這將是一個有效的解釋。然而,在這兩種情況下,似乎它不是非負的,但在Matlab中,我沒有得到負面結果,而在openCV中,我做到了。這可能是無關緊要的,但我嘗試編輯imgwarp.cpp中的係數並保存它,但我想它不僅僅需要保存。一個人如何重建openCV所以這個編輯棒?謝謝Shai! –