gpt4 book ai didi

c++ - 使用颜色校正矩阵在 Opencv 中进行颜色校正

转载 作者:太空宇宙 更新时间:2023-11-03 22:22:12 33 4
gpt4 key购买 nike

我有 4 个树莓派相机,它们从不同位置拍摄同一场景的照片。我想让它们在颜色方面尽可能相似。我尝试了一些直方图均衡化,但没有取得太大成功。在互联网上搜索,颜色校正矩阵 (CCM) 出现了很多,所以我想在 Opencv、C++ 中尝试一下。我知道有一整套关于颜色校正和颜色校准的理论,但是我只想尝试 CCM 并在 Opencv 中查看它的结果,而不仅仅是 Matlab 或其他软件。

我拍摄了 2 张 MacBeth 颜色图表的照片并手动获取样本颜色。 (我知道我可以自动执行此操作,但在执行此操作之前,我想确保值得付出努力)。

这是我的代码:

//input images
CameraInfo c1, c2;
cv::Mat inputImgCam1 = cv::imread("color_c1.jpeg");
cv::Mat inputImgCam2 = cv::imread("color_c3.jpeg");

//convert them to float for multiplication
cv::Mat3f cam1F, cam2F;
inputImgCam1.convertTo(cam1F, CV_32FC3, 1 / 255.0);
inputImgCam2.convertTo(cam2F, CV_32FC3, 1 / 255.0);

//take manually the source and target colours
c1.Initialize(inputImgCam1, cv::Size(14, 8), false);
c2.Initialize(inputImgCam2, cv::Size(14, 8), false);

std::vector<cv::Vec3b> colors1 = c1.GetColors();
std::vector<cv::Vec3b> colors2 = c2.GetColors();

//convert them to Mat - 3 ch, 1 col, 4 rows
cv::Mat source(colors1);// = Convert(colors1);
cv::Mat target(colors2);// = Convert(colors2);

//reshape them - 1 ch, 3 cols, 4 rows
cv::Mat src = source.reshape(1, source.size().height);
cv::Mat trg = target.reshape(1, target.size().height);

//convert them to float
cv::Mat srcFloat, trgFloat;
src.convertTo(srcFloat, CV_32FC1, 1 / 255.0);
trg.convertTo(trgFloat, CV_32FC1, 1 / 255.0);

std::cout << srcFloat.size() << " " << srcFloat.t().size() << " " << trgFloat.size() << " " << trgFloat.t().size();

//compute the colour correction matrix: A*M = B => M = (A' * A).inv() * A' * B
cv::Mat ccm = (trgFloat.t() * trgFloat).inv() * trgFloat.t() * srcFloat;

//reshape the source image to 1 ch, width * height cols, 3 rows
cv::Mat cam1Reshaped = cam1F.reshape(1, 3);

//perform correction
cv::Mat result = cam1Reshaped.t() * ccm;

//reshape back, 3 ch, width cols, height rows
cv::Mat resultR = result.reshape(3, inputImgCam1.size().height);

//convert to uchar for saving
cv::Mat out;
resultR.convertTo(out, CV_8UC3, 255);

cv::imwrite("ccm_c1.jpg", out);

这里是 MacBeth 颜色图表的图像:source image ; target image ; result

我的 CCM 看起来像这样:ccm values

显然出了点问题!结果图像看起来与输入图像完全不同。我的灵感来自 here ,但是 opencv 在矩阵乘法方面让事情变得更加困难(图像必须是 float ,顺序是 cols x rows,而不是 rows x cols..)。我想至少得到上面链接中的结果。至少输入和输出显示相同的东西。

我希望你能帮助我。我还没有找到太多支持使用 opencv ..谢谢!

最佳答案

我重现了上面的结果(粉红色背景),发现一行错误并报告在这里(我不允许评论)以便其他人可以节省一些时间。

改变之后

cv::Mat ccm = trgFloat.t() * srcFloat * (trgFloat.t() * trgFloat).inv();

cv::Mat ccm = (srcFloat.t() * srcFloat).inv()* srcFloat.t() * trgFloat;

我得到了完美的结果图像。

关于c++ - 使用颜色校正矩阵在 Opencv 中进行颜色校正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47939482/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com