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. 實時處理:通過攝像頭流實現即時藝術轉換