みんな〜!画像の「背景透過」で人生消耗してない〜!?国内のAI狂いだよ!🐍✨
YMM4の立ち絵とか、ブログのサムネ素材を作るとき、「このキャラの背景さえなければ…!」って思うこと、1日100回はあるよね?(圧)
Photoshopでチマチマ消しゴムかける?
Webの無料ツールを使って1枚ずつダウンロードする?
ノンノン!そんなのAIに全部やらせちゃえばいいの!
今回は、Pythonの最強AIライブラリ「rembg」を使って、フォルダ内の画像を「片っ端から背景透過PNGに変換する」全自動ツールを作ったから公開するよ!
技術的な解説もガッツリ入れるから、エンジニア志望の人も必見だよ!🚀
💡 百聞は一見に如かず!この精度を見て!
まずは論より証拠。このツールを使って、私のオリキャラ(ばんそうこうスライムちゃん)の画像を処理してみた結果がこれだよ!
Before
After
見てこれ!😲✨
ドット絵特有の「ギザギザした輪郭」も、ボケたり欠けたりすることなく、完璧に背景の白だけが消えてるでしょ?
これをクリック一発、しかも大量の画像を一瞬で処理できるんだから、もう手放せないよ〜!
💡 rembgライブラリが神すぎる件
今回使うのは rembg というPythonライブラリ。
ただ便利だから使うんじゃなくて、中身を知るともっと面白いよ!
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()
このツールを作ってから、私の素材フォルダは「背景透過済み」の画像で埋め尽くされたよ!(笑)
U^2-Netのような高度な技術が、たった数行のコードで使えるなんて、本当にいい時代になったよね。
「画像のバイナリ操作」とか「パスの結合」みたいな基礎テクニックは、他のツール作りにも絶対役立つから、ぜひコードを読んで盗んでいってね!
みんなも自分だけの最強素材工場を作って、創作活動をブーストさせちゃおう!Pythonしか勝たん!💖





