【Python/Pillow(PIL)】画像のヒストグラム取得、表示

Pillowで画像のヒストグラムを取得し、取得した画像データをmatplotlibで表示するには、とても簡単で以下のようにします。

import matplotlib.pyplot as plt # ヒストグラム表示用
from PIL import Image

# PIL.Imageで画像を開く
img = Image.open("./Mandrill.bmp")

# 画像の表示
img.show()

# ヒストグラムの取得
hist = img.histogram()

# ヒストグラムをmatplotlibで表示
plt.plot(range(len(hist)), hist)
plt.show()

(実行結果)

ただし、カラー画像になると、こんな感じ↓になってしまいます。

これは、取得したヒストグラムデータがR,G,Bのデータがつながって768個の一次元のリストに格納されてしまっているためで、具体的にはリストのインデックスで

    0~255:Rのヒストグラム
  256~511:Gのヒストグラム
  512~767:Bのヒストグラム
が格納されています。

以上のことを考慮して、最初のプログラムを変更して、

import matplotlib.pyplot as plt # ヒストグラム表示用
from PIL import Image

# PIL.Imageで画像を開く
img = Image.open("./Mandrill.bmp")

# 画像の表示
img.show()

# ヒストグラムの取得
hist = img.histogram()

# 各色の名前を取得
# カラーのとき:('R', 'G', 'B')
# モノクロのとき:("L")
bands = img.getbands()

# チャンネル数
ch = len(bands)

# グラフの表示色
if (ch == 1):
    colors = ["black"]
else:
    colors = ["red", "green", "blue", "black"]

# ヒストグラムをmatplotlibで表示
x = range(256)
for col in range(ch):
    y = hist[256 * col : 256 * (col + 1)]
    plt.plot(x, y, color = colors[col], label = bands[col])

# 凡例の表示
plt.legend(loc=2)

plt.show()

のようにすると、モノクロ、カラーの両方に対応できます。

【Python/PyLint】Visual Studioでエラー、警告の確認

Pythonでは、基本的にビルドしないので、実行するまでエラーが分からないのですが、Visual StudioのPythonプロジェクトからPyLintというエラーチェックツールが使えるようになっており、エラー、警告を確認することができます。

例えば、以下のようなダメダメコード

import numpy as np

flag = False

flag == True

a = a + 1;

if flag == True:
    print("flag:True")
else:
    print("flag:False")

このエラーを確認するには、プロジェクトの右ボタン→Python→PyLintの実行 をクリックします。

初めてPyLintを実行する場合は、以下のようにPyLintをインストールするか?を聞かれるので、足りないパッケージをインストールしてからコマンドを実行しますをクリックして、PyLintをインストールします。

すると、以下のようなメッセージが表示されるので、今すぐ昇格をクリックします。

これで、PyLintがインストールされ、PyLintが実行されます。

最初に示したコードでのエラーの解析結果は以下のようになります。

エラーが1つ、警告が3つ、メッセージが9つ。

内容を見てみると、

  • エラー Using variable ‘a’ before assignment [E:used-before-assignment]
    変数 a が定義される前(値が代入される前)に変数を参照している
  • 警告 Unused numpy imported as np [W:unused-import] 
    numpyのインポートは未使用
  • 警告 Statement seems to have no effect [W:pointless-statement] 
    このコードは意味がなさそう
  • 警告 Unnecessary semicolon [W:unnecessary-semicolon]
    セミコロンは必要ありません

となります。

このエラーと警告の分類ですが、エラーに関しては修正すべき内容がほとんど、警告に関しては実行する分には無視できるかもしれない内容ですが、

flag == True

の部分が

flag = True

を意図していた場合は危険な警告なので、警告に関してもできるだけ修正しておいた方が良さそうです。

エラーコードに関しては、こちら↓が参考になると思います。

http://pylint-messages.wikidot.com/all-codes

【Python/Pillow(PIL)】対応画像ファイルフォーマット

Pillowで画像ファイルを開くときはopen()関数、保存はsave()関数を使って

from PIL import Image

# PIL.Imageで画像を開く
img = Image.open("./Mandrill.bmp")

# OS標準の画像ビューアで表示
img.show()

# 画像のファイル保存
img.save("image.pdf")

と書くだけで、このよう↓に画像ファイルが開き、別のファイルフォーマットで画像を保存できます。

このopen()関数、save()関数で扱う事のできるファイルフォーマットは以下の通りです。

フォーマット open save
BMP
DIB
EPS
GIF
ICNS
ICO
IM
JPEG
JPEG2000
MSP
PCX
PNG
PPM
SGI
SPIDER
TGA
TIFF
WebP
XMB
BLP
CUR
DCX
FLI,FLC
FPX
FREX
GBR
GD
IMT
IPTC/NAA
MCIDAS
MIC
MPO
PCD
PIXAR
PSD
WAL
WMF
WMF
XPM
PALM
PDF
XV Thumbnails

Identify-only formats (認識のみ??)

  BUFR, FITS, GRIB, HDF5, MPEG

(参考)

https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html

 

個人的に使うのは、BMP, PNG, TIFF, GIFぐらいですね。
また、用途は少ないですが、画像をPDFファイルに出力できるのは、ちょっと面白い。