使用Python调整基于直方图的曝光(亮度/对比度)

时间:2014-04-04 01:36:20

标签: python opencv image-processing kivy

我正在尝试用Python制作一个带有GUI(最有可能使用Kivy)的程序,以匹配两个图像的曝光。我想要将两个图像(RGB或灰度)与它们相应的直方图并排显示,并且有一个滑块可以控制所选图像上的曝光。我想就如何解决这个问题提出一些建议。

到目前为止,我已经阅读了几篇文章,似乎有几种方法来计算图像的直方图(numpy,matplotlib,openCV和PIL),但是我很困惑哪个最好(最少的库/依赖安装)让我实现。我还读过有关改变图像曝光的内容,有些人提到改变亮度和对比度,所以你需要改变两者来改变曝光?我知道openCV有equalizeHist但是它自动完成,我想要的是两张图像尽可能接近整体曝光;这就是为什么我想手动做的原因。如果可以自动完成它会很棒,但我仍然在考虑如何做到这一点。

我知道你们非常重视你的时间,所以如果你没有时间深入回答,我会理解。

2 个答案:

答案 0 :(得分:1)

让我们定义您使用的曝光术语。您可以曝光明亮和黑暗的场景,比如1秒,并且具有完全不同的图像。或者,您可能希望图像具有相似的对比度,但这并不是强制性意味着相同的曝光。

由于您提到了直方图均衡,您最终可能会将两个图像的直方图等同起来,使它们看起来具有相同的对比度。直方图均衡将使每个图像直方图看起来平坦,因此所有强度都是同等可能的(因此最佳分布以最大化对比度 - 并不总是令人赏心悦目的效果)。您可能希望为每个图像单独创建自己的非平面直方图轮廓,并对其进行修改,直到图像看起来像您希望的那样。

这是一个伪代码: 1.计算每个图像的直方图:H [i] 2.将直方图求和为累积直方图:分别为每个图像的C [i] = H [i] + C [i-1]; 3.规范化每一个:C [i] / = sum(C(i)) 4.在传统的直方图均衡中,您重新映射像素强度,使它们同样可能:i2 = 255 * C [i1];在您的情况下,您只是希望它们遵循您自己的直方图配置文件(因此您可以使用滑块调整每个图像强度分布,然后直观地比较结果);例如,尝试类似这样的重映射:i2 = i1 * k + 255 * C [i1] *(1-k),其中滑块将k的值从0.0更改为1.0。当k = 1时,您将获得原始图像;当k = 0时,您将获得完整的直方图均衡。下面是直方图均衡函数,我用于Kinect深度的颜色映射,具有10000级到255级灰度。您必须修改和调整案例的功能。

// histogram equalization
float histEq[10000];
void histEqualize(unsigned short* src, unsigned short* dst, int sz) { 

    if (sz==0)
        return;
    memset(histEq, 0, DEPTH_LEVELS*sizeof(float));

    // 1. depth histogram
    for (int i=0; i<sz; ++i) {
        unsigned short val = src[i];
        if (val!=0 && val < DEPTH_LEVELS)
            histEq[val]++;
    }

    // 2. cumulative histogram
    for (int i=1; i<DEPTH_LEVELS; ++i)
        histEq[i] += histEq[i-1];
    long max_cumul = histEq[DEPTH_LEVELS-1];
    if (max_cumul==0)
        return;

    // 3. mapping function
    for (int i=1; i<DEPTH_LEVELS; ++i)
        histEq[i] = (255*histEq[i])/max_cumul;

    // remap src
    for (int i=0; i<sz; ++i) {
        unsigned short z = src[i];
        if (z>0)
            dst[i] = (unsigned char)(255-histEq[src[i]]+0.5f);
        else
            dst[i] = 0;

    }

} // histEqualization()

答案 1 :(得分:0)

我们有一个直方图调整的例子here

听起来好像你对直方图匹配感兴趣。我有一些代码here,但它没有经过充分测试。

如果您确实发现该代码有用,请随意向scikit-image发出拉取请求,我们可以尝试将其集成到包中。

编辑2019-04-29:直方图匹配为now included in scikit-image