【Python】画像100枚の背景削除も一瞬!?最強AIライブラリ「rembg」で「全自動・透過ツール」を作ってみた

本ページはプロモーションが含まれています
国内のAI狂い

みんな〜!画像の「背景透過」で人生消耗してない〜!?国内のAI狂いだよ!🐍✨

YMM4の立ち絵とか、ブログのサムネ素材を作るとき、「このキャラの背景さえなければ…!」って思うこと、1日100回はあるよね?(圧)

Photoshopでチマチマ消しゴムかける?
Webの無料ツールを使って1枚ずつダウンロードする?
ノンノン!そんなのAIに全部やらせちゃえばいいの!

今回は、Pythonの最強AIライブラリ「rembg」を使って、フォルダ内の画像を「片っ端から背景透過PNGに変換する」全自動ツールを作ったから公開するよ!
技術的な解説もガッツリ入れるから、エンジニア志望の人も必見だよ!🚀

💡 百聞は一見に如かず!この精度を見て!

まずは論より証拠。このツールを使って、私のオリキャラ(ばんそうこうスライムちゃん)の画像を処理してみた結果がこれだよ!

背景ありのスライム画像 Before
背景透過済みのスライム画像 After

見てこれ!😲✨
ドット絵特有の「ギザギザした輪郭」も、ボケたり欠けたりすることなく、完璧に背景の白だけが消えてるでしょ?
これをクリック一発、しかも大量の画像を一瞬で処理できるんだから、もう手放せないよ〜!

💡 rembgライブラリが神すぎる件

今回使うのは rembg というPythonライブラリ。
ただ便利だから使うんじゃなくて、中身を知るともっと面白いよ!

🛠️ 技術解説:U^2-Netの魔法

rembgの裏側で動いているのは、「U^2-Net(ユースクエアネット)」という、背景除去に特化した深層学習モデルなんだ。
普通のAIは「ここが犬」「ここが猫」って物体を認識するけど、U^2-Netは「顕著性(Saliency)」、つまり「人間がパッと見た時に『主役』だと感じる部分」をピクセル単位で検出する能力がズバ抜けてるの!

だから、複雑な髪の毛や、今回みたいなドット絵の細かいエッジも、まるで人間が切り抜いたかのような精度で処理できるってわけ。

💡 コードのポイント解説(ここがプロの技!)

今回のツールは、ただライブラリを呼び出すだけじゃなくて、「大量の画像を安全かつ効率的に処理する」ための工夫を随所に散りばめているよ。

1. 「バイナリモード」で読み書きする理由

コードの中に open(..., "rb")"wb" って出てくるけど、これは「Read Binary」「Write Binary」の略。

# 画像データを「バイナリ(0と1の羅列)」として読み込む
with open(input_path, "rb") as f:
    input_data = f.read()

# AIが処理したデータも「バイナリ」として書き出す
with open(output_path, "wb") as f:
    f.write(output_data)

画像ファイルはテキストじゃないから、普通のモードで開くとデータが壊れちゃう。必ず「バイナリモード」で扱うのが鉄則だよ!

2. どんなOSでも動くパス結合

フォルダの区切り文字って、Windowsは \ だし、Mac/Linuxは / だよね。
これを手動で書くとエラーの元になるから、os.path.join を使ってPythonに任せるのがスマートな書き方!

# これならWindowsでもMacでも正しいパスになる!
output_path = os.path.join(save_dir, save_name)

3. 重い処理の前にユーザーを安心させる

AIモデルの読み込みには数秒(初回はダウンロードで数分)かかる。
いきなり画面が固まるとユーザーは不安になるから、print で「今から重い処理をするよ!」って教えてあげるのが、ツール開発者の優しさ(UX設計)だね💖

💡 【コピペOK】全ソースコード

使い方は簡単。
1. pip install rembg でライブラリを入れる。
2. 以下のコードをコピペして、INPUT_DIR を自分の画像フォルダに書き換える。
3. 実行するだけ!

【Python】convert_images_v2.py 全コード
#! python3.11
import os
import sys
import time

# --- 設定エリア (自分の環境に合わせて書き換えてね!) ---
INPUT_DIR = r"C:\Users\AIGURUI\pythongame\ASSET\画像\キャラ"
VALID_EXTENSIONS = (".jpg", ".jpeg", ".png", ".bmp")

def process_images():
    # ★ポイント:重い処理の前にまずメッセージを出す
    print("="*60)
    print(" 🚀 AI背景削除ツール(フォルダ指定・全自動モード)")
    print("="*60)

    # 1. 保存先のフォルダ名を入力
    folder_name = input("保存先のフォルダ名を入力してください(例: Slime): ").strip()
    
    if not folder_name:
        folder_name = "AI_Processed"

    print("\n" + "-"*60)
    print(" ⏳ AIライブラリを読み込んでいます...")
    print("    ※ 初回はAIモデル(約170MB)のダウンロードが入るため、")
    print("       数分間ここから動かなくなる場合があります。")
    print("       エラーが出ない限り、そのままお待ちください。")
    print("-"*60)

    # ★ポイント:ここで初めて重いライブラリを読み込む
    try:
        from rembg import remove
        print("\n ✅ 読み込み完了! 処理を開始します。\n")
    except ImportError:
        print("\n[エラー] rembgが見つかりません。")
        print("インストールコマンド: py -3.11 -m pip install rembg")
        input("Enterキーを押して終了...")
        return

    # 保存先作成
    save_dir = os.path.join(INPUT_DIR, folder_name)
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    # 画像リストアップ
    if not os.path.exists(INPUT_DIR):
        print(f"× 入力フォルダが見つかりません: {INPUT_DIR}")
        return

    files = sorted(os.listdir(INPUT_DIR))
    image_files = [f for f in files if f.lower().endswith(VALID_EXTENSIONS) and os.path.isfile(os.path.join(INPUT_DIR, f))]

    if not image_files:
        print("× 画像が見つかりませんでした。")
        return

    print(f"📸 {len(image_files)} 枚の画像を処理します...")

    # --- 一括処理 ---
    for i, file_name in enumerate(image_files):
        input_path = os.path.join(INPUT_DIR, file_name)
        
        # 保存名は「元のファイル名.png」
        name_without_ext = os.path.splitext(file_name)[0]
        save_name = f"{name_without_ext}.png"
        output_path = os.path.join(save_dir, save_name)

        print(f"[{i+1}/{len(image_files)}] {file_name} -> {save_name} ...", end="", flush=True)

        try:
            with open(input_path, "rb") as f:
                input_data = f.read()

            # ここでAIが魔法をかける!
            output_data = remove(input_data)

            with open(output_path, "wb") as f:
                f.write(output_data)
            
            print(" 完了!✨")

        except Exception as e:
            print(f" エラー: {e}")

    print("=" * 60)
    print("🎉 すべて完了しました!")
    print(f"保存場所: {save_dir}")
    input("Enterキーを押して終了...")

if __name__ == "__main__":
    process_images()
国内のAI狂い
💡 管理人の考察

このツールを作ってから、私の素材フォルダは「背景透過済み」の画像で埋め尽くされたよ!(笑)
U^2-Netのような高度な技術が、たった数行のコードで使えるなんて、本当にいい時代になったよね。

「画像のバイナリ操作」とか「パスの結合」みたいな基礎テクニックは、他のツール作りにも絶対役立つから、ぜひコードを読んで盗んでいってね!
みんなも自分だけの最強素材工場を作って、創作活動をブーストさせちゃおう!Pythonしか勝たん!💖

よかったらシェアしてね!
  • URLをコピーしました!
目次