Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python根据直方图调整曝光(亮度/对比度)_Python_Opencv_Image Processing_Kivy - Fatal编程技术网

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

使用Python根据直方图调整曝光(亮度/对比度),python,opencv,image-processing,kivy,Python,Opencv,Image Processing,Kivy,我试图用Python制作一个GUI程序(很可能使用Kivy),以匹配两幅图像的曝光。我想显示这两个图像(RGB或灰度)并排与相应的直方图,并有一个滑块,能够控制对选定图像的曝光。我想就如何进行这项工作提出一些建议 到目前为止,我已经阅读了几篇文章,似乎有几种方法可以计算图像的直方图(numpy、matplotlib、openCV和PIL),但是我不知道哪种方法对我来说是最好的(最少需要安装库/依赖项)。我也读过关于改变图像曝光的文章,有些人提到改变亮度和对比度,所以你需要同时改变两者来改变曝光?

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

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


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

让我们来定义一下你们使用的曝光术语。你可以曝光明亮和黑暗的场景,比如说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()
//直方图均衡化
浮点数[10000];
void histEqualize(无符号短*src,无符号短*dst,int sz){
如果(sz==0)
返回;
memset(histEq,0,深度等级*大小(浮点));
//1.深度直方图

对于(int i=0;i我们有一个直方图调整的例子

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

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


编辑2019-04-29:直方图匹配是。

嘿,非常感谢你的评论。我将浏览你的代码,并找出它对我的作用。不过,我还有一个问题,你是以什么格式读取图像的?它是一个numpy数组吗?对于这个特定的代码,它只是一个C指针无符号短*src,它是一个线性数组r数组。您可以对灰色0..255使用无符号字符类型。您是正确的。我正在尝试将源的直方图与目标进行匹配。我找到了,但还没有完全阅读,但我计划使用他们的方法。我一定会尝试您的代码!也许,那么,您也会发现这一点:第一个链接是deatha默罕默德,nks现在应该修复了。