3

我有相同的物体,由同一台相机在两种不同的照明条件下拍摄。

假设我采用红色分量 A 的饱和度,它在第二张图片中变为 A'。

如果我知道白色字母的饱和度是 B,我怎样才能得到一个好的估计 B'?它们似乎具有依赖关系,并且直观地说它们实际上可能具有简单的数学依赖关系,但我可能错了。

简单地说:当原始图像的红色和灰色字母饱和度以及第二张图像的红色饱和度时,找到第二张图片中灰色字母的预期饱和度。A、A'、B 从 0 到 1。

我可以为三个 HSV 通道分离这个方程吗?或者我应该做什么样的转变?

我当前的代码正在围绕一个枢轴点(默认情况下为 1)进行规范化,我发现当 B 接近零时它会失败:

float delta1 = (A - pivotpoint);
float delta1new = Aprime - pivotpoint;
float ratio = delta1new / delta1;
float delta2 = B - pivotpoint;
float delta2new = abs(ratio * delta2);
float Bprime = pivotpoint - delta2new;

在此处输入图像描述

4

2 回答 2

1

我不确定我是否理解您想要做什么。但是,如果我没记错的话,我认为您应该尝试在 HSV 中而不是在 HSL 中拆分您的频道并使用 Luminance。

    #include "opencv2/opencv.hpp"


    int main(int ac, char **av){

      cv::Mat src = cv::imread("./files/lena.jpg", -1);
      简历::垫 hls;
        // 创建一个具有 3 个通道和色调的 hsv 图像,用 1 个通道设置 e val。所有尺寸都相同
      std::vector hlsChannels;

        // 从红-绿-蓝转换为色相-饱和度-亮度
      cv::cvtColor(src, hls, CV_RGB2HLS);
      cv::split(hls, hlsChannels);

      cv::Mat hue = hlsChannels.at(0);
      cv::Mat lum = hlsChannels.at(1);
      cv::Mat sat = hlsChannels.at(2);
      for (int y = 0; y (y, x) += 20;
        }
      }
      hlsChannels.clear();
      hlsChannels.push_back(hue);
      hlsChannels.push_back(lum);
      hlsChannels.push_back(sat);
      cv::Mat HLSColors;
      cv::Mat RGBColors;
      cv::merge(hlsChannels, HLSColors);
      cv::cvtColor(HLSColors, RGBColors, CV_HLS2RGB);
      cv::imwrite("lumLena.png", RGBColors);
      返回0;
    }

此外,看看直方图均衡,它可能是您工作的第一步。

http://docs.opencv.org/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.html#histogram-equalization

希望它有所帮助!

于 2013-05-10T14:03:22.940 回答
0

您应该首先考虑如何建模您正在寻找的关系。为此,我会尽可能手动将图像对应起来,并查看您感兴趣的信息的散点图。即使用像素的饱和度(或其他值,见下文)作为坐标绘制 2D 点. 这应该让您对合适的模型有所了解。

根据我在曝光匹配方面的经验,我认为线性模型A' = m*A + x比简单的加法或乘法模型(A' = A + xA' = m*A)效果更好。但是,要求解线性模型,您至少需要两个对应的值。更好地使用更多并以最小二乘的方式解决。您还可以考虑使用多项式 - 您会在散点图中看到最适合的情况。

我还会考虑将校正分别应用于 R、G 和 B 通道,而不是使用 HSV。RGB 在数学上更容易处理,并且通常也会产生良好的结果。在 HSV 中,您本质上是在柱坐标系中操作,而 RGB 是一个简单的向量空间。

于 2013-05-12T20:43:38.833 回答