gpt4 book ai didi

opencv - 饱和度、值重新映射以补偿光照

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

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

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

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

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

我可以为三个 HSV channel 分开这个等式吗?或者我应该做什么类型的转换?

我当前的代码围绕一个枢轴点(默认为 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;

enter image description here

最佳答案

我不确定我是否理解您想要做什么。但如果我没记错的话,我认为你应该尝试在 HSL 而非 HSV 中拆分你的 channel ,并在 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;    }

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

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

希望对您有所帮助!

关于opencv - 饱和度、值重新映射以补偿光照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16483403/

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