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

2024-03-29 11:17:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python中的GUI(很可能使用Kivy)来制作一个程序,以匹配两个图像的曝光。我想显示这两个图像(RGB或灰度)并排与其对应的直方图,并有一个滑块,以能够控制对选定图像的曝光。我想就如何做这件事提出一些建议。

到目前为止,我已经阅读了几篇文章,似乎有几种方法可以计算图像的直方图(numpy、matplotlib、openCV和PIL),但是我不知道哪种方法是最好的(最少需要安装的库/依赖项)。我也读过关于改变图像曝光的文章,有些人提到改变亮度和对比度,所以你需要同时改变这两个来改变曝光?我知道openCV有equalizeHist,但这是自动完成的,我希望这两个图像的整体曝光率尽可能接近;这就是我想手动完成的原因。如果能自动完成就太好了,但我还在考虑怎么做。

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


Tags: 方法图像程序numpy文章时间guirgb
2条回答

让我们定义一下你使用的曝光术语。你可以曝光明亮和黑暗的场景说1秒,并有完全不同的图像。或者,您可能希望图像具有相似的对比度,但这并不意味着必须进行相同的曝光。

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

下面是一个伪代码: 一。计算每张图像的直方图:H[i] 2。将直方图求和为累积直方图:C[i]=H[i]+C[i-1]分别用于每个图像; 三。规范化每个:C[i]/=和(C(i)) 四。在传统的直方图均衡化中,您重新映射像素强度,以便它们同样可能: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()

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

听起来你好像对直方图匹配很感兴趣。我有一些用于此目的的代码here,但它没有经过很好的测试。

如果您发现该代码有用,可以随意向scikit映像发出pull请求,我们可以尝试将其集成到包中。

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

相关问题 更多 >