Like Share Discussion Bookmark Smile

J.J. Huang   2026-02-06   Python OpenCV 05.特徵與進階篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 直方圖均衡化與圖片增強

📚 前言

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

🎨 範例圖片


圖:範例圖片 — 灰階暗圖,用於均衡化測試

圖:範例圖片 — 彩色暗圖,用於 Y 通道均衡化測試

🔎 全域直方圖均衡化

原理說明

  • 將圖片的灰階值重新分配,使亮度分布更均勻。
  • 適合整體偏暗或偏亮的圖片。
  • OpenCV 提供 cv2.equalizeHist()

參數說明

1
cv2.equalizeHist(src)
  • src:輸入圖片,必須是單通道灰階 (uint8)。
  • 回傳值:均衡化後的灰階圖片。

📌 注意:無法直接處理彩色圖片,需先轉換色彩空間。

💻 範例程式

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

# 讀取灰階圖片
img = cv2.imread("dark.png", cv2.IMREAD_GRAYSCALE)

# 直方圖均衡化
equalized = cv2.equalizeHist(img)

cv2.imshow("Original", img)
cv2.imshow("Equalized", equalized)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 灰階圖片均衡化,對比度提升

🔎 CLAHE (自適應直方圖均衡化)

原理說明

  • 將圖片分成小區塊,分別均衡化後再合併。
  • 適合局部亮度差異大的圖片。
  • 可避免全域均衡化造成雜訊過度增強。

參數說明

1
cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
  • clipLimit:對比度限制值,防止過度增強。數值越大,對比度越強。
  • tileGridSize:分割區塊大小,例如 (8,8) 表示分成 8x8 區塊。

💻 範例程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cv2

# 讀取灰階圖片
img = cv2.imread("dark.png", cv2.IMREAD_GRAYSCALE)

# 建立 CLAHE 物件
clahe = cv2.createCLAHE(clipLimit=50.0, tileGridSize=(8,8))

# 套用 CLAHE
clahe_img = clahe.apply(img)

cv2.imshow("Original", img)
cv2.imshow("CLAHE", clahe_img)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — CLAHE 增強效果,局部對比度提升

🔎 彩色圖片均衡化

原理說明

  • 彩色圖片不能直接均衡化,否則會破壞色彩。
  • 正確做法是轉換到 YCrCb 色彩空間,只均衡化亮度通道 (Y)。

參數說明

1
2
3
cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)
cv2.equalizeHist(y_channel)
cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)
  • cv2.cvtColor:轉換色彩空間。
  • y_channel:Y 通道(亮度),只對這一通道做均衡化。
  • 回傳值:保留色彩的均衡化圖片。

💻 範例程式

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

# 讀取彩色圖片
img = cv2.imread("color.png")

# 轉換到 YCrCb
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)

# 均衡化 Y 通道
ycrcb[:,:,0] = cv2.equalizeHist(ycrcb[:,:,0])

# 轉回 BGR
equalized_color = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)

cv2.imshow("Original", img)
cv2.imshow("Equalized Color", equalized_color)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:程式碼執行結果 — 彩色圖片均衡化,亮度提升但色彩保持不變

📊 效果比較

方法 特點 適用情境
equalizeHist() 全域均衡化,提升整體對比度 適合灰階圖片,整體偏暗或偏亮
CLAHE 局部均衡化,避免過度增強 適合醫學圖片、夜間圖片、局部亮度差異大
彩色均衡化 (Y 通道) 保留色彩,只增強亮度 適合彩色照片,避免色偏

⚠️ 注意事項

  • 直方圖均衡化主要用於 灰階圖片,彩色圖片需轉換到 YCrCb 或 HSV,只處理亮度通道。
  • CLAHE 的 clipLimittileGridSize 需要依圖片調整,過大可能造成過度增強。
  • 均衡化雖能改善對比度,但也可能放大雜訊,需搭配濾波或其他前處理。

🎯 結語

本篇我們學會了 直方圖均衡化CLAHE 自適應均衡化 以及 彩色圖片均衡化,能有效改善圖片對比度,讓細節更清晰。
這些技巧在圖片前處理中非常常見,尤其在 夜間圖片、醫學圖片、文件辨識 等場景中非常有用。

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

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