Python, OpenCV, Pillow(PIL)で画像サイズ(幅、高さ)を取得

PythonにはOpenCV, Pillow(PIL)などの画像を扱うライブラリがあります。それぞれについて画像サイズ(幅、高さ)を取得する方法を説明します。 OpenCVはshape、Pillow(PIL)はsizeで画像サイズ(幅、高さ)をタプルで取得できるが、それぞれ順番が異なるので注意。 ここでは以下の内容について説明します。

OpenCV: ndarray.shapeで画像サイズ(幅、高さ)を取得 カラー画像の場合 グレースケール(モノクロ)画像の場合

Pillow(PIL): size, width, heightで画像サイズ(幅、高さ)を取得

Pythonでの画像処理については以下の記事も参照。

OpenCV: ndarray.shapeで画像サイズ(幅、高さ)を取得

OpenCVで画像ファイルを読み込むと、NumPy配列ndarrayとして扱われる。ndarrayの形状を示す属性shapeから画像のサイズ(幅、高さ)を取得できます。 OpenCVに限らず、Pillowで画像ファイルを読み込んでndarrayに変換した場合などのndarrayで表されている画像のサイズはshapeで取得します。

カラー画像の場合

カラー画像の場合は行(高さ) x 列(幅) x 色(3)の三次元のndarrayとなります。shapeは(行(高さ), 列(幅), 色(3))のタプルとなります。

import cv2

im = cv2.imread('data/src/lena.jpg')

print(type(im))
# <class 'numpy.ndarray'>

print(im.shape)
print(type(im.shape))
# (225, 400, 3)
# <class 'tuple'>

それぞれの値を変数に代入する場合は以下のようにタプルをアンパックします。

h, w, c = im.shape
print('width:  ', w)
print('height: ', h)
print('channel:', c)
# width:   400
# height:  225
# channel: 3

タプルをアンパックする場合、それ以降使わない値は慣例的に_に代入することもあります。例えば、色数(チャンネル数)を使わない場合は以下のようにします。

h, w, _ = im.shape
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

変数に代入せずインデックス(添字)で指定してそのまま使うこともできます。

print('width: ', im.shape[1])
print('height:', im.shape[0])
# width:  400
# height: 225

(幅, 高さ)のタプルを取得したい場合は、スライスを利用して以下のように書ける。cv2.resize()などの引数をサイズで指定する場合は(幅, 高さ)を使います。

print(im.shape[1::-1])
# (400, 225)

スライスについての詳細は以下の記事を参照。

グレースケール(モノクロ)画像の場合

グレースケール(モノクロ)画像の場合は行(高さ) x 列(幅)の二次元のndarrayとなります。shapeは(行(高さ), 列(幅))のタプルとなります。

im_gray = cv2.imread('data/src/lena.jpg', cv2.IMREAD_GRAYSCALE)

print(im_gray.shape)
print(type(im_gray.shape))
# (225, 400)
# <class 'tuple'>

基本的にはカラー画像の場合と同じ。

h, w = im_gray.shape
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

print('width: ', im_gray.shape[1])
print('height:', im_gray.shape[0])
# width:  400
# height: 225

幅と高さを変数に代入したい場合、以下のようにしておくと画像がカラーでもグレースケールでも対応できます。

h, w = im.shape[0], im.shape[1]
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

(幅, 高さ)のタプルを取得したい場合は、スライスを利用して以下のように書ける。下の書き方であれば画像がカラーでもグレースケールでも対応できます。

print(im_gray.shape[::-1])
print(im_gray.shape[1::-1])
# (400, 225)
# (400, 225)

Pillow(PIL): size, width, heightで画像サイズ(幅、高さ)を取得 Pillow(PIL)で画像を読み込むと得られるPIL.Imageオブジェクトは、属性size, width, heightをもつ。 sizeは(幅, 高さ)のタプル。

from PIL import Image

im = Image.open('data/src/lena.jpg')

print(im.size)
print(type(im.size))
# (400, 225)
# <class 'tuple'>

w, h = im.size
print('width: ', w)
print('height:', h)
# width:  400
# height: 225

幅と高さそれぞれを属性width, heightで取得することもできます。

print('width: ', im.width)
print('height:', im.height)
# width:  400
# height: 225

グレースケール(モノクロ)画像でも同じ。

im_gray = Image.open('data/src/lena.jpg').convert('L')

print(im.size)
print('width: ', im.width)
print('height:', im.height)
# (400, 225)
# width:  400
# height: 225

シェア

関連カテゴリー

Python 画像処理 OpenCV Pillow NumPy

Pythonでの画像処理、Pillow, NumPy, OpenCVの違いと使い分け Python, OpenCV, NumPyで画像のアルファブレンドとマスク処理 Python, NumPy(OpenCV)で画像を二値化処理 Python, Pillowで画像を回転するrotate Python, OpenCVで画像にモザイク処理(全面、一部、顔など) Python, Pillow, qrcodeでQRコード画像を生成、保存 Python, Pillowで円や四角、直線などの図形を描画 NumPy配列ndarrayをシフト(スクロール)させるnp.roll Python, Pillowで正方形・円形のサムネイル画像を一括作成 Python, Pillowで画像の一部をトリミング(切り出し/切り抜き) Python, OpenCVでBGRとRGBを変換するcvtColor Python, NumPyで画像処理(読み込み、演算、保存) Python, OpenCVで顔検出と瞳検出(顔認識、瞳認識) Python, Pillowで画像を縦・横に連結(結合) Python, Pillowで画像の上下左右に余白を追加しサイズ変更

Last Updated: 6/26/2019, 10:34:03 PM