python - 在 PIL 中更改图像的对比度

标签 python python-3.x python-imaging-library

我有一个应该改变对比度的程序,但我觉得它并没有真正改变对比度。它把一些区域变成了红色,而我不希望这样。如果能告诉我怎么删除,谢谢。 这是代码:

from PIL import Image


def change_contrast(img, level):

    img = Image.open("C:\\Users\\omar\\Desktop\\Site\\Images\\obama.png")
    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(int(factor * (c-128) + 128) for c in color)
            img.putpixel((x, y), new_color)

    return img

result = change_contrast('C:\\Users\\omar\\Desktop\\Site\\Images\\test_image1.jpg', 100)
result.save('C:\\Users\\omar\\Desktop\\Site\\Images\\test_image1_output.jpg')
print('done')

这是图像及其结果:

obama.png obama modified

如果这是实际的对比方法,请随时告诉我

最佳答案

我无法重现您的错误。在我的平台 (debian) 上,只有 Pillow fork 可用,所以如果您使用的是较旧的 PIL 包,则可能是这个原因。

无论如何,都有一个内置方法Image.point()为了做这种手术。它将映射每个 channel 中的每个像素,这应该比在 python 中执行三个嵌套循环更快。

def change_contrast(img, level):
    factor = (259 * (level + 255)) / (255 * (259 - level))
    def contrast(c):
        return 128 + factor * (c - 128)
    return img.point(contrast)

change_contrast(Image.open('barry.png'), 100)

output

您的输出看起来像是在单个 channel 中溢出(红色)。我看不出有任何理由会发生这种情况。但是,如果您的 level 高于 259,则输出会反转。类似的事情可能是最初错误的原因。

def change_contrast_multi(img, steps):
    width, height = img.size
    canvas = Image.new('RGB', (width * len(steps), height))
    for n, level in enumerate(steps):
        img_filtered = change_contrast(img, level)
        canvas.paste(img_filtered, (width * n, 0))
    return canvas

change_contrast_multi(Image.open('barry.png'), [-100, 0, 100, 200, 300])

another output

一个可能的解决方法是确保对比度过滤器只返回 [0-255] 范围内的值,因为该错误似乎是由负值不知何故溢出引起的。

def change_contrast(img, level):
    factor = (259 * (level + 255)) / (255 * (259 - level))
    def contrast(c):
        value = 128 + factor * (c - 128)
        return max(0, min(255, value))
    return img.point(contrast)

关于python - 在 PIL 中更改图像的对比度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42045362/

相关文章:

python - 如何让 FigureCanvasTkAgg 与 Scrollbar 一起工作

python - 使用第一个非缺失值向前填充行

python - 如果匹配条件,则替换字符串中的最后三个字符

python - 使用 PIL.resize 调整 JPG 大小会得到全黑图像

python - 在 Python 中读取 tiff 图像元数据

python - 协议(protocol) object_detection/protos/*.proto : No such file or directory

python - 如何检查上传到 Plone 站点的重复文件或图像

python - 使用非零初始值创建大小为 N 的 bytes() 的大多数 pythonic 方法?

python - 如何正确使用POST请求?

python PIL 砍掉了我的draw.text 的顶部