Like Share Discussion Bookmark Smile

J.J. Huang   2026-02-03   Python OpenCV 04.幾何與繪圖篇   瀏覽次數:次   DMCA.com Protection Status

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_RANGEFLOODFILL_MASK_ONLY

🎯 運作原理

  1. seedPoint 開始,檢查周圍像素是否與起始點顏色「相近」。
  2. 若在 loDiffupDiff 範圍內,就納入填色區域。
  3. 更新 maskimage,依照 flags 決定是否真的填色。

💻 範例程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import cv2
import numpy as np

# 讀取圖片
img = cv2.imread("floodfill_sample.png")

# 顯示原圖
cv2.imshow("Original Image", img)

# 建立遮罩 (比原圖大 2 像素)
h, w = img.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)

# 種子點 (假設使用者點選座標)
seed_point = (15, 15)

# 設定顏色範圍 (threshold)
loDiff = (10, 10, 10)
upDiff = (10, 10, 10)

# 執行 floodFill,直接在原圖上填色
cv2.floodFill(img, mask, seed_point, (0, 255, 0), loDiff, upDiff, flags=cv2.FLOODFILL_FIXED_RANGE)

# 顯示填色後的結果
cv2.imshow("FloodFill Result", img)

cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 原圖與填色結果

🔧 loDiff / upDiff 效果比較

floodFill() 中,loDiffupDiff 控制顏色相似度範圍。
它們決定了「種子點顏色 ± 容許差距」的範圍,影響選取區域的大小。

範例說明

假設種子點顏色是 (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 像素,否則會出錯。
  • loDiffupDiff 的設定影響選取範圍,需依圖片調整。
  • floodFill 可以搭配 FLOODFILL_MASK_ONLYFLOODFILL_FIXED_RANGE 使用,效果不同。

🎯 結語

本篇我們學會了如何利用 OpenCV 實作 魔術棒顏色填充
這個技巧能讓影像編輯更直觀,並可延伸到互動式工具,例如滑鼠點選選取區域、即時顏色替換等。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。

註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials