Python | OpenCV 魔術棒填充顏色
📚 前言
在前一篇我們學會了 圖片合成、疊加與相減。
這一篇要介紹 魔術棒填充顏色,利用 OpenCV 的 floodFill 函式,實作類似 Photoshop 的魔術棒工具,快速選取顏色區域並填充。
🎨 範例圖片

圖:範例圖片 — 測試用彩色區塊
🧠 floodFill 方法介紹
OpenCV 的 cv2.floodFill() 是一個用來「填色」的函式,它會從一個指定的像素點(稱為 種子點 seed point)開始,向周圍擴展,找出顏色相近的區域並進行填色。
🔍 基本語法
1 | cv2.floodFill(image, mask, seedPoint, newVal, loDiff, upDiff, flags) |
📌 參數說明
| 參數 | 說明 |
|---|---|
image |
要填色的圖片(會被修改) |
mask |
遮罩,用來記錄哪些區域已被填色,大小需比原圖大 2 像素 |
seedPoint |
起始點座標,例如 (50, 50) |
newVal |
要填入的顏色,例如 (0, 255, 0) |
loDiff / upDiff |
顏色容許差距,決定哪些像素算「相近」 |
flags |
控制填色方式,例如 FLOODFILL_FIXED_RANGE 或 FLOODFILL_MASK_ONLY |
🎯 運作原理
- 從
seedPoint開始,檢查周圍像素是否與起始點顏色「相近」。 - 若在
loDiff與upDiff範圍內,就納入填色區域。 - 更新
mask或image,依照flags決定是否真的填色。
💻 範例程式
1 | import cv2 |

圖:程式碼執行結果 — 原圖與填色結果
🔧 loDiff / upDiff 效果比較
在 floodFill() 中,loDiff 與 upDiff 控制顏色相似度範圍。
它們決定了「種子點顏色 ± 容許差距」的範圍,影響選取區域的大小。
範例說明
假設種子點顏色是 (200, 200, 200) (灰色):
loDiff = (10,10,10)、upDiff = (10,10,10)
→ 只會選取(190,190,190)到(210,210,210)的像素,範圍很精準。loDiff = (50,50,50)、upDiff = (50,50,50)
→ 會選取(150,150,150)到(250,250,250)的像素,範圍更寬鬆。
📊 效果比較表
| 設定值 | 選取範圍 | 特點 |
|---|---|---|
loDiff=(10,10,10) / upDiff=(10,10,10) |
種子點 ±10 | 精準選取,區域小 |
loDiff=(30,30,30) / upDiff=(30,30,30) |
種子點 ±30 | 適中,常用設定 |
loDiff=(50,50,50) / upDiff=(50,50,50) |
種子點 ±50 | 範圍大,容易包含更多顏色 |
⚠️ 注意事項
- 遮罩大小必須比原圖大 2 像素,否則會出錯。
loDiff與upDiff的設定影響選取範圍,需依圖片調整。floodFill可以搭配FLOODFILL_MASK_ONLY或FLOODFILL_FIXED_RANGE使用,效果不同。
🎯 結語
本篇我們學會了如何利用 OpenCV 實作 魔術棒顏色填充。
這個技巧能讓影像編輯更直觀,並可延伸到互動式工具,例如滑鼠點選選取區域、即時顏色替換等。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
