据我所知,执行这样的操作的最有效方法如下:
- 重塑我从mxnx3到(M· N)×3,让我们叫它I '
- 计算J' = I” * 中号
- 整形J”从(M· N)×3到mxnx3,这是Ĵ我们想
的想法是堆叠每个逐像素操作p 我 '· M合并为一个单一操作P'· 中号,其中P是3×(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模块查看矩阵乘法。
有什么想法吗? – Khue