AI画像透かし除去 · ピクセルレベル検証版
AI生成画像(豆包/即夢/Kolorsなど)の隅にある「XXAI生成」の白/半透明の透かしマークを除去します。セールスポイント:ピクセルレベル検証で自己欺瞞せず、二重信号交差定位で幻覚を抑制し、複数候補の客観指標投票でカバー——他は「AIで画像修復して目視で良しと言うだけ」ですが、これは計算に基づいています。
適用シーン
- AI生成画像の隅にある「XXAI生成」の白文字/半透明透かし(豆包/即夢/Kolorsなど)
- 透かしが比較的均一な背景(平坦な色の領域/空/海水/グラデーション)に重なっている場合
- 透かしが画像の隅にあり、被写体上にはない場合
完全なパイプライン(連鎖によるエラー相関性の低減)
透かし除去は4段階の連鎖です:位置特定 → 背景サンプリング → カバーリング → 検証。各段階は独立しており、それぞれが少しずつエラーを起こしますが、複数段階を経ることで正確性が指数関数的に低下するのを防ぎます。同系統の方法は一緒に同じ穴に落ちます。完全版=重要ノードに個別チェック + 異なる原理の信号交差 + 複数候補の投票。
① 位置特定(二重信号交差、異なる原理必須)
- 信号A グリッド拡大法:候補領域を拡大し、10x10の赤いグリッドを描画(x0-x9/y0-y9とラベル付け)、視覚モデルに「透かしは x何-x何、y何-y何にある」とだけ報告させます——グリッド範囲のみ信頼し、その割合やピクセル記述は信じず、元画像座標に変換後にピクセル単位で精密スキャンします。
- 信号B ピクセル密度クラスタリング:視覚モデルに依存したピクセル分析を行いません。白/半透明色(r>180,g>180,b>180、半透明は140-150に低下)を行ごとに合算して文字の密集行を見つけ、連続する白ピクセルが3以上ある列で文字のx範囲を見つけます。
- A、B両方で位置が特定された場合のみ透かし領域を確定;AのみまたはBのみの場合は再評価し、カバーリングに急がない(異なる原理の交差により、同じ視覚モデルが一緒に間違えるのを防ぐ)。
- 透かしは隅にある可能性があります(例:青色の海水域)。被写体ではないため、まず画像全体を白/半透明ピクセルの密集クラスターでスキャンしてから座標を決定します。
② カバーリング(複数候補の投票、感情で決めない)
複数の候補を生成し、客観指標で投票して最適なものを選択:
- 候補1:透かしの真上(または左)の同じ幅の背景ストリップを垂直に引き伸ばして透かし領域に適用(LANCZOS)——複雑な背景で最も自然
- 候補2:左/周囲の平均色で塗りつぶし + マスクでガウシアンぼかしエッジ(GaussianBlur 2px)——均一な背景
- 候補3:多方向補間
- 投票指標:領域のテクスチャ連続性(エッジ勾配)+ 色統計分散 + 周囲ピクセルとのユークリッド距離。指標が最良のものが勝ち、「自分がどれが良いと思うか」に依存しません。
- カバーリング領域には6〜8pxのパディングを追加し、文字のエッジ残りを防ぎます。
③ 検証(ピクセルレベル裁定、視覚誤報を隔離)
- ピクセルレベルのground truthを
scripts/verify_watermark_removed.pyで実行:元画像 vs 処理画像のターゲット領域における白ピクセル数を比較。元画像856 → 処理画像2 = 除去成功✅ - 視覚モデルは裁定に関与せず、粗い位置特定のみ報告。視覚モデルの「まだ透かしがある」という誤報(複雑な背景の白い毛/水しぶき/炎の明るい部分など)は、ピクセル差分によってノードの外に隔離され、進行を遅らせません。
- 残留判定:ターゲット領域の処理画像の白ピクセルが元画像の5%未満であれば除去完了と見なします。
パイプライン全体(分散システムとして管理)
- 各段階の入出力は固定:bbox辞書 / 候補リスト / 指標、個別にテストして復元可能。
- エンドツーエンドで見て:成功率(ピクセル達成率)+ コスト(ラウンド数)+ デバッグ容易性、単一段階のベースラインと比較——利益から税金を差し引いてもプラスであれば、実際にデプロイします。
重要な落とし穴(実戦で踏んだもの)
- 視覚モデルが「まだ透かしがある」と幻覚を見る:複雑な背景(白い毛/水しぶき/炎の明るい部分)で、ピクセルレベルで除去済みと証明されていても「右下に豆包AI生成がある」と繰り返し誤報告します。ピクセル差分が裁定者——数値が基準に達したら、視覚モデルに引っ張られて再処理してはいけません。
- 視覚モデルが「右下」と言った場合、画像全体の右下1/4領域を指す可能性があり、正確な座標はピクセル分析(行/列の白色密度クラスタリング)に頼る必要があります。
- 画像自体の明るい色(虎の白い毛/滝の白い波)が白色検出を妨害する可能性があります——「元画像が白く、処理画像も白い」状態が画像全体に広がっている場合、それは透かしではなく画像の内容です。
- 背景が複雑な場合、上部の背景ストリップを引き伸ばしてカバーする方が単色よりも自然です。単色は均一な背景(例:海水)にのみ使用します。
- 検証残留判定:ターゲット領域の処理画像の白ピクセルが元画像の5%未満であれば除去完了と見なします。
スクリプト
scripts/verify_watermark_removed.py— 透かし除去のピクセルレベル検証(元画像と処理画像の白ピクセル比較)
依存関係
- Python 3、
PIL+numpy(pip install pillow numpy)
制限(正直に告知)
- カバーリング部分は「周囲ピクセルの引き伸ばし/平均値」で埋めており、本質的には疑似修復です。透かしが実際のコンテンツ(顔/製品ロゴ/複雑なテクスチャ)を覆っている場合、カバーリングは歪みます——真のAI修復(inpainting/Lama)が必要です。
- このスキルが得意なのは:AI生成画像の隅のマーク、比較的均一な背景、ピクセルレベルの確実な検証。位置特定+検証が最も強力です。
🙋 作者について
九品錦鯉e | 踏んだ落とし穴を「すぐに使える」スキルとしてパッケージ化。教科書は書きません。
このスキルは私自身が毎日使っているバージョンです。使っていて詰まったとき、さらに高度な使い方を知りたいとき、または別のシナリオをスキルとしてパッケージしてほしいときは、以下の微信(WeChat)に直接連絡してください。メッセージに「SkillHub」と記載していただくと優先的に通過します:

QRコードをスキャンして作者の微信を追加 · メッセージに「SkillHub」と記載すると優先通過