コントラストを変更することになっているプログラムがありますが、実際にはコントラストを変更していないように感じます。それらを削除する方法を教えていただければ、ありがとうございます。コードは次のとおりです。
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')
そして、これが画像とその結果です。
これが実際のコントラスト法である場合、お気軽に教えてください
バグを再現できませんでした。私のプラットフォーム(debian)ではPillow forkしか利用できないため、古いPILパッケージを使用している場合は、それが原因である可能性があります。
いずれにせよ、この種の操作を行うための組み込みメソッド Image.point()
があります。各チャネルの各ピクセルにマッピングされます。これは、Pythonで3つのネストされたループを実行するよりも高速です。
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])
バグは何らかの理由でオーバーフローする負の値によって引き起こされるため、コントラストフィルターが[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)
PILモジュールに contrast というクラスがすでに構築されています。簡単に使用できます。
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()