2017-02-04 7 views
4

コントラストを変更するはずのプログラムがありますが、コントラストを実際に変更していないような気がします。それらを取り除く方法を教えていただけたら、ありがとう。ここ はコードです:PILの画像のコントラストを変更する

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

これは、実際のコントラスト方式であれば、私に

+0

これは再生できません。あなたのコードを試してみました。出力イメージは大丈夫です。 https://i.stack.imgur.com/QhR3n.jpg –

+0

あなたのコードには、入力画像を読み込む際に2つの異なる試みがあります。関数本体に 'obama.png'がハードコーディングされているので、' test_image1.jpg'は使用されません。使用していると思われる入力ファイルを使用していますか? –

答えて

8

私はあなたのバグを再現できませんでした。私のプラットフォーム(debian)では、ピローフォークしか利用できないので、古い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) 

output

あなたは、単一のチャンネル(赤)でのオーバーフローを持っているようにあなたの出力が見えます。私はそれが起こる理由は何も分かりません。しかし、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) 
+0

それはまさに私が探していたものです。私は縮尺依存性コントラストモディファイアを作りたかったのです。私はそれを試してみると、それが動作するかどうかを確認します。もしそうなら、私は答えとしてそれを受け入れるでしょう。 –

+0

Numpyで構築してNumpy配列として表現された画像で使用すると、同じ機能が動作しないのはなぜですか? – Alex

+0

それは私の答えで説明しました。 pointはImageクラスのメソッドです。 –

4

を教えて気軽にすでにPILモジュールにcontrastというクラスが構築されています。あなたは単にそれを使うことができます。

from PIL import Image, ImageEnhance 
image = Image.open(':\\Users\\omar\\Desktop\\Site\\Images\\obama.png') 
scale_value=scale1.get() 
contrast = ImageEnhance.Contrast(image) 
contrast_applied=contrast.enhance(scale_value) 
image.show() 
+0

はい、コントラストのレベルを調整できません。私は写真に適用されるコントラストのレベルを定義する尺度を持ちたいと考えています。このコマンドは調整できません。私が取り組んでいる他のプログラムが必要な場合は、私が話していることを適用して、私はそれを投稿に入れます。 –

+0

コントラストのレベルを上げたいですか? o – orvi

+0

はい、ユーザーが選択したレベルによっては、元の写真とは対照的です。他のプログラムを投稿する必要がありますか? –

関連する問題