gpt4 book ai didi

OpenCV Mat 逐元素操作 : vector-matrix multiplication

转载 作者:太空宇宙 更新时间:2023-11-03 21:22:40 24 4
gpt4 key购买 nike

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

M 是一个3x3 矩阵。

J 是一个与I 具有相同维数的矩阵,计算如下:J 的每个元素都是向量-矩阵乘积IM 的相应(即具有相同坐标)元素。

即如果 v1(r1,g1,b1)I 的一个元素,而 v2(r2,g2,b2)I 的对应元素strong>J,然后 v2 = v1 * M(这是向量矩阵乘积,不是逐元素乘积).

问题:如何高效地计算J(在速度方面)?

感谢您的帮助。

最佳答案

据我所知,实现这种操作最高效的方法如下:

  1. Imxnx3 reshape 为 (m·n)x3,我们称它为 I'<
  2. 计算 J' = I' * M
  3. J'(m·n)x3整形为mxnx3,这就是我们想要的J

想法是将每个像素级操作pi'·M堆叠成一个操作P'·M,其中 P 是包含列中每个像素的 3x(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) 整形操作。因此性能完全取决于矩阵乘法,我希望它在计算机视觉库中尽可能高效。

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

关于OpenCV Mat 逐元素操作 : vector-matrix multiplication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15706607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com