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')
这是测试的结果 运行 我确实在左侧显示了之前的图像,在右侧显示了生成的图像 — 它看起来很有效:
我正在尝试创建一个 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')
这是测试的结果 运行 我确实在左侧显示了之前的图像,在右侧显示了生成的图像 — 它看起来很有效: