Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenCV 3.0将颜色矩阵应用于RGB图像的最快方法?_Opencv_Image Processing_Colors_Rgb_Opencv3.0 - Fatal编程技术网

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

使用OpenCV 3.0将颜色矩阵应用于RGB图像的最快方法?,opencv,image-processing,colors,rgb,opencv3.0,Opencv,Image Processing,Colors,Rgb,Opencv3.0,我有一个彩色图像,表示为OpenCV Mat对象(C++,图像类型CV_32FC3)。我有一个颜色校正矩阵,我想应用于RGB彩色图像的每个像素(或者使用OpenCV约定的BGR,在这里不重要)。颜色校正矩阵为3x3 我可以轻松地迭代像素,创建代表RGB的向量v(3x1),然后计算M*v,但这对于我的实时视频应用程序来说太慢了 cv::cvtColor函数速度很快,但似乎不允许自定义颜色转换。 类似于下面的,但是我使用OpenCV作为C++,而不是Python。 基本上,链接答案使用重塑将CV_

我有一个彩色图像,表示为OpenCV Mat对象(C++,图像类型CV_32FC3)。我有一个颜色校正矩阵,我想应用于RGB彩色图像的每个像素(或者使用OpenCV约定的BGR,在这里不重要)。颜色校正矩阵为3x3

我可以轻松地迭代像素,创建代表RGB的向量v(3x1),然后计算M*v,但这对于我的实时视频应用程序来说太慢了

cv::cvtColor函数速度很快,但似乎不允许自定义颜色转换。

类似于下面的,但是我使用OpenCV作为C++,而不是Python。


基本上,链接答案使用
重塑
CV_32FC3
大小
m x n
的垫子转换为
CV_32F
大小
(mn)x 3
的垫子。之后,矩阵的每一行正好包含一个像素的颜色通道。然后,您可以应用通常的矩阵乘法来获得一个新的垫子,并用三个通道将其重塑为原始形状


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

以下是使用cv::Reformate工作的代码。这对于我的申请来说已经足够快了:

#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时,我为OpenCV的BGR排序切换了第1行和第3行以及第1列和第3列。颜色矩阵也必须进行转置。通常,颜色矩阵应用为M*v=v_new,其中M为3x3,v为3x1,但这里我们使用vT*MT=v_newT来避免对每个3通道像素进行转置

只是好奇-你从哪里得到颜色校正矩阵?它是通过X-Rite颜色检查图表上的最小二乘解计算出来的-试图将佳能1DX相机原始图像带到sRGB。不应该
颜色矩阵线性化。重塑(3,高度)be<代码>颜色矩阵\线性。重塑(宽度、高度)