【问题标题】:Python - Changing An Image's Contrast With For-LoopPython - 用 For-Loop 改变图像的对比度
【发布时间】:2015-03-30 01:22:55
【问题描述】:

我正在尝试创建一个 for 循环函数,该函数将遍历每个像素以增加图像的对比度。我想我已经接近了,但现在图像只会变亮。如果可能,请尽量坚持我已经制定的内容(仅供参考,我试图避免使用 OpenCV 之类的库)。感谢您的任何贡献。

def contrast(img):
   for x in range(img.size[0]):
       for y in range(img.size[1]):
           if (x, y) > 128:
              (r, g, b) = img.getpixel((x, y))  
              img.putpixel((x, y), (r+80, g+80, b+80))  
           else:
              if(x, y) < 128:
                 (r, g, b) = img.getpixel((x, y))  
                 img.putpixel((x, y), (r-80, g-80, b-80))

【问题讨论】:

    标签: python image for-loop pixels contrast


    【解决方案1】:

    这些行:

    if (x, y) > 128:
    

    应该将像素的亮度与 128 进行比较,而不是像素坐标。

    【讨论】:

    • @newrecruit21 不,您必须在给定 r、g 和 b 的情况下计算一些亮度值。您不能将元组与整数进行比较。
    • 好的,现在知道了。谢谢。
    【解决方案2】:

    您遇到的问题是 (x, y) &gt; 128 将元组与单个值进行比较,这可能不是您想要的。另一个问题是 img.getpixel((x, y)) 返回 RGB 图像的三个独立颜色分量的元组,而不是像素的亮度。

    您需要一种能够改变彩色图像对比度的图像处理技术。我发现一篇标题为 Image Processing Algorithms Part 5: Contrast Adjustment 的文章描述了一种简单的方法。

    这是使用PIL(Python 图像库)模块的pillow 版本的实现:

    from PIL import Image
    
    # level should be in range of -255 to +255 to decrease or increase contrast
    def change_contrast(img, level):
        def truncate(v):
            return 0 if v < 0 else 255 if v > 255 else v
    
        if Image.isStringType(img):  # file path?
            img = Image.open(img)
        if img.mode not in ['RGB', 'RGBA']:
            raise TypeError('Unsupported source image mode: {}'.format(img.mode))
        img.load()
    
        factor = (259 * (level+255)) / (255 * (259-level))
        for x in range(img.size[0]):
            for y in range(img.size[1]):
                color = img.getpixel((x, y))
                new_color = tuple(truncate(factor * (c-128) + 128) for c in color)
                img.putpixel((x, y), new_color)
    
        return img
    
    result = change_contrast('test_image1.jpg', 128)
    result.save('test_image1_output.jpg')
    print('done')
    

    这是我进行的一次测试运行的结果,左侧显示了之前的图像,右侧显示了生成的图像 - 看起来它可以正常工作:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多