Python フォルダ内の画像に一括でモザイクを掛ける

    この記事では、

    フォルダ内の複数の画像ファイルに一括でモザイクを掛ける

    という処理をしたい場合、pythonのコードを書いて、解決する方法を解説します。

    なお、コード内に、モザイクの粗さを調整するパラメータがありますので、後述します。

    今回ご紹介するコードでは、Pillowというライブラリを使用します。PillowはPIL(Python Imaging Library)の後継ライブラリで、画像処理機能を提供します。

    Pillowライブラリは、多くの画像ファイル形式をサポートしています。モザイク処理自体は画像のピクセルを操作するものなので、Pillowが読み込みと書き出しをサポートしている形式であれば、基本的にはどんな形式の画像に対してもモザイクを掛けることが可能です。

    Pillowがサポートしている主な画像ファイル形式には以下の通りです:

    • JPEG

    • PNG

    • GIF

    • TIFF

    • BMP

    • WebP

    これらは最も一般的な形式ですが、Pillowはこれ以外にも多数のフォーマットをサポートしています。

    今回ご紹介するpythonのコードを実行する前に、PillowをPython環境にインストールする必要があります。

    python -m pip install Pillow

    を実行してください。

    今回の記事は、Windows環境でPythonのコードを実行して書いています。

    下記にご紹介するコードを

    mosaic.py

    というファイル名で保存したとすると、実行する場合は、

    c:\python>python mosaic.py

    といったかたちになります。(環境により異なります。)

    今回紹介するコードはこちらです。

    from PIL import Image
    import os
    
    def apply_mosaic(image_path, output_path, mosaic_level=7):
        print(f"Applying mosaic to: {image_path}")
        with Image.open(image_path) as img:
            # モザイク処理(画像を縮小して再拡大)
            small_img = img.resize((img.width // mosaic_level, img.height // mosaic_level), Image.BILINEAR)
            mosaic_img = small_img.resize(img.size, Image.NEAREST)
    
            # 処理後の画像を保存
            mosaic_img.save(output_path)
        print(f"Saved processed image to: {output_path}")
    
    # パスを生の文字列として指定
    input_folder = r'C:\python\image_before'
    output_folder = r'C:\python\image_after'
    
    print(f"Input folder: {input_folder}")
    print(f"Output folder: {output_folder}")
    
    # 出力フォルダがなければ作成
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
        print(f"Created output folder: {output_folder}")
    
    # 指定フォルダ内のPNG画像のリストを取得
    for file_name in os.listdir(input_folder):
        # 拡張子が大文字のPNGも小文字のpngも対応する
        if file_name.lower().endswith('.png'):
            input_path = os.path.join(input_folder, file_name)
            output_path = os.path.join(output_folder, file_name)
    
            print(f"Processing file: {file_name}")
            # モザイク処理を適用
            apply_mosaic(input_path, output_path)
        else:
            print(f"Skipped non-PNG file: {file_name}")
    
    print("Processing completed.")

    このPythonコードは、指定されたフォルダ内のPNG画像にモザイク処理を施し、別のフォルダに保存するスクリプトです。ここでは、コードの各部分を解説します。

    from PIL import Image
    import os
    • PillowImage モジュールをインポートしています。これは、画像を操作するためのライブラリです。

    • PillowはPIL(Python Imaging Library)のフォークであり、PILのAPIをベースに拡張されています。Pillowを使用する際には、コード上で from PIL import Image と記述します。これはPILを使用する際の記述方法と同じですが、Pillowがインストールされている場合、このコードはPillowの機能を利用します。

    • ソフトウェアの「フォーク」とは

      ソフトウェアの「フォーク」とは、あるソフトウェアのコードをコピーして、新しいプロジェクトを始めることを指します。元のプロジェクトのコードや機能を基にしつつ、新しい方向性や改善を加えていくことができます。これにより、異なる目的やニーズに合わせてソフトウェアを発展させることが可能になります。

      PIL、つまりPython Imaging Libraryは、Pythonで画像処理を行うためのライブラリでしたが、ある時点でその開発が止まってしまいました。しかし、多くの人々が引き続きこのライブラリを使いたいと考えていました。そこで、PILのコードを基にして、新たに改善や新機能を加えるために「フォーク」されたのがPillowです。

      Pillowは、PILの良いところを受け継ぎながら、さらに使いやすく、機能を豊富にしています。新しい画像形式のサポートやバグの修正、性能の改善などが行われており、現在でも活発に開発が続けられています。Pillowを使うことで、PILが提供していた機能を使いつつ、より現代的なニーズに応える画像処理をPythonで実現できるようになります。

    • os モジュールは、オペレーティングシステムとのやり取りを行うためのモジュールです。フォルダの作成や、ファイル・フォルダのリストアップなどに使用します。

    def apply_mosaic(image_path, output_path, mosaic_level=7):
    • この関数は、画像にモザイク効果を適用し、結果を別の場所に保存します。

    • image_path は元画像のパス、output_path は処理後の画像を保存するパスです。mosaic_level はモザイクの粗さを調整するパラメータで、デフォルト値は7です。

    with Image.open(image_path) as img:
    • 元画像を開き、img として操作します。with 文を使うことで、処理が終わったら自動的に画像ファイルを閉じます。

    small_img = img.resize((img.width // mosaic_level, img.height // mosaic_level), Image.BILINEAR)
    mosaic_img = small_img.resize(img.size, Image.NEAREST)
    • まず、画像を縮小してピクセル数を減らします。これにより、各ピクセルがモザイクの一部になります。

    • 次に、縮小した画像を元のサイズに拡大しますが、ここではピクセルを補完する代わりに、隣接するピクセルをそのまま拡大します(Image.NEAREST)。これがモザイク効果を生み出します。

    mosaic_img.save(output_path)
    • 処理後の画像を指定されたパスに保存します。

    input_folder = r'C:\python\image_before'
    output_folder = r'C:\python\image_after'
    • 元画像が保存されているフォルダと、処理後の画像を保存するフォルダのパスを指定しています。

    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    • 出力フォルダが存在しない場合、新たに作成します。

    for file_name in os.listdir(input_folder):
        if file_name.lower().endswith('.png'):
    • 指定されたフォルダ内のすべてのファイルを確認し、ファイル名が .png で終わる(大文字小文字を区別しない)場合のみ処理を行います。

    input_path = os.path.join(input_folder, file_name)
    output_path = os.path.join(output_folder, file_name)
    • 元画像と出力画像のフルパスを作成します。

    apply_mosaic(input_path, output_path)
    • 定義した apply_mosaic 関数を呼び出して、モザイク処理を適用します。

    print("Processing completed.")
    • すべてのPNG画像の処理が完了したことを示すメッセージを出力します。

    このコードによって、指定されたフォルダ内のPNG画像に対してモザイク効果を適用し、結果を別のフォルダに保存する一連の処理が自動的に行われます。

    最後まで読んで頂き、ありがとうございました。

    アンド,エー株式会社
    facebookTwitterDiscord

    and,a株式会社(and,a Inc. アンド,エー株式会社)

    〒153-0063 東京都目黒区目黒1-4-16 目黒Gビル7階

    Copyright © 2017-2024 and,a Inc. All Rights Reserved.