OpenCV Mat每元素操作:向量矩阵乘法

时间:2013-03-29 15:48:25

标签: opencv matrix matrix-multiplication mat

mxn 矩阵, I 的每个元素都是 1x3 向量( I 实际上是一个3通道Mat图像。

M 3x3 矩阵。

J 是一个与 I 具有相同尺寸的矩阵,计算方法如下: J 的每个元素都是矢量矩阵乘积 I M 的相应(即具有相同坐标)元素。

即。如果 v1(r1,g1,b1) I 的元素而 v2(r2,g2,b2)是其对应的元素< strong> J ,然后 v2 = v1 * M (这是一个矢量矩阵产品,不是每个元素的产品)。

问题:如何有效地计算 J (就速度而言)?

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

据我所知,实现此类操作的最有效方法如下:

  1. mxnx3 重新(m·n)x3 ,我们称之为
  2. 计算 J' = * M
  3. (m·n)x3 重新 J' mxnx3 ,这是我们想要的 J
  4. 我们的想法是将每个像素操作 p i '· M 堆叠成一个单独的操作 P'· M ,其中 P 是包含列中每个像素的 3x(m·n)矩阵(因此 P'< / strong>每行保留一个像素。这只是一个惯例,真的。)

    以下是用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模块来查看矩阵乘法。