yiskw note

機械学習やプログラミングについて気まぐれで書きます

【Python / Pillow】画像の輝度,シャープネス,コントラスト,彩度を変更する


Pythonの画像処理ライブラリであるPillowを用いて,画像の輝度,シャープネス,コントラスト,彩度を変更する方法について調べたので, こちらにメモを残しておきます.

画像の読み込み

from PIL import Image


image_path = "./lotus-6605296_640.jpeg"
image = Image.open(image_path)

今回はこのような画像を使用しています.

f:id:yiskw713:20211006093956p:plain

引用: https://pixabay.com/ja/photos/%e3%83%ad%e3%83%bc%e3%82%bf%e3%82%b9-%e3%82%b9%e3%82%a4%e3%83%ac%e3%83%b3-%e7%99%bd%e3%81%84%e8%8a%b1-6605296/

輝度を変更する

PIL.ImageEnhance.Brightnessクラスを使用することで輝度の変更が可能です.
手順としては,

  1. 変更したい画像を用いて,PIL.ImageEnhance.Brightnessインスタンス化する.
  2. PIL.ImageEnhance.Brightnessenhanceメソッドを使用することで,画像の輝度を変更したものを出力する.その際に,どのように輝度を変更するかを表すfactorの値を入力する.factorの値が1より小さい場合は暗く,1より大きい場合は明るくすることができる.

以下実際のコードとなります.

from PIL import ImageEnhance


factor = 0.5
enhancer = ImageEnhance.Brightness(image)
result = enhancer.enhance(factor)

結果

f:id:yiskw713:20211006094348p:plain

このように画像の輝度を変えることができました.
今回はfactorの値を0.5にしたので,画像が元のものより暗くなっています.
次にfactorに1より大きい値を入力してみます.

factor = 1.5
enhancer = ImageEnhance.Brightness(image)
result = enhancer.enhance(factor)

結果

f:id:yiskw713:20211006094935p:plain

画像を明るくすることができました.

他のシャープネス,コントラスト,彩度の変更も,基本的には輝度の変更と同じ手順で,
それぞれ該当するクラスのインスタンスを作り,enhanceメソッドにどのように変更を施すかを表すfactorの値を渡すことで,画像の編集が可能です.
それぞれ簡単に使い方をみていきます.

画像のシャープネスを変更する

PIL.ImageEnhance.Sharpnessクラスを使用します.
以下はfactorの値を1より小さくして,輪郭をぼんやりさせた場合です.

factor = 0.1
enhancer = ImageEnhance.Sharpness(image)
result = enhancer.enhance(factor)

f:id:yiskw713:20211006095604p:plain

次に輪郭をくっきりさせてみます.

factor = 2.0
enhancer = ImageEnhance.Sharpness(image)
result = enhancer.enhance(factor)

f:id:yiskw713:20211006095713p:plain

画像のコントラストを変更する

PIL.ImageEnhance.Contrastを使用します.
以下はfactorの値を1以下にして,画像のコントラストを下げるコードです.

factor = 0.5
enhancer = ImageEnhance.Contrast(image)
result = enhancer.enhance(factor)

結果

f:id:yiskw713:20211006095848p:plain

次に画像のコントラストを上げてみます.

factor = 1.5
enhancer = ImageEnhance.Contrast(image)
result = enhancer.enhance(factor)

結果

f:id:yiskw713:20211006100004p:plain

画像の彩度を変更する

PIL.ImageEnhance.Colorを使用します.上記と同様の手順で変更可能です.
まず彩度を下げてみます.

factor = 0.5
enhancer = ImageEnhance.Color(image)
result = enhancer.enhance(factor)

結果

f:id:yiskw713:20211006100132p:plain

次に彩度を上げてみます.

factor = 1.5
enhancer = ImageEnhance.Color(image)
result = enhancer.enhance(factor)

結果

f:id:yiskw713:20211006100219p:plain

参考

ImageEnhance Module — Pillow (PIL Fork) 8.3.2 documentation