2013-04-12 53 views
0

白平衡算法我想從維基 http://en.wikipedia.org/wiki/Color_balance實現從維基

實現一些白平衡算法它們只是一些簡單的矩陣操作 待辦事項的OpenCV提供任何功能做一些乘法 像一組像素以下?

例如,2×2,3路墊A =

0 0 0 1 1 1 
2 2 2 3 3 3 

3×3,1個通道墊B =

1 0 0 
0 2 0 
0 0 3 

甲X B = C和C =

0 0 0 1 2 3 
2 4 6 3 6 9 

我寫了一些泛型函數來處理像素變換 但我更喜歡在openCV的函數中構建,如果它存在因爲OPENCV的 功能可能會做一些優化

template<typename T, typename UnaryFunctor> 
void transform_channel(cv::Mat &src, int channel, UnaryFunctor functor) 
{ 
    int const channels = src.channels(); 
    if(channels == 1 && src.isContinuous()){ 
     return transform_continuous_channel<T>(src, functor); 
    } 

    for(int row = 0; row != src.rows; ++row) 
    { 
     auto dst_ptr = get_pointer<T>(src, row, channel); 
     for(int col = 0; col != src.cols; ++col){ 
      *dst_ptr = functor(*dst_ptr); 
      dst_ptr += channels; 
     } 
    } 
} 
+2

這是非常傳統的矩陣算術。 – Beta

+0

你是對的,這是一個非常規的矩陣算法,看起來像我應該自己優化算法,謝謝 – StereoMatching

回答

1

您會注意到色彩平衡操作僅由對角矩陣組成,這對應於標量的元素乘法。因此,您示例中的變換將爲:

image = image.mul(cv::Scalar(1,2,3)); 

3通道圖像。我不知道應用任意像素矩陣變換的函數。

+0

謝謝,這項工作,但它會更好,如果它直接改變圖像本身,而不是創建一個臨時對象 – StereoMatching

+0

您是否關注內存佔用或額外的副本? 「臨時對象」是一個「MatExpr」,它確保沒有數據被複制。 – Aurelius

1

矩陣乘法implementend在OpenCV中與*運營商。 如果您想使其工作,您應該使用cv::Mat::reshape()(文檔here)將您的RGB圖像重塑爲單通道矩陣。

提示:cv::Mat::reshape()返回對新矩陣的引用而不復制數據(不必要和緩慢)。因此,它通常是一個好主意,這樣使用它:

cv::Mat someMatrix; 
someMatrix = someMatrix.reshape(1); 

或者這種方式(使用另一矩陣變量):

cv::Mat rgbMatrix, myMatrix; 
myMatrix = rgbMatrix.reshape(1); 

我再次強調,這不會複製數據,所以你不會失去任何記憶。

+0

*需要滿足條件mxn * nxl,第一個矩陣的列和第二個矩陣的行必須具有相同的維度,但我想做像元素明智的乘法,就像.mul()一樣。謝謝 – StereoMatching

+0

元素明智的乘法是通過cv :: multiply(mat1,mat2)完成的。 – sansuiso