Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python(Pillow)で画像サイズに基づいて画像をフィルタリング・リサイズする方法

Pythonには、Pillow、Python Imaging Library(PIL)、scikit-image、OpenCVなど、画像処理に使えるライブラリが多数用意されています。

本記事では、その中でもPillowを使用します。Pillowは画像の操作に関する標準的な手順を数多く提供しており、JPEG、PNG、GIF、TIFF、BMPなど、幅広い画像ファイル形式に対応しているためです。

なお、PillowはPython Imaging Library(PIL)をベースに構築されたライブラリであり、元となったPILよりも多くの機能を備えています。

Pillowのインストール

Pillowはpipを使って簡単にインストールできます。コマンドターミナルで以下のコマンドを実行してください。

$ pip install pillow

Pillowの基本操作

まずは、Pillowライブラリを使った画像の基本的な操作方法を見ていきましょう。

from PIL import Image

image = Image.open(r"C:\Users\rajesh\Desktop\imagefolder\beach-parga.jpg")
image.show()

# ソースファイルのファイル形式
# 出力: JPEG
print(image.format)

# 画像で使用されているピクセル形式。一般的な値は "1", "L", "RGB", "CMYK" など
# 出力: RGB
print(image.mode)

# 画像のサイズ(ピクセル単位)。(幅, 高さ) の2要素タプルで返される
# 出力: (2048, 1365)
print(image.size)

# カラーパレットテーブル(存在する場合)
# 出力: None
print(image.palette)

実行結果

Python(Pillow)で画像サイズに基づいて画像をフィルタリング・リサイズする方法

JPEG
RGB
(2048, 1365)
None

このように、Image.open()で開いた画像オブジェクトからは、形式(format)、モード(mode)、サイズ(size)、パレット(palette)といった基本情報を簡単に取得できます。

画像サイズに基づいて画像をフィルタリングする

次に、指定したパス(デフォルトはカレントワーキングディレクトリ)内のすべての画像のサイズを縮小するプログラムを紹介します。以下のコードでは、max_height(最大高さ)、max_width(最大幅)、対象となる画像の拡張子(extensions)を自由に変更できます。

コード例

import os
from PIL import Image

max_height = 900
max_width = 900
extensions = ['JPG']

path = os.path.abspath(".")

def adjusted_size(width, height):
   if width > max_width or height > max_height:
      if width > height:
         return max_width, int(max_width * height / width)
      else:
         return int(max_height * width / height), max_height
   else:
      return width, height

if __name__ == "__main__":
   for img in os.listdir(path):
      if os.path.isfile(os.path.join(path, img)):
         img_text, img_ext = os.path.splitext(img)
         img_ext = img_ext[1:].upper()
         if img_ext in extensions:
            print(img)
            image = Image.open(os.path.join(path, img))
            width, height = image.size
            image = image.resize(adjusted_size(width, height))
            image.save(os.path.join(path, img))

実行結果

another_Bike.jpg
clock.JPG
myBike.jpg
Top-bike-wallpaper.jpg

コードの解説

このスクリプトの動作を簡単に説明します。

1. 設定値の定義: max_heightmax_widthに900を設定し、処理対象の拡張子として「JPG」を指定しています。

2. サイズ調整関数: adjusted_size()関数は、画像が最大サイズを超えている場合にアスペクト比(縦横比)を維持したまま縮小後のサイズを計算します。横長の画像は幅を基準に、縦長の画像は高さを基準にリサイズされます。すでに上限以内の画像はそのまま返されます。

3. メイン処理: os.listdir()でディレクトリ内のファイルを走査し、拡張子が指定リストに含まれる画像のみを処理対象としています。該当する画像は開いてリサイズされ、元のファイル名のまま上書き保存されます。

このスクリプトを実行すると、カレントワーキングディレクトリ(ここではPythonスクリプトが置かれているフォルダ)内の対象画像すべてが、幅・高さともに最大900ピクセル以内のサイズに収まるようにリサイズされます。

まとめ

Pillowを使えば、わずか数十行のコードで特定のフォルダ内の画像を一括してフィルタリングし、指定した最大サイズにリサイズできます。extensionsリストに「PNG」「JPEG」などを追加すれば、他の形式の画像にも同じ処理を適用可能です。大量の画像を扱うWebサイトやアプリケーションの開発において、このような自動リサイズ処理は非常に便利なテクニックです。

  1. Pythonでフォトモザイクを実装する方法をわかりやすく解説

    フォトモザイク(Photomosaic)とは、1枚の画像を正方形のグリッドに分割し、その各マスを別の画像や色のブロックに置き換える技法です。離れた場所から見ると元の画像がはっきりと見えますが、近づいて観察すると、さまざまな色の小さなブロックが集まって構成されていることが分かります。この記事では、Pythonの「photomosaic」というモジュールを使って、簡単にフォトモザイク画像を作成する方法をご紹介します。photomosaicモジュールのインストールまずは以下のコマンドでphotomosaicモジュールをインストールします。依存関係としてscikit-learnモジュールも同時にダウン

  2. 【Python×OpenCV】画像の収縮(エロージョン)と膨張(ダイレーション)の基本を解説

    本記事では、PythonのOpenCVモジュールを使って、エロージョン(収縮)やダイレーション(膨張)といったモルフォロジー演算(形態学的処理)を実行する方法を解説します。 OpenCVはコンピュータビジョン向けに設計されたオープンソースのライブラリで、もともとはIntelによって開発されました。BSDライセンスのもとで誰でも無料で利用できます。 OpenCVの機能を使うには、まずpipでインストールしておきましょう。 sudo pip3 install opencv-python エロージョン(収縮)とは?仕組みを解説 エロージョンは、前景オブジェクトの境界を削り取っていく処理です。画像内の