使用Python Image Library(PIL)标准化一组图像的直方图(亮度和对比度)

hel*_*ker 11 python image-processing brightness contrast python-imaging-library

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

我注意到,由于不同的光线和地形条件,一些图像太亮,另一些图像太暗,结果pdf结果有点难看,"在野外"读取条件不太理想(这是偏远的山地自行车,我想要一个特定十字路口的打印缩略图).

(编辑)然后目标是使所有图像最终具有相似的表观亮度和对比度.因此,过于明亮的图像必须变暗,而黑暗的图像则必须变亮.(顺便说一下,我曾经使用过imagemagick autocontrast,或者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
Run Code Online (Sandbox Code Playgroud)

此代码对每个图像独立工作.我想知道首先分析所有图像然后"标准化"它们的视觉特性(对比度,亮度,伽玛等)会更好.

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

有没有人有这样的问题和/或知道用彩色图像(没有灰度)做这个的好方法?

任何帮助将不胜感激,感谢阅读!

Pau*_*aul 7

您可能正在寻找的是一个执行"直方图拉伸"的实用程序. 这是一个实现.我相信还有其他人.我想你想要保留原始色调并在所有色带上均匀地应用这个功能.

当然,很有可能一些瓷砖在它们加入的水平上会有明显的不连续性.然而,避免这种情况将涉及"拉伸"参数的空间插值,并且是更复杂的解决方案.(......但如果有需要,这将是一个很好的练习.)

编辑:

这是一个保留图像色调的调整:

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)
Run Code Online (Sandbox Code Playgroud)

  • 我试图运行你的代码,但是在类Image(代码的最后一行)上存在一个不存在属性`layers`的错误.我使用的是Python 2.7,但在PIL的文档中找不到这个属性.任何的想法?:O( (2认同)
  • @heltonbiker im.layers将为3表示RBG图像,4表示RGBA图像.只需替换适当的值即可. (2认同)