- 技術 💻
背景透過のやり方|サイトに上げずに画像を透明PNGにする方法と精度比較
結論
画像の背景を透過するには、背景を消したあと「透明を保てる形式(PNG か WebP)」で保存します。JPG には透明の情報が無いため、JPG のままでは透過できません。白一色の背景なら四隅からの塗りつぶし、写真ならペイント・プレビュー・PowerPoint の「背景の削除」か AI(rembg)が早く、細い毛は AI+アルファマッティングが向いています。
この記事でわかること
- Windows・Mac・iPhone・Linux それぞれのいちばん早い手順
- 自作画像で6方式を比べた一致率・時間・白いふちの実測
- JPG で保存すると黒くなる等の「症状→原因→直し方」表
背景の透過は「どの画素を透明にするか(マスク)を決める」作業と、「透明の情報を残せる形式で保存する」作業の2つに分かれます。どちらかが欠けると、消したはずの背景が白や黒で戻ってきます。
flowchart TD
Q{背景は一色?} -->|はい| F[塗りつぶし]
Q -->|写真| Q2{細い毛?}
Q2 -->|なし| A[背景の削除<br>rembg]
Q2 -->|あり| M[AI+<br>マット処理]
どの方法で背景を消しても、最後は PNG か WebP で保存します。やりたいことごとに、いちばん早い方法を先にまとめます。
| やりたいこと | いちばん早い方法 | 詳しい節 |
|---|---|---|
| Windows で画像の背景を透過 | ペイントの「背景の削除」→ PNG で保存 | Windowsで背景を透過する方法 |
| Mac で背景を透過 | プレビューの「背景を削除」→ PNG に変換 | Macで背景を透過する方法 |
| スマホ(iPhone)で背景を消す | 写真アプリで被写体を長押し → コピー・共有 | iPhone・Androidで背景を消す方法 |
| 資料に貼る画像の背景を消す | PowerPoint の「背景の削除」→ 画像として保存 | Windowsで背景を透過する方法 |
| 白い背景のロゴを透過 | 四隅から塗りつぶし(文字の穴も)+ふちの処理 | Pillowで白い背景を透過する |
| 何十枚もまとめて透過 | Python の rembg(モデルを指定) | rembg(AI)で背景を自動で消す |
| 背景透過サイトに上げてよいか | 他人の写真・社外秘は上げない。規約を読む | 背景透過サイトを使う前の注意 |
| JPG で保存したら背景が黒い・白い | JPG は透明を持てない。PNG・WebP で保存し直す | 透過できる形式・できない形式 |
| ふちに白い線が残る | ふちだけ「白との差」を不透明度にする | 白いふち・髪の毛をきれいにする |
確認環境:Ubuntu 24.04.5 LTS(2 CPU・メモリ 8GB)の上で、Python 3.13.18・Pillow 12.3.0・NumPy 2.5.3・OpenCV 5.0.0・ImageMagick 6.9.12-98 を使い、作業用フォルダーの venv に rembg 2.0.86(onnxruntime 1.29.0、モデルは u2netp と silueta)を入れて実行しました。見本画像は自分で描いた3枚(白地のロゴ 480×240、グラデーション背景のりんご風の写真 480×360、緑の背景の綿毛 360×360)で、描くときに「正解の透明マスク」も同時に作り、各方式の結果と画素単位で比べています。外部の背景透過サイトには画像を上げていません。Windows のペイント・PowerPoint、Mac のプレビュー、iPhone の写真アプリは手元で動かせないため、Microsoft サポート・Windows Insider Blog・Apple サポートの公式ページで手順を1つずつ確かめた範囲だけを書いています。rembg の既定モデルとオプションは、入れたパッケージのソースコードと公式 README で、Pillow の floodfill と OpenCV の grabCut は公式ドキュメントと組み込みの説明で確かめました。処理時間は、ほかの作業と共有しているマシンでの値です。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「背景透過のやり方|サイトに上げずに画像を透明PNGにする方法と精度比較」
背景透過とは(透明PNGとアルファチャンネルの仕組み)
この節では、「背景を透過する」とは画像の中で何が起きているのかが分かります。
背景透過とは、画像の画素ごとに「どれだけ透けるか(不透明度)」を持たせ、背景の部分を 0(完全に透明)にすることです。 この不透明度の情報をアルファチャンネルと呼びます。普通の写真は赤・緑・青の3つ(RGB)ですが、透過画像は RGB に A(アルファ)を足した4つ(RGBA)を持ちます。
1アルファは 0〜255
0 は完全に透明、255 は完全に不透明、間の値は半透明。輪郭のなめらかさは、この中間の値で表される。
2白い背景と透明は別物
白い背景は「白で塗られた画素」。濃い色のスライドや T シャツの上に置くと、白い四角が見える。
3市松模様は「透明」の目印
多くの画像ソフトは、透明の部分を灰色と白の市松模様で表示する。模様自体が画像に入っているわけではない。
手元の見本で確かめると、元の写真(PNG)はチャンネルが ('R', 'G', 'B') の3つで、背景を消したあとは ('R', 'G', 'B', 'A') の4つになり、アルファの最小値が 0・最大値が 255 になりました。
img/photo.png RGB ('R', 'G', 'B') alpha extrema None
out/photo_u2netp.png RGBA ('R', 'G', 'B', 'A') alpha extrema (0, 255)
透過画像が使われる場面
- ロゴを色の違う背景(Web サイトのヘッダー、資料の表紙)に置く
- 商品写真を白や別の背景に差し替える
- T シャツ・ステッカー・アクリルグッズの入稿(白い四角を刷らないため)
- スライドで人物や物を切り抜いて重ねる
CSS の opacity や rgba() で要素全体を半透明にするのは、画像の背景透過とは別の話です。CSS 側の透明度の書き方は、関連記事「CSSの色指定まとめ|rgb・hsl・カラーコードと透明度の書き方」で扱っています。
透過できる形式・できない形式(PNG・JPG・WebP・GIF)
この節では、背景を消した画像をどの形式で保存すれば透明が残るのかと、JPG で保存すると何が起きるのかが分かります。
透明を残せるのは PNG・WebP・GIF(GIF は「透明か不透明か」の2段階だけ)です。JPG(JPEG)にはアルファチャンネルが無く、保存した時点で透明の情報が消えます。
Pillow で RGBA の画像を JPG で保存しようとすると、次のエラーで止まりました。
OSError: cannot write mode RGBA as JPEG
エラーを避けようとして convert('RGB') で RGB にしてから JPG で保存すると、透明だった部分は黒になりました。rembg が透明にした画素の中身(RGB)が [0, 0, 0] だったためです。ImageMagick で透過 PNG を JPG に変換したときも、左上の画素は [0 0 0](黒)でした。白い背景の JPG が欲しいときは、白の画像の上に重ねてから保存します。
from PIL import Image
im = Image.open("photo_cut.png") # RGBA
white = Image.new("RGBA", im.size, (255, 255, 255, 255))
white.alpha_composite(im) # 白の上に重ねる
white.convert("RGB").save("photo_white.jpg", quality=90)
同じ切り抜き結果(480×360・rembg の出力)を形式ごとに保存した大きさは次のとおりです。
| 形式 | 大きさ(バイト) | 透明 | 向く用途 |
|---|---|---|---|
| PNG(RGBA) | 103,063 | 残る(256段階) | 受け渡し・編集の元データ |
| PNG(optimize=True) | 91,004 | 残る | 同上。画質は同じで12%小さい |
| WebP(可逆) | 75,012 | 残る | Web に載せる(画質を落とさない) |
| WebP(非可逆 q80) | 8,560 | 残る | Web に載せる(軽さ優先) |
| GIF | 16,958 | 透明か不透明かの2段階 | ふちがギザギザになりやすい |
| JPG(q85) | 9,263 | 消える | 透過には使えない |
入稿やほかの人への受け渡しは PNG、Web ページに載せるなら WebP が扱いやすいという結果です。入稿先が形式を指定している場合はそれに従います。WebP の変換と圧縮の比較は、関連記事「WebP・HEICとは|JPG・PNGへの変換と画像圧縮を実測で解説」で扱っています。ロゴのように拡大縮小が多い図形は、PNG ではなく SVG にする選択肢もあります(関連記事「SVGファイルとは|PNGとの違い・開き方・作り方を実測で解説」)。
Windowsで背景を透過する方法(ペイント・PowerPoint)
この節では、Windows に入っているペイントと、PowerPoint・Word などの Office で画像の背景を消す手順が分かります。
Windows 11 のペイントには、背景を自動で消すボタンと、透明 PNG の保存があります。 Windows Insider Blog によると、背景の削除はペイント 11.2306.30.0 から、レイヤーと透明(透明 PNG を開いて保存できる)は 11.2308.18.0 から配信されました。ボタンが見当たらないときは、Microsoft Store でペイントを更新します。
ペイントで背景を透過する
画像をペイントで開く
画像を右クリックして「プログラムから開く」からペイントを選ぶか、ペイントのキャンバスに貼り付ける。
「背景の削除」を押す
ツールバーの背景の削除のボタン(英語版の名前は Remove background)を押すと、画像全体の背景が消える。一部だけ消したいときは、先に四角形の選択で範囲を指定する(公式ブログの説明)。
残った部分を消しゴムで消す
透明に対応した版では、消しゴムで消した部分は白で塗られず、実際に透明になる(公式ブログの説明)。透明の部分は市松模様で表示される。
PNG で保存する
「名前を付けて保存」で PNG を選ぶ。JPG を選ぶと透明は残らない。
PowerPoint・Word・Excel で背景を削除する
Microsoft サポートの「Office で画像の背景を削除する」によると、Microsoft 365 のデスクトップ版(Excel・Word・Outlook・PowerPoint)、Mac 版 Microsoft 365、2024・2021 の各版で使えます。
- 背景を消したい画像を選ぶ(選べなければダブルクリックして「図の形式」タブを開く)。
- 「背景の削除」を選ぶ。消える予定の部分がマゼンタ(赤紫)で表示される。
- 残したい部分が消えていれば「保持する領域をマーク」、消したい部分が残っていれば「削除する領域をマークする」を選び、鉛筆で線を描く。
- 「変更を保持する」で確定する。
- 別のファイルにするときは、画像を右クリックして「画像として保存」を選び、PNG で保存する。
SVG・WMF などのベクター画像では「背景の削除」が灰色になり、使えません(公式の注記)。ベクター画像は、もともと背景の無い図形として扱えることが多いためです。
Macで背景を透過する方法(プレビュー・Office)
この節では、Mac に入っているプレビューで画像の背景を消す手順と、元の画像を残す方法が分かります。
Mac のプレビューには、ツールバーに「背景を削除」ボタンがあります。 Apple サポートの「Macの『プレビュー』で背景を削除する/画像を抽出する」で確かめた手順は次のとおりです。
元の画像を複製しておく
元の画像を残したいときは、先に「ファイル」>「複製」でコピーを作り、そちらを操作する。
「背景を削除」をクリック
ツールバーの「背景を削除」ボタンを押す。
PNG への変換を確かめる
書類を PNG に変換するか聞かれたら「変換」を押す(元の画像が置き換わる)。JPG のまま透明は持てないため、変換が要る。
うまくいかなければ取り消す
「編集」>「取り消す」で元に戻せる。
自動で思ったように抜けないときは、マークアップツールバーの「選択ツール」から「スマート投げなわ」を選び、残したい物の輪郭をなぞって始点に戻し、「編集」>「コピー」で別の書類に貼り付ける方法もあります(同じ公式ページ)。PDF の中の画像は、先に「ファイル」>「書き出す」で PNG などに書き出してから操作します。
Mac 版の PowerPoint・Word でも「背景の削除」が使えます(前の節の Microsoft サポートの対応表)。
iPhone・Androidで背景を消す方法(スマホ)
この節では、スマホで写真の被写体だけを切り抜く方法と、その限界が分かります。
iPhone は、写真アプリで被写体を長押しすると、背景から切り抜いてコピー・共有できます。 Apple サポートの「Create and share photo cutouts on your iPhone」によると、iOS 16 以降・iPhone XS/XR 以降で使えます。
- 写真アプリ(またはメッセージ・Safari)で写真を開く。
- 被写体を長押しする(輪郭が白く光ることがある)。
- 指を離すと出るメニューから、コピー・ステッカーの追加・共有を選ぶ。Safari では被写体をコピーする項目が出る。
- メモなどのほかのアプリに貼り付けるか、メッセージ・メール・AirDrop で送る。
公式ページには、切り抜いた被写体をほかの写真に貼り付けることはできないとも書かれています。合成したいときは、パソコンの方法(前の節や Python の節)を使います。
Android は、機種(メーカー)とアプリによって切り抜きの機能の有無と名前が違うため、この記事では手順を載せていません。端末メーカーの公式ヘルプで、機能名(「切り抜き」「被写体を抽出」など)を確かめるのが確実です。どの機種でも、ブラウザから使う背景透過サイトは動きますが、次の節の注意を先に読んでおくと安心です。
背景透過サイト(オンラインサービス)を使う前の注意
この節では、無料の背景透過サイトに画像を上げる前に確かめることが分かります。
背景透過サイトは手軽ですが、画像を相手のサーバーに送るという点が、手元のソフトとの大きな違いです。 この記事の実測は、すべて手元の Python で行い、外部のサイトには1枚も上げていません。
- 1他人が撮った写真・他人が写った写真ではないか著作権は撮った人に、写っている人には肖像権がある。切り抜いて使うこと自体に許可が要る場合がある
- 2社外秘・発売前の商品・顧客の資料ではないか社内の決まりで外部サービスへの送信が禁止されていることが多い。手元のソフトで済ませる
- 3利用規約で、上げた画像の扱いを読んだか保存期間、学習への利用、第三者への提供の有無。書かれていなければ慎重に扱う
- 4商用で使ってよいか・出力の大きさに制限が無いか無料の範囲は解像度が小さい、商用は有料、などの条件があることがある
- 5位置情報(Exif)が付いたままではないかスマホの写真には撮影場所が入っていることがある。上げる前に消すか、手元で処理する
他人の写真や社外秘の画像を透過したいとき
見分ける問い:「この画像を相手のサーバーに置いてよいと言えるか」
手元で動く AI(rembg)を使う場合も、モデルごとにライセンスが別です。rembg 本体は MIT ライセンスですが、公式 README は既定のモデル bria-rmbg について、商用利用には有償の契約が要ると書いています。ライセンスの種類と表示の仕方は、関連記事「OSSライセンスの種類一覧と違い|MIT・Apache・GPL比較表と表示文例」で扱っています。
Pythonで白い背景を透過する(Pillowの色指定と塗りつぶし)
この節では、白い背景のロゴを Pillow で透過する4つの書き方と、どれが正解のマスクに近かったかが分かります。
白い背景を「白い画素を全部透明にする」方法で消すと、ロゴの中の白(白抜きの丸や文字の穴)まで透明になります。四隅から塗りつぶす方法なら、背景につながった白だけが消えます。
見本は、紺の輪の内側に白い丸、その中にオレンジの点、横に「T161」の文字を置いたロゴです(白い丸は残したい部分)。
import numpy as np
from PIL import Image, ImageDraw
# A. 真っ白(255,255,255)の画素だけを透明にする
def key_exact(src):
px = np.array(Image.open(src).convert("RGBA"))
white = np.all(px[..., :3] == (255, 255, 255), axis=-1)
px[white, 3] = 0
return Image.fromarray(px)
# B. 白に近い(各色の差が40以内)画素を透明にする
def key_tol(src, tol=40):
px = np.array(Image.open(src).convert("RGBA")).astype(np.int16)
near = np.abs(px[..., :3] - 255).max(axis=-1) <= tol
px[near, 3] = 0
return Image.fromarray(px.astype(np.uint8))
# C. 四隅からつながっている背景だけを塗りつぶして透明にする
def key_flood(src, points=None, tol=40):
im = Image.open(src).convert("RGB")
w, h = im.size
work = im.copy()
for xy in points or [(0, 0), (w - 1, 0), (0, h - 1), (w - 1, h - 1)]:
ImageDraw.floodfill(work, xy, (255, 0, 255), thresh=tol)
bg = np.all(np.array(work) == (255, 0, 255), axis=-1)
px = np.array(im.convert("RGBA"))
px[bg, 3] = 0
return Image.fromarray(px)
key_flood("logo.png").save("logo_cut.png")
Pillow の公式ドキュメントでは、floodfill は「実験的(experimental)」と注記され、thresh は塗りつぶす色の差の上限(既定は 0)と説明されています。正解のマスクとの一致率(IoU:透明でない部分が正解とどれだけ重なるか。1 が完全一致)は次のとおりでした。
| 方法 | PNG の一致率 | JPG の一致率 | 起きたこと |
|---|---|---|---|
| A. 真っ白だけ透明 | 0.7816 | 0.6860 | 内側の白い丸も透明に。JPG は白のにじみが大量に残る |
| B. 白に近い色を透明(差40) | 0.8095 | 0.8097 | 内側の白い丸も透明に |
| C. 四隅から塗りつぶし(差40) | 0.9790 | 0.9748 | 白い丸は残る。「6」の穴だけ白が残った |
| C+「6」の穴も塗りつぶし | 0.9839 | ― | 文字の穴も透明に |
| C+穴+ふちの処理 | 0.9977 | ― | ふちの白いにじみも消えた(後の節) |
JPG の真っ白な画素は 70,105 個で、PNG(82,921 個)より 12,816 個少なくなっていました。 JPG は保存のときに色が少し揺れるため、「真っ白」だった背景の一部が (254,255,253) のような「ほぼ白」になります。塗りつぶしの許容値(差)を変えると、JPG のロゴの一致率は次のように変わりました。
| 許容値(差) | PNG の一致率 | JPG の一致率 | JPG で残った背景(画素) |
|---|---|---|---|
| 0 | 0.9179 | 0.7377 | 12,705 |
| 10 | 0.9729 | 0.9170 | 3,235 |
| 20 | 0.9751 | 0.9567 | 1,618 |
| 40 | 0.9839 | 0.9795 | 749 |
| 80 | 0.9876 | 0.9876 | 447 |
JPG の元画像は許容値を 20〜40 以上にすると PNG と同じくらいになりました。許容値を上げすぎると、被写体の中の白に近い色まで背景とつながって消えるので、背景と被写体の色の差を見て決めます。可能なら、元データ(PNG や作成元のファイル)から透過するのがいちばん確実です。
ImageMagick(コマンド)で同じことをする
# 白(に近い色)を全部透明にする … 内側の白も消える
convert logo.png -fuzz 15% -transparent white logo_t.png
# 左上(0,0)からつながる部分だけ透明にする … 内側の白は残る
convert logo.png -alpha set -fuzz 15% -fill none -draw "color 0,0 floodfill" logo_f.png
一致率は前者が 0.8097、後者が 0.9846 で、Pillow と同じ傾向でした。Pillow でのリサイズや形式変換は、関連記事「Python Pillowで画像処理|リサイズ・トリミング・形式変換のコード集」で扱っています。
OpenCVのGrabCutで写真の背景を透過する
この節では、背景が一色ではない写真を、OpenCV の GrabCut で切り抜く方法と、影まで残る問題の直し方が分かります。
背景がグラデーションや模様の写真では、塗りつぶしは使えません。 りんご風の見本(背景がグラデーションで、右側に被写体と近い赤い帯がある)を四隅から塗りつぶすと、一致率は 0.3601 で、背景の大部分が残りました。
GrabCut は「この四角の外は背景」と教えると、色の分布から前景と背景を分ける OpenCV の関数です。
import cv2
import numpy as np
img = cv2.imread("photo.png")
mask = np.zeros(img.shape[:2], np.uint8)
bgd = np.zeros((1, 65), np.float64)
fgd = np.zeros((1, 65), np.float64)
rect = (100, 40, 260, 280) # 被写体を囲む四角(x, y, 幅, 高さ)
cv2.grabCut(img, mask, rect, bgd, fgd, 5, cv2.GC_INIT_WITH_RECT)
# 2回目:影の帯を「背景」と教えてやり直す
mask[292:320, 120:380] = cv2.GC_BGD
cv2.grabCut(img, mask, None, bgd, fgd, 3, cv2.GC_INIT_WITH_MASK)
alpha = np.where((mask == cv2.GC_FGD) | (mask == cv2.GC_PR_FGD), 255, 0).astype(np.uint8)
rgba = np.dstack([cv2.cvtColor(img, cv2.COLOR_BGR2RGB), alpha])
cv2.imwrite("photo_cut.png", cv2.cvtColor(rgba, cv2.COLOR_RGBA2BGRA))
| やり方 | 一致率 | 時間 | 起きたこと |
|---|---|---|---|
| 四隅から塗りつぶし | 0.3601 | 0.12秒 | グラデーションの途中で止まり、背景が残る |
| GrabCut(四角だけ) | 0.8792 | 0.41秒 | りんごの下の影まで「前景」に入った |
| GrabCut(影を背景と指定) | 0.9850 | +0.17秒 | 影が消え、りんごと葉と茎だけが残った |
| GrabCut(JPG の元画像・四角だけ) | 0.8999 | 0.57秒 | PNG と同じく影が残る |
GrabCut の結果は「透明か不透明か」の2値なので、ふちがギザギザになります。 3×3 のぼかしをかけると中間の値を持つ画素が 2,453 個できましたが、一致率はほぼ変わりませんでした(0.8791)。見た目のなめらかさを足す処理であって、切り抜きの精度を上げる処理ではありません。
rembg(AI)で背景を自動で消す
この節では、Python の rembg で写真の背景を自動で消す方法と、入れるときの注意(既定のモデルの大きさとライセンス、コマンドの依存)が分かります。
rembg は、学習済みの AI モデル(U²-Net など)で前景を推定して背景を消す Python のライブラリです。範囲の指定が要らず、見本の写真では一致率 0.9921 と、いちばん正解に近くなりました。
python3 -m venv .venv
. .venv/bin/activate
pip install "rembg[cpu]" # コマンドも使うなら "rembg[cpu,cli]"
export U2NET_HOME="$PWD/models" # モデルの保存場所(既定はホームの下)
from PIL import Image
from rembg import new_session, remove
session = new_session("u2netp") # モデルを必ず指定する(理由は下)
im = Image.open("photo.png")
out = remove(im, session=session) # RGBA が返る
out.save("photo_cut.png")
モデルを指定しないと 1GB の既定モデルが落ちてくる
入れた rembg 2.0.86 のソースコードでは、new_session() とコマンド rembg i の既定のモデルが次のように bria-rmbg になっていました。
session_factory.py:11: model_name: str = "bria-rmbg",
commands/i_command.py:20: default="bria-rmbg",
公式 README によると bria-rmbg は約 1.02GB で、商用利用には有償の契約が要るとされています。今回は、軽い u2netp(4.57MB)と silueta(44.2MB)を指定して比べました。モデルは最初の1回だけダウンロードされ、U2NET_HOME の下に保存されます(README では REMBG_HOME が新しい名前で、U2NET_HOME が設定されていればそちらが優先)。
時間は 480×360 の画像1枚を、ほかの作業と共有している 2 CPU のマシンで処理し、1回目(温め)を除いた値です。venv は既にあった onnxruntime・SciPy・scikit-image・OpenCV を共有する設定で作ったため、それらの分は含みません。
コマンド(rembg i)が動かなかったときの原文
pip install rembg だけで入れた状態でコマンドを動かすと、次のエラーで止まりました。コマンド用の依存が入っていないためです。
File "/dev/shm/t161/venv/lib/python3.13/site-packages/rembg/commands/p_command.py", line 8, in <module>
import filetype
ModuleNotFoundError: No module named 'filetype'
filetype だけ足すと、次は ModuleNotFoundError: No module named 'aiohttp' で止まりました。コマンドの読み込み時に、HTTP サーバー(rembg s)の部品まで読み込むためです。コマンドを使うなら、公式 README のとおり pip install "rembg[cpu,cli]" で入れます。 この記事では容量の都合でコマンド用の依存は入れず、Python から呼び出しています。README に載っているコマンドの例は次のとおりです。
rembg i -m u2netp input.png output.png # 1枚
rembg p -m u2netp input_dir output_dir # フォルダーをまとめて
rembg は、見本の写真の影を背景として消しました(GrabCut は影を残した)。境界には中間の値を持つ画素が 42,818 個あり、ふちがなめらかでした。
6つの方法を同じ画像で比べた結果(判断表)
この節では、ここまでの方法を同じ見本で比べた一致率・時間と、画像の種類ごとにどれを選べばよいかが分かります。
| 方法 | ロゴ(白地) | 写真(グラデーション) | 綿毛(細い線) | 1枚の時間 |
|---|---|---|---|---|
| 真っ白だけ透明 | 0.7816 | ― | ― | 0.01秒 |
| 四隅から塗りつぶし+ふち | 0.9977 | 0.3601 | ― | 0.1〜0.2秒 |
| GrabCut(影を指定) | ― | 0.9850 | 0.3056 | 0.4〜3.0秒 |
| rembg u2netp | ― | 0.9921 | 0.4806 | 0.5秒 |
| rembg silueta+マッティング | ― | 0.9892(なし) | 0.8017 | 1.5〜2.8秒 |
1ロゴは塗りつぶしが最速で正確
AI を使うまでもなく、0.2秒で 0.99 を超えた。白い部分が被写体の中にあっても残る。
2写真は AI が手間なし
範囲の指定なしで 0.99。GrabCut も影を教えれば 0.985 まで届くが、1枚ずつ指定が要る。
3細い毛はどれも苦手
GrabCut は線の間の背景ごと残し 0.31。AI でもマッティングを足して 0.80 だった。
結果から、画像の種類ごとに次の順で選ぶと、手間と仕上がりのつり合いがとれます。
- 1背景がほぼ一色(ロゴ・イラスト・スキャン) → 塗りつぶしペイントの塗りつぶし・Pillow の floodfill。文字の穴も塗る
- 2写真を1〜数枚 → OS の「背景の削除」ペイント・プレビュー・PowerPoint・iPhone の写真アプリ
- 3写真を何十枚も → rembg(モデルを指定)u2netp なら 1枚 0.5秒。ライセンスはモデルごとに確かめる
- 4自動で影や背景が残る → 範囲を教えてやり直すPowerPoint のマーク・GrabCut の背景指定
- 5髪・毛・綿毛 → AI+アルファマッティングそれでも残るなら、撮影時に背景を無地にする
白いふち・髪の毛をきれいにする(フリンジとアルファマッティング)
この節では、透過した画像を濃い色の上に置いたときに出る白いふちの原因と消し方、細い毛を残す方法が分かります。
白い背景から切り抜いた画像のふちには、背景の白と被写体の色が混ざった画素が残ります。これを不透明のまま残すと、濃い背景の上で白い線(フリンジ)に見えます。
黒の上に重ねたとき、正解の境界から2画素以内で明るく浮いた画素を数えると、次のとおりでした(ロゴの境界の帯は 14,092 画素、写真は 4,876 画素)。
| 結果 | 白く浮いた画素 | 理由 |
|---|---|---|
| ロゴ・白に近い色を透明(差40) | 489 | 差40を超える「薄い紺」が不透明で残る |
| ロゴ・四隅から塗りつぶし | 828 | 同上。塗りつぶしは2値なので、ふちが全部残る |
| ロゴ・白との差を不透明度に | 0 | ふちが半透明になり、色も白から戻した |
| 写真・GrabCut | 74 | 2値のマスクで背景の明るい色を拾った |
| 写真・rembg u2netp | 4 | ふちが半透明になる |
| 写真・rembg silueta | 0 | 同上 |
ふちだけ「白との差」を不透明度にする
白い背景のロゴなら、塗りつぶしで背景を決めたあと、境界の2画素の帯だけ「白からどれだけ離れているか」を不透明度にし、色を白から引き戻します。これで、一致率は 0.9839 から 0.9977 に上がりました。
import cv2
import numpy as np
# bg: 塗りつぶしで背景と判定した画素(True/False)。rgb: 0〜1 の元画像
band = cv2.dilate(bg.astype(np.uint8), np.ones((5, 5), np.uint8)).astype(bool) & ~bg
alpha = np.where(bg, 0.0, 1.0)
a = (1 - rgb).max(axis=-1) # 白からいちばん離れた色の成分
alpha[band] = a[band]
safe = np.where(alpha > 0, alpha, 1)
rgb[band] = np.clip((rgb[band] - (1 - alpha[band])[:, None]) / safe[band][:, None], 0, 1)
ペイントやプレビューで切り抜いた画像に白いふちが出るときは、消しゴムでふちを1〜2画素削るか、上で作った白の背景(入稿先の色)に合わせて書き出す方法が手軽です。
細い毛・綿毛はアルファマッティングを足す
綿毛の見本(140本の細い線)では、どの方法も背景の緑が線の間に残りました。rembg の alpha_matting=True は、AI が出したマスクの境界をもう一度細かく推定し直すオプションです。
out = remove(im, session=new_session("silueta"),
alpha_matting=True,
alpha_matting_foreground_threshold=240,
alpha_matting_background_threshold=10,
alpha_matting_erode_size=10)
| 方法 | 一致率 | 正解との差(平均) | 時間 |
|---|---|---|---|
| GrabCut | 0.3056 | 0.2388 | 3.00秒 |
| rembg u2netp | 0.4806 | 0.1138 | 0.44秒 |
| rembg u2netp+マッティング | 0.6099 | 0.0777 | 1.67秒 |
| rembg silueta | 0.5185 | 0.0943 | 1.53秒 |
| rembg silueta+マッティング | 0.8017 | 0.0312 | 2.82秒 |
マッティングで一致率は大きく上がりますが、1枚あたり 1.2〜1.3秒増えました。 写真を撮れるなら、背景を無地で被写体と違う色にしておくと、どの方法でもきれいに抜けます。
背景が透過できたかの確かめ方
この節では、保存した画像に本当に透明が入っているかを、画面とコマンドで確かめる方法が分かります。
濃い色の上に置く
スライドや画像ソフトで、黒や濃い色の背景の上に置く。白い四角や白いふちが見えたら透過できていない。
いちばん確実
形式を見る
拡張子が .jpg なら透明は入っていない。.png・.webp でも中身が RGB なら透明は無い。
拡張子だけで判断しない
コマンドで見る
file で RGBA か、identify で srgba か opaque=false かを見る。
Linux・Mac・Git Bash
Python で見る
Pillow で mode が RGBA か、アルファの最小値が 0 かを見る。
まとめて確かめる
$ file im_flood.png logo.jpg
im_flood.png: PNG image data, 480 x 240, 8-bit/color RGBA, non-interlaced
logo.jpg: JPEG image data, JFIF standard 1.01, ... 480x240, components 3
$ identify -format '%f %[channels] opaque=%[opaque]\n' logo.png im_flood.png
logo.png srgb opaque=true
im_flood.png srgba opaque=false
from PIL import Image
im = Image.open("photo_cut.png")
print(im.mode, im.getbands()) # RGBA ('R', 'G', 'B', 'A')
print(im.getchannel("A").getextrema()) # (0, 255) なら透明な画素がある
getextrema() が (255, 255) なら、形式は RGBA でも透明な画素は1つもありません。opaque=true も同じ意味です。
うまくいかないとき(症状→原因→直し方)
この節では、背景透過でよくあるつまずきを、症状から原因と直し方へたどれます。
| 症状(原文) | 原因 | 直し方 |
|---|---|---|
| 保存したら透明だった所が黒い | JPG で保存した(透明の画素の中身が黒だった) | PNG・WebP で保存し直す。白にしたいなら白の上に重ねてから JPG |
| 保存したら背景が白に戻った | JPG で保存した、または白の背景のまま書き出した | 形式を PNG にする。ペイントは透明対応の版に更新 |
OSError: cannot write mode RGBA as JPEG |
Pillow で RGBA を JPG に保存しようとした | 拡張子を .png にする。JPG が要るなら背景色に合成してから RGB に |
| ロゴの中の白まで透明になった | 「白い画素を全部透明」にした | 四隅からの塗りつぶしに変える。文字の穴は個別に塗る |
| JPG のロゴで背景に白い点が残る | JPG の圧縮で白が「ほぼ白」に揺れた | 許容値を 20〜40 に上げる。元の PNG から作り直す |
| 濃い背景に置くとふちが白い | 境界の混ざった画素が不透明のまま | ふちを半透明にする(前の節)、AI の結果を使う |
| 被写体の下の影まで残る | 影も「前景」と判定された(GrabCut) | 影の部分を背景として指定し直す。PowerPoint は「削除する領域をマークする」 |
| ペイントに背景の削除が無い | ペイントの版が前のまま | Microsoft Store でペイントを更新(11.2306.30.0 以降) |
| PowerPoint の「背景の削除」が灰色 | SVG・WMF などのベクター画像を選んでいる | ベクターは背景の削除の対象外。PNG にしてから行う |
ModuleNotFoundError: No module named 'filetype' |
rembg をコマンド用の依存なしで入れた | pip install "rembg[cpu,cli]" で入れ直す |
| rembg の初回に大きなダウンロードが始まった | モデルを指定せず、既定の bria-rmbg(約1GB)を使った | new_session("u2netp") や -m u2netp でモデルを指定 |
| 髪の毛の間に背景が残る | マスクが2値に近く、細い部分を表せない | alpha_matting=True を足す。撮影時に背景を無地にする |
- 「透過したのに貼ると白い」ときは、まず形式を確かめます。 透過の処理ではなく、保存の形式で失敗していることがいちばん多いためです。
- Web ページに載せた透過画像が白く見えるときは、CSS で画像や親の要素に背景色が付いていないかも見ます。
よくある質問
Q. 画像の背景を透過するいちばん簡単な方法は? A. Windows ならペイントの「背景の削除」、Mac ならプレビューの「背景を削除」、iPhone なら写真アプリで被写体を長押しする方法です。どれも PNG で保存すると透明が残ります。
Q. JPG の画像の背景を透過できますか? A. JPG の形式のままでは透過できません。JPG にはアルファチャンネルが無いためです。背景を消したあと、PNG か WebP で保存します。元が JPG でも、PNG で保存し直せば透過画像になります。
Q. 無料の背景透過サイトを使っても問題はありませんか? A. 自分で撮った写真・自分で作った画像なら、規約を読んだうえで使えます。他人の写真や社外秘の画像は、権利や社内の決まりの問題があるため、手元のソフト(ペイント・プレビュー・PowerPoint・Python)で処理するほうが安全です。
Q. 背景透過した画像が白い背景になってしまうのはなぜですか? A. JPG で保存したか、透明に対応していない表示の上で見ているためです。濃い色の上に置いて確かめ、白い四角が見えるなら PNG で保存し直します。
Q. PNG なら必ず透過していますか?
A. いいえ。PNG でも RGB(アルファ無し)で保存されていることがあります。file の結果が RGBA か、Pillow でアルファの最小値が 0 かで確かめます。
Q. Python で背景を透過するにはどのライブラリを使いますか? A. 白一色の背景なら Pillow(塗りつぶし)、範囲を指定して写真を切り抜くなら OpenCV の GrabCut、自動で写真の背景を消すなら rembg です。手元の比較では、写真は rembg(0.9921)、ロゴは Pillow の塗りつぶし(0.9977)がいちばん正解に近くなりました。
Q. rembg は商用で使えますか? A. rembg 本体は MIT ライセンスですが、モデルの重みはそれぞれ別のライセンスです。公式 README は既定の bria-rmbg について、商用利用には有償の契約が要ると書いています。使うモデルの配布元のライセンスを確かめます。
Q. 髪の毛をきれいに切り抜くには?
A. AI で切り抜いたあと、アルファマッティング(rembg の alpha_matting=True)を足すと改善します。手元の綿毛の見本では一致率が 0.5185 から 0.8017 に上がりました。撮影できるなら、背景を無地にするのが最も効果があります。
Q. 透過 PNG と WebP はどちらを使えばよいですか? A. ほかの人に渡す・入稿するなら PNG、Web ページに載せるなら WebP が向いています。手元の見本では、可逆の WebP は PNG の約73%、非可逆(q80)は約8%の大きさになりました。
Q. スマホで切り抜いた画像を別の写真に合成できますか? A. Apple サポートによると、iPhone で切り抜いた被写体は、ほかの写真に貼り付けることはできません。メモなどほかのアプリへの貼り付けや共有はできます。合成はパソコンの画像ソフトや PowerPoint で行います。
まとめ
- 背景透過は「マスクを決める」と「透明を残せる形式で保存する」の2つ。JPG は透明を持てず、保存すると黒や白に戻る。
- 白一色の背景は、四隅からの塗りつぶし+ふちの処理で一致率 0.9977。「白を全部透明」は中の白まで消える(0.7816)。
- 写真は OS の「背景の削除」か rembg。rembg u2netp は範囲の指定なしで 0.9921・1枚 0.5秒。モデルは必ず指定する(既定は約1GB)。
- 影が残る・ふちが白いときは、範囲を教え直すか、ふちを半透明にする。細い毛はアルファマッティングで 0.52 → 0.80。
- 背景透過サイトに上げる前に、権利・社外秘・規約を確かめる。他人の写真や預かった画像は手元のソフトで処理する。
参考・出典
確認日はいずれも 2026年10月29日です。
- Microsoft サポート「Office で画像の背景を削除する」:https://support.microsoft.com/ja-jp/office/図の背景を削除する-c0819a62-6844-4190-8d67-6fb1713a12bf
- Windows Insider Blog「Background removal in Paint begins rolling out to Windows Insiders」(2023年9月7日):https://blogs.windows.com/windows-insider/2023/09/07/background-removal-in-paint-begins-rolling-out-to-windows-insiders/
- Windows Insider Blog「Paint app update adding support for layers and transparency begins rolling out to Windows Insiders」(2023年9月18日):https://blogs.windows.com/windows-insider/2023/09/18/paint-app-update-adding-support-for-layers-and-transparency-begins-rolling-out-to-windows-insiders/
- Apple サポート「Macの『プレビュー』で背景を削除する/画像を抽出する」:https://support.apple.com/ja-jp/guide/preview/prvw15636/mac
- Apple サポート「Create and share photo cutouts on your iPhone」:https://support.apple.com/en-ae/102460
- rembg(GitHub・README):https://github.com/danielgatis/rembg
- Pillow ドキュメント「ImageDraw module」(floodfill):https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html
- OpenCV ドキュメント(cv2.grabCut の関数リファレンス。OpenCV 5.0.0 の組み込みの説明でも確認):https://docs.opencv.org/
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「背景透過のやり方|サイトに上げずに画像を透明PNGにする方法と精度比較」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。