Python - 使用 For 循环更改图像的对比度

Python - Changing An Image's Contrast With For-Loop

我正在尝试创建一个 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))

这些行:

if (x, y) > 128:

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

您遇到的问题是 (x, y) > 128 正在将元组与单个值进行比较,这可能不是您想要的。另一个问题是 img.getpixel((x, y)) returns 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')

这是测试的结果 运行 我确实在左侧显示了之前的图像,在右侧显示了生成的图像 — 它看起来很有效: