Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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/2/shell/5.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图像库(PIL)规范化一组图像的直方图(亮度和对比度)_Python_Image Processing_Python Imaging Library_Brightness_Contrast - Fatal编程技术网

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

使用Python图像库(PIL)规范化一组图像的直方图(亮度和对比度),python,image-processing,python-imaging-library,brightness,contrast,Python,Image Processing,Python Imaging Library,Brightness,Contrast,我有一个脚本,它使用谷歌地图API下载一系列大小相等的方形卫星图像并生成PDF。图像需要事先旋转,我已经使用PIL进行了旋转 我注意到,由于不同的光线和地形条件,一些图像太亮,另一些太暗,结果pdf有点难看,没有理想的“野外”阅读条件(这是越野山地自行车赛,我想有一个特定十字路口的打印缩略图) (编辑)然后,目标是使所有图像最终具有相似的明显亮度和对比度。因此,太亮的图像必须变暗,而黑暗的图像必须变亮。(顺便说一句,我曾经在医学图像中使用过imagemagickautocontract,或aut

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

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

(编辑)然后,目标是使所有图像最终具有相似的明显亮度和对比度。因此,太亮的图像必须变暗,而黑暗的图像必须变亮。(顺便说一句,我曾经在医学图像中使用过imagemagick
autocontract
,或
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
此代码对每个图像都独立工作。我想知道是否最好先分析所有图像,然后“标准化”它们的视觉特性(对比度、亮度、伽马等)

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

有没有人有这样的问题和/或知道一个好的替代方法来处理彩色图像(无灰度)


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

您可能正在寻找一个执行“直方图拉伸”的实用程序。我相信还有其他人。我认为您希望保留原始色调,并在所有色带上均匀应用此功能

当然,有一个很好的机会,一些瓷砖将有一个明显的不连续的水平,他们加入。然而,避免这种情况需要对“拉伸”参数进行空间插值,这是一种更复杂的解决方案。(…但如果需要的话,这将是一个很好的练习。)

编辑:

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

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)

下面的代码处理来自显微镜(类似)的图像,以便在缝合之前进行准备。我在20幅图像的测试集上使用了它,得到了合理的结果

亮度平均值函数来自另一个函数

此时,“校正”值(即值和平均值之间的差值)存储在deltaList中。下一节将此校正逐一应用于所有图像

for k in range(1, num_images + 1):      # for loop runs from image number 1 thru 20
   a = str(k)
   if len(a) == 1: a = '0' + str(k)       # to follow the naming convention of files - 01.jpg, 02.jpg... 11.jpg etc.
   image_name = 'twenty/' + a + '.jpg'
   img_file = Image.open(image_name)
   img_file = img_file.convert('RGB')     # converts image to RGB format
   pixels = img_file.load()               # creates the pixel map
   for i in range (img_file.size[0]):
      for j in range (img_file.size[1]):
         r, g, b = img_file.getpixel((i,j))  # extracts r g b values for the i x j th pixel
         pixels[i,j] = (r+int(deltaList[k]), g+int(deltaList[k]), b+int(deltaList[k])) # re-creates the image
   j = str(k)
   new_image_name = 'twenty/' +'image' + j + '.jpg'      # creates a new filename
   img_file.save(new_image_name)                         # saves output to new file name

好问题!然而,需要作出一些澄清。此外,发布示例图像将非常有助于人们将其用作测试用例。首先,问题是当你下载瓷砖边缘时,它们不匹配吗?或者,你是在寻找一种方法,让黑暗的瓷砖变亮,让明亮的瓷砖变暗?或者您需要在保持边缘连续性的同时执行后一种操作吗?边缘不是问题,因为图像集不是连续的。正如你所说的,我们的目标是把最亮的调暗,把最暗的调亮。哇,这似乎正是我想要的。我会给它一个快速尝试,并张贴一些反馈很快!实际上,这个实现似乎一次只能处理一个图像,我想先分析所有图像,然后应用均衡。此外,图像不会平铺,它们来自不同的位置,通常不会重叠。我会检验你的建议,看看能得到什么。谢谢我在相机的普通数码图像上试过,效果很好。然而,当我在谷歌卫星图像的屏幕盖上试用时,感觉很糟糕。我认为sat图像是高度后处理的,或者其他什么。我试图运行你的代码,但是在类图像(代码的最后一行)上存在属性
不存在的错误。我正在使用Python2.7,但在PIL的文档中找不到该属性。有什么想法吗o(@heltonbiker im.layers对于RBG图像将为3,对于RGBA图像将为4。只需替换适当的值。
for k in range(1, num_images + 1):      # for loop runs from image number 1 thru 20
   a = str(k)
   if len(a) == 1: a = '0' + str(k)       # to follow the naming convention of files - 01.jpg, 02.jpg... 11.jpg etc.
   image_name = 'twenty/' + a + '.jpg'
   img_file = Image.open(image_name)
   img_file = img_file.convert('RGB')     # converts image to RGB format
   pixels = img_file.load()               # creates the pixel map
   for i in range (img_file.size[0]):
      for j in range (img_file.size[1]):
         r, g, b = img_file.getpixel((i,j))  # extracts r g b values for the i x j th pixel
         pixels[i,j] = (r+int(deltaList[k]), g+int(deltaList[k]), b+int(deltaList[k])) # re-creates the image
   j = str(k)
   new_image_name = 'twenty/' +'image' + j + '.jpg'      # creates a new filename
   img_file.save(new_image_name)                         # saves output to new file name