OpenCV實時素描效果:用代碼將攝像頭畫面轉化為藝術素描
實現原理與可視化流程
運行前請安裝OpenCV:`pip install opencv-python`,如攝像頭無法打開請嘗試調整`VideoCapture(0)`或`VideoCapture(1)`參數。
素描效果的核心思想是模擬藝術家繪製素描時的視覺處理過程。讓我們通過一個完整的流程圖來理解這個過程的每一步:
mermaid
graph TD
A[原始彩色圖像] --> B[灰度轉換]
B --> C[顏色反轉]
C --> D[高斯模糊]
D --> E[再次反轉]
B --> F[色彩減淡混合]
E --> F
F --> G[最終素描效果]
代碼詳解與分步可視化
1. 初始設置與攝像頭捕獲
python
import cv2
初始化攝像頭
cap = cv2.VideoCapture(1)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
攝像頭輸入 →原始彩色圖像
2. 灰度轉換 - 簡化色彩信息
python
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
彩色圖像轉換過程:
效果變化:彩色 → 黑白灰度
3. 顏色反轉 - 創建負片效果
python
inverted = cv2.bitwise_not(gray)
灰度值反轉示例:
原灰度值: 0 64 128 192 255
↓ ↓ ↓ ↓ ↓
反轉後: 255 191 127 63 0
圖像表現:
原圖: ████████████░░░░░░░░░░░░░░████████
反轉: ░░░░░░░░░░░░██████████████░░░░░░░░
效果變化:亮部變暗部,暗部變亮部
4. 高斯模糊 - 模擬鉛筆塗抹效果
python
blurred = cv2.GaussianBlur(inverted, (21, 21), 0)
高斯模糊原理:
███████ 卷積核: 結果:
█ █ 1 4 7 4 1
█ ● █ → 4 16 26 16 4 ÷ 273 → 模糊邊緣
█ █ 7 26 41 26 7
███████ 4 16 26 16 4
1 4 7 4 1
模糊效果:
反轉圖: ░░░█████░░░ 模糊後: ░░░▐▓█▓▌░░░
內核大小(21,21)的影響:
- 小內核(5,5):細節保留較多,線條較細
- 內核(21,21):適中模糊,自然素描感
- 大內核(51,51):過度模糊,細節丟失
5. 再次反轉 - 回到正片
python
inverted_blurred = cv2.bitwise_not(blurred)
模糊反轉圖: ░░░▐▓█▓▌░░░
再次反轉: ███▄░█░▄███
6. 色彩減淡 - 核心素描效果生成
python
sketch = cv2.divide(gray, inverted_blurred, scale=256.0)
數學公式:
sketch = (gray × 256) / (inverted_blurred + 1)
處理過程:
灰度圖: █████░░░░████
模糊反轉圖: ███▄░█░▄███
↓ 除法混合 ↓
素描結果: ████ ▐▌ ████
色彩減淡效果:
- 在暗區:分母值小 → 結果值大 → 顯示為白色
- 在邊緣:分子/分母對比強烈 → 產生明顯的線條
- 在亮區:分母值大 → 結果值小 → 顯示為灰色
完整代碼實現
import cv2
cap = cv2.VideoCapture(1)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
print("OpenCV素描效果 - 按ESC退出")
while True:
ret, frame = cap.read()
if not ret:
break
# 轉換為灰度圖
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 反轉顏色
inverted = cv2.bitwise_not(gray)
# 應用高斯模糊
blurred = cv2.GaussianBlur(inverted, (21, 21), 0)
# 再次反轉
inverted_blurred = cv2.bitwise_not(blurred)
# 創建素描效果
sketch = cv2.divide(gray, inverted_blurred, scale=256.0)
# 顯示結果
cv2.imshow('Original', frame)
cv2.imshow('Sketch', sketch)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
數調整指南
模糊內核大小對比
小內核(5,5): 細節豐富,線條細膩 ███▌░░▐███
中內核(21,21): 自然素描感 ████ ▐▌ ████
大內核(51,51): 粗獷風格 █████▄▄█████
分辨率設置
python
高清但處理慢
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
流暢體驗推薦
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) ← 推薦
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) ← 推薦
低分辨率快速處理
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
運行效果展示
運行程序後,你將看到實時處理效果:
實時顯示窗口:
┌─────────────────┐ ┌─────────────────┐
│ Original │ │ Sketch │
│ │ │ │
│ �� 彩色畫面 │ → │ ✏️ 素描效果 │
│ │ │ │
└─────────────────┘ └─────────────────┘
技術要點總結
1. 灰度轉換:降低計算複雜度,專注明暗關係
2. 反轉+模糊:創建邊緣增強的掩膜
3. 色彩減淡:利用除法混合突出輪廓線條
4. 實時處理:通過攝像頭流實現即時藝術轉換