【Python】ディレクトリ内の全ての画像の解像度を調べる

 

Pythonで画像処理のコードを書いているとディレクトリ内にある全ての画像の解像度を調べたくなる時があります。

一枚や二枚であれば、右クリックで見ればわかりますが、数千枚、数万枚だと数が多くて調べきれません。

そこで、ディレクトリを指定しその中の全ての画像の解像度を取得するコードを書いてみました。

 

コード

 

import glob
import os
import cv2
import sys

# 引数は画像のファイルパス
# 画像を読み込み、解像度情報を返す関数
def get_resolution(filepath):

    img = cv2.imread(filepath)

    # 画像ファイルの読み込みに失敗したらエラー終了
    if img is None:
        print("Failed to load image file.")
        sys.exit(1)

    # カラーとグレースケールで場合分け
    if len(img.shape) == 3:
        height, width, channels = img.shape[:3]
    else:
        height, width = img.shape[:2]
        channels = 1
    
    return width,height,channels

# 引数はディレクトリ
# ディレクトリ内のファイルの解像度をカウントする
def count_resol(directory):
    print(directory)
    files = glob.glob(directory)
    d={}
    for file in files:
        width,height,channels = get_resolution(file)
        info = str(width) + "," + str(height) + "," +str(channels)
        d.setdefault(info,0)
        d[info] += 1

    print(d)
    
# 対象ディレクトリを指定する,複数のディレクトリを指定可能
directory = ["/path/to/img/*"]

for d in directory:
    count_resol(d)

 

出力は以下の通り。

 

/path/to/img/*
{'200,200,3': 2, '1200,1200,3': 1, '2048,1152,3': 1}

 

見方は、{横サイズ、縦サイズ、チャンネル数 : 枚数}です。ディレクトリ内には4枚の画像が入っていました。

チャンネル数は、カラー画像であればRGB3色で3、グレースケールであれば1です。

 

ちなみに、ディレクトリ内に画像ファイル以外が含まれているとエラーが出ます。

 

解像度の取得方法

 

ここからは、コードの解説をしていきます。

 

  1. imreadで画像を読み込みます。画像データはnumpyのndarray(n次元配列)として読まれます。
  2. カラー画像の場合、`img.shape`で(横サイズ、縦サイズ、チャンネル数)が取得できます。
  3. グレー画像の場合、`img.shape`で(横サイズ、縦サイズ)を取得します。チャンネル数は1と設定します。

 

def get_resolution(filepath):

    img = cv2.imread(filepath)

    # 画像ファイルの読み込みに失敗したらエラー終了
    if img is None:
        print("Failed to load image file.")
        sys.exit(1)

    # カラーとグレースケールで場合分け
    if len(img.shape) == 3:
        height, width, channels = img.shape[:3]
    else:
        height, width = img.shape[:2]
        channels = 1
    
    return width,height,channels

 

globを使ってディレクトリ内のファイル名を全て取得

 

解像度が取得できたので、次はディレクトリ内の全ファイルパスを取得するコードを書きます。

ディレクトリの中の全ファイルパスを取得するのに、globを使っています。

主な流れは以下の通り。

  1. globで全ファイルパスを取得
  2. for文で画像一枚一枚に対して、解像度やチャンネル情報(`info`)を取得
  3. infoを辞書のキーとして、同じキーが出現したらカウントを増やす

 

def count_resol(directory):
    print(directory)
    files = glob.glob(directory)
    d={}
    for file in files:
        width,height,channels = get_resolution(file)
        info = str(width) + "," + str(height) + "," +str(channels)
        d.setdefault(info,0)
        d[info] += 1

    print(d)

 

おわり。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog