Python | OpenCV 直方圖均衡化與圖片增強
📚 前言
在前一篇我們學會了 直線與圓形偵測 (霍夫變換)。
這一篇要介紹 直方圖均衡化 (Histogram Equalization) 與 圖片增強 (Image Enhancement),包含 全域均衡化、CLAHE 自適應均衡化、彩色圖片均衡化 三種方法,這是圖片前處理的重要技巧,能改善圖片對比度,讓細節更清晰,常用於夜間圖片、醫學圖片或文件辨識。
🎨 範例圖片

圖:範例圖片 — 灰階暗圖,用於均衡化測試
圖:範例圖片 — 彩色暗圖,用於 Y 通道均衡化測試
🔎 全域直方圖均衡化
原理說明
- 將圖片的灰階值重新分配,使亮度分布更均勻。
- 適合整體偏暗或偏亮的圖片。
- OpenCV 提供
cv2.equalizeHist()。
參數說明
1 | cv2.equalizeHist(src) |
- src:輸入圖片,必須是單通道灰階 (
uint8)。 - 回傳值:均衡化後的灰階圖片。
📌 注意:無法直接處理彩色圖片,需先轉換色彩空間。
💻 範例程式
1 | import cv2 |

圖:程式碼執行結果 — 灰階圖片均衡化,對比度提升
🔎 CLAHE (自適應直方圖均衡化)
原理說明
- 將圖片分成小區塊,分別均衡化後再合併。
- 適合局部亮度差異大的圖片。
- 可避免全域均衡化造成雜訊過度增強。
參數說明
1 | cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) |
- clipLimit:對比度限制值,防止過度增強。數值越大,對比度越強。
- tileGridSize:分割區塊大小,例如
(8,8)表示分成 8x8 區塊。
💻 範例程式
1 | import cv2 |

圖:程式碼執行結果 — CLAHE 增強效果,局部對比度提升
🔎 彩色圖片均衡化
原理說明
- 彩色圖片不能直接均衡化,否則會破壞色彩。
- 正確做法是轉換到 YCrCb 色彩空間,只均衡化亮度通道 (Y)。
參數說明
1 | cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb) |
- cv2.cvtColor:轉換色彩空間。
- y_channel:Y 通道(亮度),只對這一通道做均衡化。
- 回傳值:保留色彩的均衡化圖片。
💻 範例程式
1 | import cv2 |

圖:程式碼執行結果 — 彩色圖片均衡化,亮度提升但色彩保持不變
📊 效果比較
| 方法 | 特點 | 適用情境 |
|---|---|---|
equalizeHist() |
全域均衡化,提升整體對比度 | 適合灰階圖片,整體偏暗或偏亮 |
| CLAHE | 局部均衡化,避免過度增強 | 適合醫學圖片、夜間圖片、局部亮度差異大 |
| 彩色均衡化 (Y 通道) | 保留色彩,只增強亮度 | 適合彩色照片,避免色偏 |
⚠️ 注意事項
- 直方圖均衡化主要用於 灰階圖片,彩色圖片需轉換到 YCrCb 或 HSV,只處理亮度通道。
- CLAHE 的
clipLimit與tileGridSize需要依圖片調整,過大可能造成過度增強。 - 均衡化雖能改善對比度,但也可能放大雜訊,需搭配濾波或其他前處理。
🎯 結語
本篇我們學會了 直方圖均衡化、CLAHE 自適應均衡化 以及 彩色圖片均衡化,能有效改善圖片對比度,讓細節更清晰。
這些技巧在圖片前處理中非常常見,尤其在 夜間圖片、醫學圖片、文件辨識 等場景中非常有用。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
