使用Python图像库(PIL)规范化一组图像的直方图(亮度和对比度)

2024-05-15 08:59:35 发布

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

我有一个脚本,它使用Google Maps API下载一系列大小相等的正方形卫星图像并生成PDF。图像需要事先旋转,我已经用PIL做了。

我注意到,由于光线和地形条件的不同,一些图像太亮,另一些太暗,生成的pdf文件最后有点难看,不太理想的阅读条件“在外地”(这是越野山地自行车,我想在那里有一个特定十字路口的打印缩略图)。

(编辑)目标是使所有的图像以相似的亮度和对比度结束。所以,太亮的图像必须变暗,而黑暗的图像必须变亮。(顺便说一句,我曾经使用imagemagickautocontrast,或者auto-gamma,或者equalize,或者autolevel,或者类似的东西,在医学图像中有有趣的结果,但是不知道如何在PIL中进行这些操作)。

在转换成灰度后我已经使用了一些图像校正(以前有一个灰度打印机),但是结果也不好。这是我的灰度代码:

#!/usr/bin/python

def myEqualize(im)
    im=im.convert('L')
    contr = ImageEnhance.Contrast(im)
    im = contr.enhance(0.3)
    bright = ImageEnhance.Brightness(im)
    im = bright.enhance(2)
    #im.show()
    return im

此代码对每个图像独立工作。我想知道是否最好先分析所有图像,然后“规范化”它们的视觉特性(对比度、亮度、伽马等)。

另外,我认为有必要在图像中进行一些分析(直方图?),以便根据每个图像应用自定义校正,而不是对所有图像应用相等的校正(尽管任何“增强”函数隐式地考虑初始条件)。

有没有人有这样的问题和/或知道一个很好的选择,这样做的彩色图像(没有灰度)?

感谢您的帮助,谢谢阅读!


Tags: 代码图像脚本pilgoogle条件灰度maps
1条回答
网友
1楼 · 发布于 2024-05-15 08:59:35

您可能正在寻找的是一个实用程序,执行“直方图拉伸”。Here is one implementation。我肯定还有其他人。我想你想保留原来的色调,并在所有色带上均匀地应用这个功能。

当然,很有可能有些瓷砖在其接合处的水平面会有明显的不连续性。然而,避免这种情况会涉及到“拉伸”参数的空间插值,这是一个更复杂的解决方案。(……但如果有必要的话,这将是一个很好的锻炼。)

编辑:

这里有一个保持图像色调的调整:

import operator

def equalize(im):
    h = im.convert("L").histogram()
    lut = []
    for b in range(0, len(h), 256):
        # step size
        step = reduce(operator.add, h[b:b+256]) / 255
        # create equalization lookup table
        n = 0
        for i in range(256):
            lut.append(n / step)
            n = n + h[i+b]
    # map image through lookup table
    return im.point(lut*im.layers)

相关问题 更多 >