Like Share Discussion Bookmark Smile

J.J. Huang   2026-02-26   Python OpenCV 06.視訊與互動篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 即時馬賽克與模糊處理

📚 前言

在前一篇我們學會了 圖片與影片即時標記與繪圖
這一篇要進一步介紹 即時馬賽克與模糊處理,並結合滑鼠事件互動。
透過這項技術,我們可以在圖片或影片中框選區域,並即時套用馬賽克或模糊效果,常用於隱私保護、教學影片或監控系統。

🔎 原理說明

  • 馬賽克 (Mosaic):將區域縮小再放大,形成像素化效果。
  • 模糊 (Blur):使用高斯模糊或平均模糊,讓區域變得柔和不清晰。
  • 滑鼠事件:透過 cv2.setMouseCallback() 框選區域,並即時套用效果。

🧠 函式與參數說明

📌 cv2.resize()

縮放圖片,用於馬賽克效果

1
cv2.resize(img, dsize, interpolation)
  • img:要縮放的圖片。
  • dsize:縮放後的大小 (width, height)
  • interpolation:插值方式,例如 cv2.INTER_LINEARcv2.INTER_NEAREST

📌 cv2.GaussianBlur()

高斯模糊

1
cv2.GaussianBlur(img, ksize, sigmaX)
  • img:要模糊的圖片。
  • ksize:模糊範圍大小 (width, height),必須為奇數。
  • sigmaX:高斯函數在 X 方向的標準差。

💻 範例程式一 — 圖片即時馬賽克與模糊

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import cv2

img = cv2.imread("test.png") # 部落格頭像
backup = img.copy()

drawing = False
start_point = None
end_point = None
mode = "mosaic" # 可切換 "mosaic" 或 "blur"

def mouse_event(event, x, y, flags, param):
global drawing, start_point, end_point, img, backup

if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
start_point = (x, y)

elif event == cv2.EVENT_MOUSEMOVE and drawing:
img = backup.copy()
cv2.rectangle(img, start_point, (x, y), (0, 0, 255), 2)

elif event == cv2.EVENT_LBUTTONUP:
drawing = False
end_point = (x, y)

x1, y1 = start_point
x2, y2 = end_point
roi = backup[min(y1,y2):max(y1,y2), min(x1,x2):max(x1,x2)]

if roi.size > 0:
if mode == "mosaic":
mosaic = cv2.resize(roi, (20, 20), interpolation=cv2.INTER_LINEAR)
mosaic = cv2.resize(mosaic, (roi.shape[1], roi.shape[0]), interpolation=cv2.INTER_NEAREST)
backup[min(y1,y2):max(y1,y2), min(x1,x2):max(x1,x2)] = mosaic
else:
blur = cv2.GaussianBlur(roi, (25, 25), 30)
backup[min(y1,y2):max(y1,y2), min(x1,x2):max(x1,x2)] = blur
img = backup.copy()

cv2.namedWindow("Image Effect")
cv2.setMouseCallback("Image Effect", mouse_event)

while True:
cv2.imshow("Image Effect", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cv2.destroyAllWindows()


圖:圖片即時馬賽克與模糊,滑鼠框選區域後套用效果

💻 範例程式二 — 影片即時馬賽克與模糊

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import cv2

cap = cv2.VideoCapture("video.mp4")

drawing = False
start_point = None
end_point = None
mode = "blur" # 可切換 "mosaic" 或 "blur"

def mouse_event(event, x, y, flags, param):
global drawing, start_point, end_point

if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
start_point = (x, y)

elif event == cv2.EVENT_MOUSEMOVE and drawing:
end_point = (x, y)

elif event == cv2.EVENT_LBUTTONUP:
drawing = False
end_point = (x, y)

cv2.namedWindow("Video Effect")
cv2.setMouseCallback("Video Effect", mouse_event)

while True:
ret, frame = cap.read()
if not ret:
break

if start_point and end_point:
x1, y1 = start_point
x2, y2 = end_point
roi = frame[min(y1,y2):max(y1,y2), min(x1,x2):max(x1,x2)]

if roi.size > 0:
if mode == "mosaic":
mosaic = cv2.resize(roi, (20, 20), interpolation=cv2.INTER_LINEAR)
mosaic = cv2.resize(mosaic, (roi.shape[1], roi.shape[0]), interpolation=cv2.INTER_NEAREST)
frame[min(y1,y2):max(y1,y2), min(x1,x2):max(x1,x2)] = mosaic
else:
blur = cv2.GaussianBlur(roi, (25, 25), 30)
frame[min(y1,y2):max(y1,y2), min(x1,x2):max(x1,x2)] = blur

cv2.rectangle(frame, start_point, end_point, (0, 0, 255), 2)

cv2.imshow("Video Effect", frame)

if cv2.waitKey(30) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


圖:影片即時馬賽克與模糊,滑鼠框選區域後套用效果

⚠️ 注意事項

  • 框選座標需在圖片或影片範圍內,否則會出錯。
  • 馬賽克效果依縮放大小決定顆粒粗細。
  • 模糊效果需選擇合適的 ksize,數值越大模糊越明顯。
  • 在影片範例中需依影片 FPS 調整 cv2.waitKey() 的數值。

📊 應用場景

  • 隱私保護:遮蔽人臉或敏感資訊。
  • 教學影片:模糊背景,凸顯重點。
  • 監控系統:即時隱藏不必要的資訊。
  • 互動應用:讓使用者自由選擇區域並套用效果。

🎯 結語

本篇我們學會了如何使用 OpenCV 即時馬賽克與模糊處理,透過滑鼠事件在圖片或影片中框選區域並套用效果。
這樣的互動方式讓影像處理更靈活,後續可以延伸到 人臉偵測與追蹤,打造更智慧的影像應用。

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

註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials
Pexels — 免費影片素材