我有相同的物体,在同一相机的两种不同光照条件下拍摄。
假设我将红色成分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;
答案 0 :(得分:1)
我不确定我是否明白你想做什么。 但是如果我没有弄错的话,我认为你应该尝试将你的频道分成HSV,而不是HSL,然后使用Luminance。
#include "opencv2/opencv.hpp" int main(int ac, char **av){ cv::Mat src = cv::imread("./files/lena.jpg", -1); cv::Mat hls; // Create a hsv image with 3 channels and hue, sat e val with 1 channel. All with the same size std::vector hlsChannels; // Convert from Red-Green-Blue to Hue-Saturation-Luminance 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); return 0; }
此外,看看直方图均衡,它可能是你工作的第一步。
希望它有所帮助!
答案 1 :(得分:0)
您首先应该考虑如何建模您正在寻求的关系。要做到这一点,我会尽可能手动地将图像对应,并查看您感兴趣的信息的散点图。使用像素的饱和度(或其他值,见下文)作为坐标绘制2D点。这应该可以让您了解合适的模型。
根据我对曝光匹配的经验,我认为线性模型A' = m*A + x
比简单的加法或乘法(A' = A + x
或A' = m*A
)效果更好。但是,要求求线性模型,您至少需要两个相应的值。更好地使用更多并以最小方块的意义解决。您还可以考虑使用多项式 - 您将在散点图中看到最佳拟合。
我还会考虑将修正分别应用于R,G和B通道,而不是使用HSV。 RGB在数学上更容易处理,并且通常也会产生良好的结果。在HSV中,您基本上是在圆柱坐标系中操作,而RGB是一个简单的向量空间。