Like Share Discussion Bookmark Smile

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

Python | OpenCV 建立遮罩與基本運算

📚 前言

在前一篇我們學會了 在圖片中加入文字標註
這一篇要介紹 建立遮罩 (Mask) 與基本 bitwise 運算,這是影像處理中非常常見的技巧,可以用來選擇性處理影像區域,並理解邏輯運算在影像上的應用。

🎨 範例圖片

🎭 遮罩(Mask)

原理說明

遮罩是一張 黑白圖片,用來決定影像中哪些區域要顯示或隱藏:

  • 白色 (255):保留區域
  • 黑色 (0):遮蔽區域

搭配 cv2.bitwise_and()cv2.bitwise_or() 等函式,可以選擇性地顯示影像的一部分。

💻 範例程式:建立圓形遮罩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import cv2
import numpy as np

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

# 建立遮罩 (黑色背景)
mask = np.zeros(img.shape[:2], dtype="uint8")

# 在遮罩上繪製白色圓形
cv2.circle(mask, (175,150), 130, 255, -1)

# 套用遮罩
masked = cv2.bitwise_and(img, img, mask=mask)

cv2.imshow("Original", img)
cv2.imshow("Mask", mask)
cv2.imshow("Masked Image", masked)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 使用圓形遮罩選擇性顯示影像

🔀 Bitwise 運算

原理說明

OpenCV 提供四種常見的位元運算函式,搭配遮罩可以靈活處理影像:

  • cv2.bitwise_and(img1, img2, mask)
    交集運算,僅保留兩張圖片重疊的部分。
  • cv2.bitwise_or(img1, img2, mask)
    聯集運算,保留兩張圖片的所有部分。
  • cv2.bitwise_xor(img1, img2, mask)
    互斥運算,僅保留兩張圖片不同的部分。
  • cv2.bitwise_not(img, mask)
    非運算,將圖片顏色反轉(黑變白、白變黑)。


圖:邏輯運算示意圖 — AND、OR、XOR、NOT 的集合關係與遮罩效果對照

💻 範例程式:交集 (AND)

1
2
3
4
5
6
7
8
9
10
import cv2

img1 = cv2.imread("test1.png")
img2 = cv2.imread("test2.png")

output = cv2.bitwise_and(img1, img2)

cv2.imshow("AND", output)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 交集 (AND)

💻 範例程式:聯集 (OR)

1
2
3
4
5
6
7
8
9
10
import cv2

img1 = cv2.imread("test1.png")
img2 = cv2.imread("test2.png")

output = cv2.bitwise_or(img1, img2)

cv2.imshow("OR", output)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 聯集 (OR)

💻 範例程式:互斥 (XOR)

1
2
3
4
5
6
7
8
9
10
import cv2

img1 = cv2.imread("test1.png")
img2 = cv2.imread("test2.png")

output = cv2.bitwise_xor(img1, img2)

cv2.imshow("XOR", output)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 互斥 (XOR)

💻 範例程式:反轉 (NOT)

1
2
3
4
5
6
7
8
9
import cv2

img = cv2.imread("test1.png")

output = cv2.bitwise_not(img)

cv2.imshow("NOT", output)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 反轉 (NOT)

📊 效果比較

函式 運算 常見用途
bitwise_and() 交集 遮罩、選擇性顯示影像區域
bitwise_or() 聯集 合併影像、保留所有區域
bitwise_xor() 互斥 強調差異、保留不同部分
bitwise_not() 顏色反轉、產生遮罩

⚠️ 注意事項

  • mask 必須是灰階圖,大小要與原始圖片一致
  • 圖片大小:兩張圖片必須大小相同,否則需要先縮放
  • 顏色格式:OpenCV 使用 BGR,遮罩為灰階

🎯 結語

這一篇我們學會了 建立遮罩與基本 bitwise 運算,能夠選擇性處理影像區域,並理解邏輯運算在影像上的應用。

在下一篇,我們將進一步探索 圖片合成、疊加與相減,學習如何利用 add()addWeighted()subtract() 來進行影像融合與差異化處理。

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

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