2013-03-29 122 views
2

MXN矩阵和的每个元素是一个1×3矢量(实际上是一个3通道垫图像)。OpenCV的垫每个元素的操作:向量矩阵乘法

M3x3矩阵。

Ĵ是具有相同尺寸的矩阵作为并计算如下:Ĵ的每个元素是I的对应的(即,具有相同的坐标)元素的向量,矩阵积M

I.e.如果V1(R1,G1,B1)元件V2(R2,G2,B2)Ĵ的其对应的元件,然后V2 = V1 * 中号 (这是一个矢量矩阵产品,而不是每个元素的产品)。

问题:如何高效计算J(速度)?

谢谢你的帮助。

+0

有什么想法吗? – Khue

回答

4

据我所知,执行这样的操作的最有效方法如下:

  1. 重塑mxnx3(M· N)×3,让我们叫它I '
  2. 计算J' = I” * 中号
  3. 整形J”(M· N)×3mxnx3,这是Ĵ我们想

的想法是堆叠每个逐像素操作p '· M合并为一个单一操作P'· 中号,其中P3×(M· n)的含成列的每个像素(。因此P”保持每行一个像素这只是一个约定,真的)矩阵。

这里是用C++编写一个代码示例:

// read some image 
cv::Mat I = cv::imread("image.png");    // rows x cols x 3 

// some matrix M, that modifies each pixel 
cv::Mat M = (cv::Mat_<float>(3, 3) << 0, 0, 0, 
             0, .5, 0, 
             0, 0, .5); // 3 x 3 

// remember old dimension 
uint8_t prevChannels = I.channels;     
uint32_t prevRows = I.rows;       

// reshape I 
uint32_t newRows = I.rows * I.cols;     
I = I.reshape(1, newRows);       // (rows * cols) x 3 

// compute J 
cv::Mat J = I * M;         // (rows * cols) x 3 

// reshape to original dimensions 
J = J.reshape(prevChannels, prevRows);    // rows x cols x 3 

OpenCV提供一个O(1)整形操作。 因此,性能仅取决于矩阵乘法,我希望这种乘法在计算机视觉库中尽可能高效。

为了进一步提高性能,您可能需要使用oclgpu模块查看矩阵乘法。