在 PIL 中更改图像的对比度
Change contrast of image in PIL
我有一个应该改变对比度的程序,但我觉得它并没有真正改变 contrast.It 将某些区域更改为红色,而我不希望它这样做。如果能告诉我怎么删除,谢谢。
这是代码:
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')
这是图像及其结果:
如果这是实际的对比方法,请告诉我
PIL 模块中已经构建了一个名为 contrast 的 class。您可以简单地使用它。
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()
我无法重现您的错误。在我的平台 (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)
您的输出看起来像是在单个通道中溢出(红色)。我看不出有任何理由会发生这种情况。但是如果你的 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])
一个可能的解决方法是确保对比度过滤器仅 return 范围 [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)
我有一个应该改变对比度的程序,但我觉得它并没有真正改变 contrast.It 将某些区域更改为红色,而我不希望它这样做。如果能告诉我怎么删除,谢谢。 这是代码:
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')
这是图像及其结果:
如果这是实际的对比方法,请告诉我
PIL 模块中已经构建了一个名为 contrast 的 class。您可以简单地使用它。
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()
我无法重现您的错误。在我的平台 (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)
您的输出看起来像是在单个通道中溢出(红色)。我看不出有任何理由会发生这种情况。但是如果你的 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])
一个可能的解决方法是确保对比度过滤器仅 return 范围 [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)