【发布时间】:2018-07-06 06:03:47
【问题描述】:
我正在尝试将具有 RGB 颜色空间的图像转换为 LMS 模型。我从this paper 得到的变换矩阵值。我读了这个Question : RGB to LMS color space conversion with OpenCV,我们参考了同一篇论文,我已经按照答案中的所有说明进行操作。
为了确保我的代码运行良好,我将原始 RGB 转换为 LMS,然后使用第一个矩阵的逆矩阵将 LMS 转换回 RGB,并查看输出是否与原始图像匹配。
但输出与原始图像源不匹配。 这是我的代码: [更新]
void test(const Mat &original, Mat &pic, int rows, int cols)
{
for (int i = 0; i < original.rows; i++) {
for (int j = 0; j < original.cols; j++) {
//RGB into LMS
pic.at<Vec3b>(i, j)[0] = original.at<Vec3b>(i, j)[0] * 1.4671 +
original.at<Vec3b>(i, j)[1] * 0.1843 +
original.at<Vec3b>(i, j)[2] * 0.003; //B-->S
pic.at<Vec3b>(i, j)[1] = original.at<Vec3b>(i, j)[0] * 3.8671 +
original.at<Vec3b>(i, j)[1] * 27.1554 +
original.at<Vec3b>(i, j)[2] * 3.4557; //G-->M
pic.at<Vec3b>(i, j)[2] = original.at<Vec3b>(i, j)[0] * 4.1194 +
original.at<Vec3b>(i, j)[1] * 43.5161 +
original.at<Vec3b>(i, j)[2] * 17.8824; //R-->L
//LMS back into RGB
pic.at<Vec3b>(i, j)[0] = pic.at<Vec3b>(i, j)[0] * 0.6935 + pic.at<Vec3b>(i, j)[1] * -0.0041 + pic.at<Vec3b>(i, j)[2] * -0.0004; //S-->B
pic.at<Vec3b>(i, j)[1] = pic.at<Vec3b>(i, j)[0] * -0.1136 + pic.at<Vec3b>(i, j)[1] * 0.0540 + pic.at<Vec3b>(i, j)[2] * -0.0102; //M-->G
pic.at<Vec3b>(i, j)[2] = pic.at<Vec3b>(i, j)[0] * 0.1167 + pic.at<Vec3b>(i, j)[1] * -0.1305 + pic.at<Vec3b>(i, j)[2] * 0.0809; //L-->R
}
}
}
主要
int main(int argv, char** argc){
Mat original= imread("original.png", CV_LOAD_IMAGE_COLOR);
int rows = original.rows;
int cols = original.cols;
Mat pic(rows, cols, CV_8UC3);
test(original, pic, rows, cols);
imwrite("pic.png", pic);
}
有什么建议吗?任何帮助将不胜感激。
【问题讨论】:
-
在从 BGR 转换为 RGB 再转换为 LMS 并返回时,我不断收到红色图像。你遇到过这个问题吗?
-
嗨@LoganJahnke 我没有遇到同样的问题。另外,我没有在 LMS 之前先从 BGR 转换为 RGB。您可以通过切换LMS矩阵变换(LMS --> SML)将BGR直接转换为LMS。
-
好吧,我实际上使用了另一个网站上一个非常相似的问题的答案。答案建议使用方法
transform()。但是,我现在看到您使用reshape()的其他帖子。我可能得试试。
标签: c++ opencv image-processing rgb