使用OpenCV 3.0将色彩矩阵应用于RGB图像的最快方法?

时间:2016-02-03 02:17:16

标签: opencv image-processing colors rgb opencv3.0

我有一个彩色图像,表示为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 个答案:

答案 0 :(得分:6)

这是使用cv :: reshape工作的代码。它对我的申请来说足够快:

#define WIDTH 2048
#define HEIGHT 2048
...

Mat orig_img = Mat(HEIGHT, WIDTH, CV_32FC3);
//put some data in orig_img somehow ...

/*The color matrix
Red:RGB; Green:RGB; Blue:RGB
1.8786   -0.8786    0.0061
-0.2277    1.5779   -0.3313
0.0393   -0.6964    1.6321
*/

float m[3][3] = {{1.6321, -0.6964, 0.0393},
                {-0.3313, 1.5779, -0.2277}, 
                {0.0061, -0.8786, 1.8786 }};
Mat M = Mat(3, 3, CV_32FC1, m).t();

Mat orig_img_linear = orig_img.reshape(1, HEIGHT*WIDTH);
Mat color_matrixed_linear = orig_img_linear*M;
Mat final_color_matrixed = color_matrixed_linear.reshape(3, HEIGHT);

上面要注意的一些事项:注释块中的颜色矩阵是我通常应用于RGB图像的颜色矩阵。在定义浮点数组m时,我切换了第1行和第3行,第1列和第3列用于OpenCV的BGR排序。颜色矩阵也必须转置。通常颜色矩阵应用为M * v = v_new,其中M是3x3而v是3x1但是这里我们正在做v T * M T = v_new T 以避免必须转置每个3通道像素。

答案 1 :(得分:4)

基本上,关联的答案使用m x n将您的CV_32F尺寸为(mn) x 3的垫子转换为尺寸为reshape的{​​{1}}垫子。之后,矩阵的每一行都包含一个像素的颜色通道。然后,您可以应用通常的矩阵乘法来获得新的垫子并将其<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="XXdp" android:onClick="onClick" android:drawableTop="@drawable/yourimage android:text="Button" /> 恢复为具有三个通道的原始形状。

注意:值得注意的是opencv的默认颜色空间是BGR,而不是RGB。