2021年12月20日月曜日

【Pillow】pointによるピクセル値の変換

 画像処理ライブラリPillowのImage.pointにより画像に対して画素毎の変換処理ができる。

Pillow(PIL)を使うためにはインポートが必要。PIL.Imageモジュールは通常以下の形式でインポートされる。

from PIL import Image

また例に用いる元画像 'river.jpg' は以下(フリー写真素材ぱくたそより)




1. pointによる画素の補正

 pointは引数のルックアップテーブルまたは関数に応じて画素値を変換する。
全画素の画素値を1.5倍する場合。引数に無名関数(ラムダ式)で画素値1.5倍の式を与える。

from PIL import Image

# 画像読み出し
im = Image.open('river.jpg')  

# 画素値を1.5倍変換
out = im.point(lambda i: i * 1.5)

# 画像保存
out.save('river_point.png')

実行結果




全画素の画素値を0.5倍する場合。引数に無名関数(ラムダ式)で画素値0.5倍の式を与える。

from PIL import Image

# 画像読み出し
im = Image.open('river.jpg')  

# 画素値を0.5倍変換
out = im.point(lambda i: i * 0.5)

# 画像保存
out.save('river_point.png')

実行結果




2. ガンマ補正

全画素に単純に定数をかけると256以上の画素値は255に、0未満の画素値は0となりコントラストが失われいわゆる「白とび黒つぶれ」の状態となる。補正式にガンマカーブを用いることでこれを回避できる。
ガンマ=0.5のγカーブで補正した場合。画像が明るく補正されるが白飛びは抑制される。

from PIL import Image

# 画像読み出し
im = Image.open('river.jpg')  

# 画素値をgamma = 0.5のガンマ補正
gamma = 0.5
out = im.point(lambda i: (i/255)**gamma*255)

# 画像保存
out.save('river_point.png')   

実行結果




ガンマ=2のガンマカーブで補正した場合。画像が暗く補正されるが黒つぶれは抑制される。

from PIL import Image

# 画像読み出し
im = Image.open('river.jpg')  

# 画素値をgamma = 2のガンマ補正
gamma = 2
out = im.point(lambda i: (i/255)**gamma*255)

# 画像保存
out.save('river_point.png')   

実行結果




3. チャンネル別の処理

特定のチャンネルを指定して、特定のチャンネルのみにpointを適用できる。まずsplitでチャンネルごとに分割し、pointで特定チャンネルを処理、mergeでチャンネルを統合、という手順になる。
R(チャンネル0)のみ1.5倍にする場合。

from PIL import Image

# 画像読み出し
im = Image.open('river.jpg')  

# RGBチャネルに分割
source = im.split()

# Rチャネルのみ画素値を1.5倍変換
red = source[0].point(lambda i: i *1.5)

# 変換したRチャンネルを分割したRチャンネルに張り付け
source[0].paste(red)

# 分割したチャンネルをマージ
new = Image.merge(im.mode, source)

# 画像保存
new.save('river_red.png')

実行結果




4. リファレンス

Pillow (PIL Fork) > The Image Class > Image.point(lut, mode=None)
Pillow (PIL Fork) > Handbook > Tutorial > Point Operations

使用バージョン:Python 3.8.8 / Pillow 8.2.0

0 件のコメント:

コメントを投稿