AI圖片去浮水印 · 像素級驗證版
去 AI 生成圖(豆包/即夢/Kolors 等)角落的「XXAI生成」白色/半透明角標浮水印。核心賣點:像素級驗證不自我欺騙、雙訊號交叉定位抗幻覺、多候選客觀指標投票覆蓋——別只會「調 AI 修圖然後肉眼說好了」,這是算出來的。
適用場景
- AI 生成圖角落的「XXAI生成」白字/半透明角標(豆包/即夢/Kolors 等)
- 浮水印壓在相對均勻背景上(平整色塊/天空/海水/漸變)
- 浮水印在畫面角落而非主體上
完整鏈路(接力鏈降低錯誤相關性)
去浮水印是一條四跳接力鏈:定位 → 取樣背景 → 覆蓋 → 驗證。每跳獨立只錯一點,多跳後正確率急劇衰減;同源方法會一起栽在同一個坑。徹底版 = 關鍵節點單獨加校驗 + 跨原理訊號交叉 + 多候選投票。
① 定位(兩訊號交叉,必須不同原理)
- 訊號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:左側/四周均值色填充 + mask 高斯羽化邊緣(GaussianBlur 2px)——均勻背景
- 候選3:多向插值
- 投票指標:區域紋理連續性(邊緣梯度)+ 顏色統計方差 + 與周圍像素歐氏距離。指標最優者勝出,不靠「我覺得哪個好」。
- 覆蓋區域加 pad 6-8px,防文字邊緣殘留。
③ 驗證(像素級裁決,隔離視覺誤報)
- 像素級 ground truth 跑
scripts/verify_watermark_removed.py:比較原圖 vs 處理圖在目標區域白色像素數。原圖 856 → 處理 2 = 清除✅ - 視覺模型不參與裁決,只報粗定位。它「還有浮水印」的誤報(複雜背景白毛髮/水花/火焰亮區)被像素 diff 隔離在節點外,不拖延進度。
- 殘留判斷:目標區處理圖白色 < 原圖 5% 即視為清除。
整鏈(當分散式系統管)
- 每跳輸入輸出定死:bbox 字典 / 候選列表 / 指標,可單獨測試復原。
- 端到端看:成功率(像素達標率)+ 成本(輪次)+ 可排查性,跟單跳基線比——收益扣掉稅仍是正,才真上線。
關鍵坑(實戰踩過)
- 視覺模型會幻覺「還有浮水印」:複雜背景(白色毛髮/水花/火焰亮區)下反覆誤報「右下角有豆包AI生成」,即使像素級證明已清除。像素 diff 才是裁決者——數值達標後別被視覺模型帶著重做。
- 視覺模型說「右下角」可能指整個右下 1/4 區域,精確座標必須靠像素分析(行/列白色密度聚類)。
- 畫面本身亮色(老虎白毛/瀑布白浪)會干擾白色檢測——「原圖白且處理圖也白」遍佈全圖時,那不是浮水印是畫面內容。
- 背景複雜時上方背景拉伸覆蓋比純色更自然;純色只用於均勻背景(如海水)。
- 驗證殘留判斷:目標區域處理圖白色 < 原圖 5% 即視為清除。
腳本
scripts/verify_watermark_removed.py— 像素級驗證浮水印是否清除(原圖vs處理圖白色像素對比)
依賴
- Python 3,
PIL+numpy(pip install pillow numpy)
局限(誠實告知)
- 覆蓋這環用「周圍像素拉伸/均值」填,本質是偽修復。浮水印若壓住真實內容(人臉/產品logo/複雜紋理),覆蓋會失真——需接真·AI 修復(inpainting/Lama)。
- 本 skill 擅長:AI 生成圖角標、相對均勻背景、像素級兜底驗證。定位+驗證最硬。
🙋 關於作者
九品錦鋰e | 把踩過的坑封裝成「拿來就能跑」的 skill,不寫教科書。
這個 skill 是我自己每天在用的版本。用的時候卡住了、想要進階玩法、或者有別的場景想讓我封裝成 skill,直接加我微信說,加時備註「SkillHub」我優先通過:

掃碼添加作者微信 · 備註「SkillHub」優先通過