改变PIL中图像的对比度

Meg*_*sim 13 python python-imaging-library python-3.x

我有一个应该改变对比度的程序,但我觉得它并没有真正改变对比度.它将某些区域变为红色而我不希望它.如果你能告诉我如何删除它们,谢谢.这是代码:

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

这是图像及其结果:

obama.png 奥巴马修改

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

Håk*_*Lid 18

我无法重现你的错误.在我的平台(debian)上只有Pillow fork可用,所以如果你使用旧的PIL包,那可能就是原因.

在任何情况下,都有一种内置的方法Image.point()来进行这种操作.它将映射每个通道中的每个像素,这应该比在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)
Run Code Online (Sandbox Code Playgroud)

产量

您的输出看起来像是在单个通道中溢出(红色).我没有看到为什么会发生这种情况的任何理由.但如果您的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])
Run Code Online (Sandbox Code Playgroud)

另一个输出

可能的解决方法是确保对比度过滤器仅返回[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)
Run Code Online (Sandbox Code Playgroud)


orv*_*rvi 13

已经在PIL模块中构建了一个名为对比的类.你可以简单地使用它.

from PIL import Image, ImageEnhance
image = Image.open(':\\Users\\omar\\Desktop\\Site\\Images\\obama.png')
scale_value=scale1.get()
image = ImageEnhance.Contrast(image).enhance(scale_value)
image.show()
Run Code Online (Sandbox Code Playgroud)