AI背景透過で髪の毛・ガラスの境界を実測:透過生成と切り抜きを比較
髪の毛は透過指定で生成した1枚が最もきれいに残り、ガラスは透過生成でも切り抜きでも新しい背景になじみませんでした。GPT Image 2.5とrembgで各1回試した結果です。
目次

AIで透過PNGを作るとき、髪の毛のように細くて量の多い境界なら、最初から背景透過を指定して生成したほうが、単色背景で作ってから切り抜くよりきれいに残りました。ガラスは別の問題で、背景透過で生成すると向こう側は透けるものの曇った膜が乗り、切り抜くと撮影背景の色がガラスの中に残って「色の付いた板」になります。どちらの方法でも、新しい背景に置いて自然に見えるガラスにはなりませんでした。
以下は2026年10月19日に実際に試した結果です。被写体ごと・方法ごとに生成は1回だけなので、成功率や「必ずこうなる」という保証として読まないでください。
何を試して、何を試していないか:6枚の生成と5通りの切り抜き
試したこと
- 画像生成:GPT Image 2.5 Sunburstを、LaoZhang APIの
gpt-image-2.5-sunburst-vip経由で呼び出しました。OpenAIのAPIに直接つないだ結果ではありません。サイズ1024×1024、quality high、料金は1回$0.03の定額なので、6回で6×$0.03=$0.18です(LaoZhang APIのGPT Image 2.5ドキュメントの表示価格で計算)。 - 被写体は3つ:空のワイングラス、ふわっと広がる巻き毛の女性、タンポポの綿毛。
- 方法は2つ:
- 透過生成:
background: "transparent"とoutput_format: "png"を指定し、プロンプトにも「背景なし・市松模様なし・影なし」と書きました。 - 単色背景+切り抜き:中間グレー(#808080)の無地背景で生成し、手元のMacのCPUでオープンソースのrembg(GitHub) 2.0.85を使って切り抜きました。モデルはu2net、u2netにアルファマット処理(alpha matting)を加えたもの、BiRefNet-general-lite、rembgの既定モデルBRIA RMBG-2.0、BRIAに色のにじみ補正(decontaminate)を加えたもの、の5通りです。
- 透過生成:
- 6回の呼び出しはすべてHTTP 200で、1回36〜49秒、再試行はありません。応答にも
backgroundとoutput_formatの指定がそのまま返ってきました。 - 結果はアルファチャンネルの値を数え、黒・白・赤の背景に重ねて目で確かめました。
注記:laozhang.ai は当ブログ運営チームの自社サービスです。その料金は中立的な比較ではなく、自社の提示価格です。
試していないこと
- OpenAIのAPIへの直接接続、GPT Image 2.5 Flare、プレビュー提供のgpt-image-2、ChatGPTアプリ、Gemini(Nano Banana)、Midjourney
- 有料の背景削除サービス(remove.bg、Photoroom、Canva、Adobe Express)とPhotoshopの「選択とマスク」、rembgのほかのモデル(BiRefNet-generalの通常版、ISNet、ViTMatte)
- LaoZhang APIの編集エンドポイントによる背景除去
- 「最終的に使う背景色の上でガラスを生成する」方法(後で選び方として触れますが、未検証です)
- 同じ条件で2回以上生成すること
もう1つ前提があります。透過生成とグレー背景の生成は別々に作ったため、同じプロンプトでも人物の顔やグラスの形は違います。比べているのは「同じ指示から各方法で出てきた1枚」で、ピクセル単位で同じ被写体ではありません。
結果一覧:髪の毛・ガラス・タンポポの綿毛で何が残ったか
数値はアルファ値(0が完全に透明、255が完全に不透明、その間が半透明)です。
| 被写体 | 透過生成(GPT Image 2.5) | グレー背景+rembgで切り抜き |
|---|---|---|
| ワイングラス | 透明78.3%、半透明21.7%。ボウル部分の平均alphaは97.5で向こう側は透けるが、白っぽい曇りが乗る | どのモデルでもボウルの平均alphaが254.2〜254.9。グレーがガラスの中に残り、赤の上では灰色の板に見える |
| 髪の毛 | 透明22.3%、半透明77.7%。はね毛まで残り、黒・白・赤のどれでもハローなし。今回いちばんよい結果 | BRIAはほつれ毛が残るが細い毛にうっすらグレーのふち。u2netはぼやけたハロー、BiRefNet-liteは毛先がざらつく |
| タンポポの綿毛 | 透明37.7%、半透明62.3%。細い綿毛と茶色い中心部が残り、黒の上でわずかに白く光る | u2netは全体にグレーのハロー、BiRefNet-liteは中心に穴、BRIAは中心部をほぼ消してブロック状の穴が残る |
透過生成の3枚には共通のくせがあり、完全に不透明なピクセルが1つもありません(後述)。
ガラスが髪の毛と違う理由:半透明ピクセルの量より「中の色」が問題
髪の毛の境界で必要なのは、毛先のピクセルが「どれくらい被写体に覆われているか」を正しく見積もることです。1本の毛が1ピクセルの半分を覆っていればalphaは半分くらい、あとは毛の色だけが残れば、どの背景に重ねても自然になります。切り抜きツールが苦労するのはこの見積もりで、外すとはね毛が消えたり、撮影背景の色が毛先に混ざって白いふちやグレーのふちになったりします。
ガラスは条件がもう1つ増えます。グラスのボウル越しに見えている色は、ほとんどが向こう側の背景そのものです。正しい透過PNGにするには、ボウルを半透明にしたうえで、背景の色を抜き、ガラス自体の反射やハイライトだけを残す必要があります。
今回の結果は、この2つの条件で分かれました。
- 切り抜き:5通りすべてがボウルをほぼ不透明(平均alpha 254.2〜254.9)として扱い、グレー背景の色をガラスの一部として残しました。アルファマット処理を加えても、ボウル内で半透明になったのは0.1%だけです。赤い背景に置くと、透明なはずのグラスが灰色に塗られて見えます。
- 透過生成:ボウルの平均alphaは97.5で、ボウル内のピクセルは100%が半透明でした。255のうち約38%(97.5÷255)しか覆っていないので、向こう側はちゃんと透けます。ただしボウルには白っぽいまだらな膜も乗っていて、黒の上では曇ったにじみ、赤の上ではピンクがかった膜に見えました。縁と脚のハイライトは自然です。
つまり、透過生成は「透けるが曇る」、切り抜きは「透けずに撮影背景の色が残る」という違う失敗でした。白い背景の上で見ると、どちらも問題に気づきにくい点に注意してください。

髪の毛のはね毛:透過指定で生成した1枚がいちばん残った
髪の毛は、透過生成の1枚が今回のテストでいちばんきれいでした。画像の77.7%が半透明のピクセルで、外に向かってはねた細い毛まで残り、黒・白・赤のどの背景に重ねても白いふちやハローは出ませんでした。
グレー背景から切り抜いた場合は、モデルによって差が大きく出ました。
| rembgのモデル | 髪の毛の境界 | 1枚あたりのCPU時間 |
|---|---|---|
| u2net | ぼやけたハロー。はね毛がにじむか消え、頭の横にグレーのかたまりが残る | 0.6〜1.5秒 |
| u2net+アルファマット処理 | ほぼ同じで、境界が少し硬くなる(完全に不透明54.7%) | 1.3〜2.1秒 |
| BiRefNet-general-lite | はね毛は残るが、ざらついたブロック状の断片になる | 16〜91秒 |
| BRIA RMBG-2.0(既定) | 毛の流れは残るが、細い毛にうっすらグレーのふち | 75〜146秒 |
| BRIA+decontaminate | alphaの値はBRIAと同一。グレーのふちが目立ちにくくなる | 78〜130秒 |
CPU時間はApple siliconのMacBookで1024×1024の画像1枚にかかった時間で、GPUがあればもっと速くなります。初回はモデルのダウンロードがあり、u2netが176MB、BiRefNet-general-liteが224MB、BRIA RMBG-2.0が約1.0GBでした。
BRIAとBRIA+decontaminateのalphaが完全に同じだった点は、白いふち対策を考えるうえで役に立ちます。decontaminateは境界の色を直す処理で、どこまでを被写体とみなすかは変えません。rembgのREADMEも、マスクの「色だけでなく形がおかしい」ときはアルファマット処理(-a)を使い、こちらはdecontaminate(-dc)よりかなり遅いと説明しています。ただ今回は、u2netにアルファマット処理を加えても、髪の毛もガラスも戻りませんでした。
タンポポの綿毛のような細い境界:切り抜くとハローか穴になった
タンポポの綿毛も、透過生成のほうが残りました。細い綿毛と茶色い中心部がどちらも残り、気になったのは黒の上でわずかに白く光る程度です。
切り抜きは、モデルによって失敗の仕方が違いました。
- u2net、u2net+アルファマット処理:中心部は残るものの、綿毛全体をグレーのハローが囲む
- BiRefNet-general-lite:中心部に穴があく
- BRIA RMBG-2.0(decontaminateの有無を問わず):茶色い中心部をほとんど消してしまい、ブロック状の穴の模様が残る
髪の毛でいちばんよかったBRIAが、綿毛では中心部を消しています。1つのモデルで髪の毛がうまくいったからといって、ほかの細い被写体でもうまくいくとは限りません。
透過生成のPNGに完全に不透明なピクセルがない:alpha 254の直し方
透過生成した3枚はどれも、alphaの最大値が254でした。上位1%の境目も253で、alpha 255のピクセルは0.0%です。被写体の中心部は251〜253くらい、つまり約1%だけ背景が透けている状態です。さらに、目に見えないほど薄いalpha 1〜3のモヤが、髪の毛の画像では全体の4.4%、ガラスでは1.0%に広がっていました。
1枚をそのまま背景に重ねるだけなら、見た目の差はほとんどありません。影響が出るとすれば、「alphaが255かどうか」で不透明部分を判定するツールやチェックを通すときと、同じ素材を何枚も重ねるときです(下流のツールでの影響は今回試していないので、ここは推測です)。
対処として、alphaが250を超える部分を255に、4未満の部分を0にそろえました。髪の毛の透過生成画像でこれを実行すると、完全に不透明なピクセルが58.5%になり、モヤは0.0%、最大値は255になりました。次の節のスクリプトの--cleanがこの処理です。
納品前の確認スクリプト:黒・白・赤・グレーに重ねて見る
白い背景の上や、画像ビューアの市松模様の上では、白いふちも曇ったガラスも見落としがちです。次のスクリプトは、透明・不透明・半透明・モヤの割合とalphaの最大値を表示し、同じ画像を黒・白・赤・グレーに重ねたプレビューを書き出します。--cleanを付けると、前の節の補正をかけたコピーも保存します。
"""check_edges.py — inspect a transparent PNG/WebP before you use it.
python check_edges.py image.png # report + preview sheet
python check_edges.py image.png --clean # also write image.clean.png
Needs: pip install pillow numpy
"""
import sys
import numpy as np
from PIL import Image
path = sys.argv[1]
im = Image.open(path)
if im.mode not in ("RGBA", "LA") and "transparency" not in im.info:
sys.exit(f"{path}: mode {im.mode}, no alpha channel. Any checkerboard you see is painted pixels.")
rgba = im.convert("RGBA")
a = np.asarray(rgba)[..., 3]
total = a.size
print(f"{path}: {im.size[0]}x{im.size[1]}, mode {im.mode}")
print(f" fully transparent (alpha 0): {100 * (a == 0).sum() / total:5.1f}%")
print(f" fully opaque (alpha 255): {100 * (a == 255).sum() / total:5.1f}%")
print(f" partly transparent (1-254): {100 * ((a > 0) & (a < 255)).sum() / total:5.1f}%")
print(f" near-invisible haze (alpha 1-3): {100 * ((a > 0) & (a < 4)).sum() / total:5.1f}%")
print(f" highest alpha in the file: {a.max()}")
if a.max() < 255:
print(" note: no pixel is fully opaque; the whole subject lets a little of the background through")
# Preview: the same image on black, white, red and a mid grey
w, h = rgba.size
sheet = Image.new("RGB", (w * 4, h))
for i, color in enumerate([(0, 0, 0), (255, 255, 255), (200, 30, 40), (128, 128, 128)]):
bg = Image.new("RGBA", (w, h), color + (255,))
bg.alpha_composite(rgba)
sheet.paste(bg.convert("RGB"), (i * w, 0))
out = path.rsplit(".", 1)[0] + ".preview.png"
sheet.save(out)
print(f" preview on black / white / red / grey: {out}")
if "--clean" in sys.argv:
arr = np.asarray(rgba).copy()
alpha = arr[..., 3]
alpha[alpha < 4] = 0 # drop the invisible haze
alpha[alpha > 250] = 255 # make the solid core really solid
clean = path.rsplit(".", 1)[0] + ".clean.png"
Image.fromarray(arr, "RGBA").save(clean)
print(f" cleaned copy: {clean}")このスクリプトは、Python 3.12、Pillow 12、numpy 2.5の環境で、透過生成した髪の毛とガラスのPNG(どちらもRGBA)、グレー背景の髪の毛のPNG(RGB)の3ファイルで動かしました。RGBのファイルでは「no alpha channel」と表示して終了します。この場合、見えている市松模様は描かれた模様で、透過ではありません。
プレビューは次の順で見ると、失敗を見つけやすくなります。
- 黒の上:白いふち、ハロー、ガラスの曇り、綿毛の白い光が出る
- 赤の上:グレー背景の色残り(灰色の板になったガラス、毛先のグレーのふち)が出る
- 白の上:暗い色のふちや、切り抜きで消えた毛先がわかる
- グレーの上:撮影背景と同じ色なので、色残りは見えなくなる。ほかの3枚と比べて差がある場所が、背景色の残っている場所

highest alpha in the fileが254なら、透過生成のくせです。使い道に合わせて--cleanをかけてください。
被写体別の選び方:透過で生成するか、単色背景から切り抜くか
ここからは、上の1回ずつの結果から引き出した推測で、ベンダーが示しているルールではありません。
| 被写体 | 向いている方法(推測) | 今回の根拠 |
|---|---|---|
| 髪の毛・動物の毛を新しく作る | 最初から背景透過を指定して生成する | 透過生成の1枚がはね毛まで残し、ハローなし |
| すでにある写真の髪の毛 | BRIAやBiRefNetの系統のモデルで切り抜き、黒と色付き背景で確かめる | u2netより毛の流れが残った。ただし細い毛のふちと、ほかの被写体での穴に注意 |
| ガラス・瓶など透ける物 | 最終的に置く背景色(かそれに近い色)の上で生成・撮影するか、編集ソフトで合成する | 透過生成は曇り、切り抜きは撮影背景の色が残り、どちらも新しい背景で自然に見えなかった。背景色の上で生成する方法自体は未検証 |
| タンポポの綿毛のような細い繊維 | 最初から背景透過を指定して生成する | 透過生成は中心部も綿毛も残した。切り抜きはハローか穴 |
どの方法を選んでも、納品前に前の節のスクリプトで黒と赤の上を確かめるのが前提です。
APIで透過生成するときの指定は、OpenAIの画像プロンプトガイドと画像生成ガイドにある通り、background: "transparent"にoutput_formatの"png"か"webp"を組み合わせます。プロンプトガイドは、背景・市松模様・風景・影を書き足さないこと、描かれた市松模様は透過ではないこと、デコード後のアルファチャンネルを髪の毛・ガラス・影・物の縁まで確認することも求めています。あとで編集するときは、透過背景を保つ指示をもう一度書く必要があります。同ガイドでは、透過背景はgpt-image-2ではプレビュー扱いで、GPT Image 2.5のSunburstとFlareでは上記の指定で使えるとされています(2026年10月19日時点)。
1枚あたりの費用や接続先の選び方は「GPT Image 2.5 Sunburstの料金:公式単価と1回$0.03のAPIを比較」で扱っています。
rembgは無料で使えるが、既定モデルBRIA RMBG-2.0は商用利用に契約が必要
rembg本体はMITライセンスで、手元のPCで無料で動きます。インストールはpip install "rembg[cpu]"、コマンドラインでも使うならpip install "rembg[cpu,cli]"です。対応するPythonは3.11以上3.14未満とREADMEに書かれています。
ただし、READMEには「モデルの重みにはrembgとは別のライセンスがある」と明記されています。rembg 2.0.85の既定モデルbria-rmbgがダウンロードするBRIA RMBG-2.0は、Hugging FaceのBRIA RMBG-2.0のページでCC BY-NC 4.0の非商用ライセンスとされ、商用利用にはBRIAとの契約(購入フォームかBria API)が必要です。ECの商品画像や広告バナーのような仕事で既定モデルをそのまま使うと、この条件にかかります。
BiRefNetの重みはHugging Faceの配布ページでMITライセンスと表示されています。u2netの重みについては、商用で使う前に配布元でライセンスを確かめてください。ここでの説明は法的な助言ではありません。
今回の切り抜きはPythonから次のように呼び出しました。下は検証用スクリプトを1ファイル分に縮めたもので、この形のまま実行してはいません。
from PIL import Image
from rembg import new_session, remove
session = new_session("bria-rmbg") # 既定モデル。初回に約1.0GBをダウンロード
out = remove(Image.open("hair-grey.png"), session=session, decontaminate=True)
out.save("hair-cut.png")decontaminate=Trueを外せばBRIA単体、new_session("u2net")やnew_session("birefnet-general-lite")に替えればほかのモデルになります。
よくある質問
ChatGPTでも髪の毛やガラスを背景透過で生成できますか?
できますが、ChatGPTアプリではbackgroundのようなパラメータは選べず、透過の指定は文章で伝えるだけになります。ChatGPTアプリは今回試していません。市松模様が描かれただけの「偽の透過」の見分け方と直し方は「ChatGPT・GPT Imageの背景透過が市松模様に:見分け方と直し方」にまとめています。
髪の毛の切り抜きで白いふちが出るのはなぜですか?
毛先のピクセルに、撮影背景の色が混ざったまま残るためです。白い背景で撮った写真なら白いふち、今回のグレー背景ならグレーのふちになります。毛の量の見積もり(alpha)が合っていても色が残れば出るので、rembgではdecontaminateのような色の補正で目立ちにくくなりました。毛先そのものが消えている場合は、モデルを替えるか、新しく作るなら背景透過で生成し直すほうが近道でした。
ガラスのコップや瓶はAIで背景透過できますか?
今回の1回ずつの結果では、新しい背景に置いて自然に見えるガラスにはなりませんでした。透過生成は向こう側が透けるものの白っぽく曇り、切り抜きはガラスを不透明な物として扱って撮影背景の色を残します。最終的に置く背景色の上で生成・撮影するか、編集ソフトで反射とハイライトを合成するのが現実的です。ただし背景色の上で生成する方法は今回試していません。
無料で背景を切り抜けますか?
rembgなら手元のPCで無料で切り抜けます。ただし既定モデルのBRIA RMBG-2.0は非商用ライセンスなので、仕事で使う画像には注意が必要です。PowerPoint、プレビュー、ペイント、Canvaなど、ソフトごとの手順は「透過PNGの作り方:素材で選ぶ方法と保存後の確認」で扱っています。
透過生成したPNGの不透明な部分がわずかに透けるのはなぜですか?
今回の3枚では、alphaの最大値が254で止まり、完全に不透明なピクセルが1つもありませんでした。生成側のくせとみられ、1枚を重ねるだけなら見た目にはほぼ影響しません。完全な不透明を前提にするツールに渡すときは、確認スクリプトの--cleanで250を超える値を255にそろえてください。





