2022年4月17日日曜日

【Pillow】Image.histogramによる画像ヒストグラムの作成

 画像処理ライブラリPillowのImage.histogramを使うと、画像の輝度vs画素数からなるヒストグラムを作成できる。

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

from PIL import Image

 またヒストグラムを求める画像 'tulip.jpg'(幅400ピクセルx高さ267ピクセル)は以下(フリー写真素材ぱくたそより)


'tulip.jpg'





1. グレースケール画像からのヒストグラム作成

 グレースケール画像に対してImage.histogramを適用すると、0~255の画素値それぞれのピクセル数が得られる。

from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('tulip.jpg')
gray = im.convert('L')

hist = gray.histogram()

plt.plot(hist)
plt.show()



2. カラー画像からのヒストグラム作成

 RGB3チャンネルからなるカラー画像に対してImage.histogramを適用した場合、Rチャンネル(256値)、Gチャンネル(256値)、Bチャンネル(256値)が連続して出力されてしまう。

from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('tulip.jpg')

hist = im.histogram()

plt.plot(hist)
plt.show()



 RGB3チャンネルが連続して出力されたヒストグラムをインデックス0~255、256~511、512~766の3つの範囲に分離し、RGB各チャンネル別に表示するとわかりやすい。

from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('tulip.jpg')

hist = im.histogram()

plt.plot(hist[0:256], c='red', label='R')
plt.plot(hist[256:512], c='green', label='G')
plt.plot(hist[512:767], c='blue', label='B')

plt.legend()
plt.show()



3. マスクによる特定範囲のヒストグラム作成

 ヒストグラムを作成する画像と同じサイズのマスク画像を用意すると、マスク画像の画素値が0以外の座標のみからヒストグラムが作成される。
 下の 'mask.jpg' をマスク画像に用いる場合。サイズは'tulip.jpg'と同じ幅400ピクセルx高さ267ピクセル、画像モードは'1'の二値画像で黒い箇所は画素値0、白い箇所は画素値1。

'mask.jpg'



 マスク画像の黒い部分(画素値0)は採用されず、白い部分(画素値1)のみ採用される。大半がチューリップとなるためR(赤)の輝度が高い画素のカウント数が多くなる。

from PIL import Image
import matplotlib.pyplot as plt

im = Image.open('tulip.jpg')
mask = Image.open('mask.jpg')

hist = im.histogram(mask=mask)

plt.plot(hist[0:256], c='red', label='R')
plt.plot(hist[256:512], c='green', label='G')
plt.plot(hist[512:767], c='blue', label='B')

plt.legend()
plt.show()


4. リファレンス

Pillow (PIL Fork) > Image Module > Image.histogram(mask=None, extrema=None)

使用バージョン:Python 3.8.12 / Pillow 9.0.0

0 件のコメント:

コメントを投稿