使用 reshape 乘以 Mat 矩阵,OpenCV 中的 Mat 类型问题
Multiplying Mat matrices using reshape, Mat type issue in OpenCV
我正在尝试实现从 RGB-LMS 和 LMS-RGB 返回的颜色转换,并使用 reshape 乘法矩阵,遵循这个问题的答案:
我的 ori Mat 对象来自具有 3 通道 (RGB) 的图像,我需要将它们与 1 通道矩阵 (lms) 相乘,看来我的矩阵类型有问题。我已阅读 reshape docs and questions related to this issue, like Issues multiplying Mat matrices,我相信我已按照说明进行操作。
这是我的代码:[更新:转换为平面图像]
void test(const Mat &forreshape, Mat &output, Mat &pic, int rows, int cols)
{
Mat lms(3, 3, CV_32FC3);
Mat rgb(3, 3, CV_32FC3);
Mat intolms(rows, cols, CV_32F);
lms = (Mat_<float>(3, 3) << 1.4671, 0.1843, 0.0030,
3.8671, 27.1554, 3.4557,
4.1194, 45.5161 , 17.884 );
/* switch the order of the matrix according to the BGR order of color on OpenCV */
Mat transpose = (3, 3, CV_32F, lms).t(); // this will do transpose from matrix lms
pic = forreshape.reshape(1, rows*cols);
Mat flatFloatImage;
pic.convertTo(flatFloatImage, CV_32F);
rgb = flatFloatImag*transpose;
output = rgb.reshape(3, cols);
}
我定义了我的 Mat 对象,并使用 convertTo
将其转换为浮点数
Mat ori = imread("ori.png", CV_LOAD_IMAGE_COLOR);
int rows = ori.rows;
int cols = ori.cols;
Mat forreshape;
ori.convertTo(forreshape, CV_32F);
Mat pic(rows, cols, CV_32FC3);
Mat output(rows, cols, CV_32FC3);
错误是:
OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)) ,
所以是类型问题。
我尝试将所有类型更改为 32FC3 或 32FC1,但似乎不起作用。有什么建议吗?
我相信您需要的是将输入转换为平面图像,然后将它们相乘
float lms [] = {1.4671, 0.1843, 0.0030,
3.8671, 27.1554, 3.4557,
4.1194, 45.5161 , 17.884};
Mat lmsMat(3, 3, CV_32F, lms );
Mat flatImage = ori.reshape(1, ori.rows * ori.cols);
Mat flatFloatImage;
flatImage.convertTo(flatFloatImage, CV_32F);
Mat mixedImage = flatFloatImage * lmsMat;
Mat output = mixedImage.reshape(3, imData.rows);
我可能在那里弄乱了 lms 矩阵,但我想你会从这里赶上来的。
另见 3D matrix multiplication in opencv for RGB color mixing
编辑:
失真问题是在浮动到 8U 转换后出现溢出。这可以解决问题:
rgb = flatFloatImage*transpose;
rgb.convertTo(pic, CV_32S);
output = pic.reshape(3, rows)
输出:
;
我也不确定,但快速 google 搜索为我提供了 LMS see here 的不同矩阵。另请注意,opencv 以 B-G-R 格式而不是 RGB 格式存储颜色,因此请记录更改您的混合 mtraixes。
我正在尝试实现从 RGB-LMS 和 LMS-RGB 返回的颜色转换,并使用 reshape 乘法矩阵,遵循这个问题的答案:
我的 ori Mat 对象来自具有 3 通道 (RGB) 的图像,我需要将它们与 1 通道矩阵 (lms) 相乘,看来我的矩阵类型有问题。我已阅读 reshape docs and questions related to this issue, like Issues multiplying Mat matrices,我相信我已按照说明进行操作。
这是我的代码:[更新:转换为平面图像]
void test(const Mat &forreshape, Mat &output, Mat &pic, int rows, int cols)
{
Mat lms(3, 3, CV_32FC3);
Mat rgb(3, 3, CV_32FC3);
Mat intolms(rows, cols, CV_32F);
lms = (Mat_<float>(3, 3) << 1.4671, 0.1843, 0.0030,
3.8671, 27.1554, 3.4557,
4.1194, 45.5161 , 17.884 );
/* switch the order of the matrix according to the BGR order of color on OpenCV */
Mat transpose = (3, 3, CV_32F, lms).t(); // this will do transpose from matrix lms
pic = forreshape.reshape(1, rows*cols);
Mat flatFloatImage;
pic.convertTo(flatFloatImage, CV_32F);
rgb = flatFloatImag*transpose;
output = rgb.reshape(3, cols);
}
我定义了我的 Mat 对象,并使用 convertTo
将其转换为浮点数Mat ori = imread("ori.png", CV_LOAD_IMAGE_COLOR);
int rows = ori.rows;
int cols = ori.cols;
Mat forreshape;
ori.convertTo(forreshape, CV_32F);
Mat pic(rows, cols, CV_32FC3);
Mat output(rows, cols, CV_32FC3);
错误是:
OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)) ,
所以是类型问题。
我尝试将所有类型更改为 32FC3 或 32FC1,但似乎不起作用。有什么建议吗?
我相信您需要的是将输入转换为平面图像,然后将它们相乘
float lms [] = {1.4671, 0.1843, 0.0030,
3.8671, 27.1554, 3.4557,
4.1194, 45.5161 , 17.884};
Mat lmsMat(3, 3, CV_32F, lms );
Mat flatImage = ori.reshape(1, ori.rows * ori.cols);
Mat flatFloatImage;
flatImage.convertTo(flatFloatImage, CV_32F);
Mat mixedImage = flatFloatImage * lmsMat;
Mat output = mixedImage.reshape(3, imData.rows);
我可能在那里弄乱了 lms 矩阵,但我想你会从这里赶上来的。
另见 3D matrix multiplication in opencv for RGB color mixing
编辑: 失真问题是在浮动到 8U 转换后出现溢出。这可以解决问题:
rgb = flatFloatImage*transpose;
rgb.convertTo(pic, CV_32S);
output = pic.reshape(3, rows)
输出:
我也不确定,但快速 google 搜索为我提供了 LMS see here 的不同矩阵。另请注意,opencv 以 B-G-R 格式而不是 RGB 格式存储颜色,因此请记录更改您的混合 mtraixes。