我有一个彩色图像表示为OpenCV Mat对象(C,图像类型CV_32FC3) . 我有一个颜色校正矩阵,我想应用于RGB彩色图像的每个像素(或使用OpenCV约定的BGR,这里无关紧要) . 色彩校正矩阵为3x3 .
我可以轻松迭代像素并创建表示RGB的矢量v(3x1),然后计算M * v,但这对于我的实时视频应用来说太慢了 .
cv :: cvtColor函数很快,但似乎不允许自定义颜色转换 . http://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor
与以下类似,但我使用的是OpenCV for C,而不是Python . Apply transformation matrix to pixels in OpenCV image
2 回答
基本上,链接的答案使用
reshape
将CV_32FC3
尺寸为m x n
的垫子转换为CV_32F
尺寸为(mn) x 3
的垫子 . 之后,矩阵的每一行都包含一个像素的颜色通道 . 然后,您可以应用通常的矩阵乘法来获得新的垫子,然后使用三个通道将其重新恢复为原始形状 .注意:值得注意的是opencv的默认颜色空间是BGR,而不是RGB .
这是使用cv :: reshape工作的代码 . 它对我的应用来说足够快:
从上面要注意的一些事项:注释块中的颜色矩阵是我通常应用于RGB图像的颜色矩阵 . 在定义浮点数组m时,我切换了第1行和第3行,第1列和第3列用于OpenCV的BGR排序 . 颜色矩阵也必须转置 . 通常将颜色矩阵应用为M * v = v_new,其中M是3x3并且v是3x1但是这里我们正在进行vT * MT = v_newT以避免必须转置每个3通道像素 .