我是 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 (就速度而言)?
感谢您的帮助。
答案 0 :(得分: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)重塑操作。 因此,性能完全取决于矩阵乘法,我期望在计算机视觉库中尽可能高效。