# 影像處理作業1 - Color image histogram equalization實作 ## Histogram Equalization 概念 Histogram Equalization(直方圖均衡化)是一種影像增強技術,透過調整**影像的灰階分佈**,使影像的**對比度提高**。此方法特別適用於低對比度影像,例如**過亮或過暗**的照片,使其細節更加清晰。 ### 步驟 1:計算影像的灰階直方圖 - 直方圖記錄每個灰階值(0~255)的像素數量 $h(r_k)$。 - 假設影像為 $M \times N$ 範例影像: $$ \begin{bmatrix} 52 & 55 & 61 \\ 68 & 62 & 70 \\ 61 & 64 & 73 \end{bmatrix} $$ | 灰階值 $r_k$ | 出現次數 $h(r_k)$ | |------|------| | 52 | 1 | | 55 | 1 | | 61 | 2 | | 62 | 1 | | 64 | 1 | | 68 | 1 | | 70 | 1 | | 73 | 1 | ### 步驟 2:計算累積分佈函數(CDF) $$ c(r_k) = \sum_{i=0}^{k} h(r_i) \] \[ P(r_k) = \frac{c(r_k)}{M \times N} $$ | 灰階值 $r_k$ | 出現次數 $h(r_k)$ | 累積次數 $c(r_k)$ | 正規化 $P(r_k)$ | |------|------|------|------| | 52 | 1 | 1 | $1/9 = 0.11$ | | 55 | 1 | 2 | $2/9 = 0.22$ | | 61 | 2 | 4 | $4/9 = 0.44$ | | 62 | 1 | 5 | $5/9 = 0.56$ | | 64 | 1 | 6 | $6/9 = 0.67$ | | 68 | 1 | 7 | $7/9 = 0.78$ | | 70 | 1 | 8 | $8/9 = 0.89$ | | 73 | 1 | 9 | $9/9 = 1.00$ | ### 步驟 3:計算新的灰階值映射 $$ c(r_k) = \sum_{i=0}^{k} h(r_i) \] \[ P(r_k) = \frac{c(r_k)}{M \times N} $$ | 灰階值 $r_k$ | 出現次數 $h(r_k)$ | 累積次數 $c(r_k)$ | 正規化 $P(r_k)$ | |------|------|------|------| | 52 | 1 | 1 | \(1/9 = 0.11\) | | 55 | 1 | 2 | \(2/9 = 0.22\) | | 61 | 2 | 4 | \(4/9 = 0.44\) | | 62 | 1 | 5 | \(5/9 = 0.56\) | | 64 | 1 | 6 | \(6/9 = 0.67\) | | 68 | 1 | 7 | \(7/9 = 0.78\) | | 70 | 1 | 8 | \(8/9 = 0.89\) | | 73 | 1 | 9 | \(9/9 = 1.00\) | 轉換後的影像: $$ \begin{bmatrix} 28 & 56 & 112 \\ 199 & 142 & 227 \\ 112 & 171 & 255 \end{bmatrix} $$ ### HSV 色彩空間 HSV(Hue, Saturation, Value)是一種色彩表示方式,與 RGB(Red, Green, Blue)不同,它更接近人類視覺對顏色的感知方式。HSV 主要由三個分量組成: - H(Hue, 色相):表示顏色的類型,例如紅色、藍色、黃色等,數值範圍通常為 0° 到 360°。 - S(Saturation, 飽和度):表示顏色的純度,數值範圍為 0 到 1(或 0 到 100%)。飽和度越低,顏色越接近灰色。 - V(Value, 亮度):表示顏色的亮度,數值範圍為 0 到 1(或 0 到 100%)。數值越高,顏色越明亮。 --- ## 2D 直方圖與彩色影像 🎨 ### **概念** 2D 直方圖(2D Histogram)是一種用來分析 **兩個變數之間的像素分布** 的統計方法。在影像處理中,最常見的是 **H-S 直方圖**: - **H (Hue,色相)**:表示顏色的種類,範圍 `[0,180]`(OpenCV)。 - **S (Saturation,飽和度)**:表示顏色的純度,範圍 `[0,255]`。 ### **計算方式** 對於每個像素 `(H, S)`: 1. 將 `(H, S)` 值當成座標點,統計每種 `(H, S)` 組合出現的次數。 2. 將統計結果繪製成 **2D 直方圖圖像**,以顏色或高度顯示像素數量。 ![2d_histogram](https://hackmd.io/_uploads/S1M47Ed31e.png) ## Histogram Equalization 實作與分析 ### 1. 直方圖均衡化(Histogram Equalization)概述 直方圖均衡化是一種影像處理技術,主要用來增強影像對比度,特別適用於低對比度影像。其原理是透過 **累積分布函數(CDF, Cumulative Distribution Function)**,將原始影像的像素值重新分佈,使其更接近均勻分佈。 ### 2. 影像直方圖均衡化流程 #### 2.1 計算原始影像 V 通道直方圖 **目標:** - 計算影像 **V 通道(亮度)** 各像素值的出現頻率。 - 影像尺寸:`height × width` - 初始化 `hist_v` 陣列來統計 **0~255** 各像素值的數量。 **數學公式:** 1. 設 `v[i][j]` 為影像第 `(i, j)` 像素的亮度值,其範圍為 `[0, 255]`。 2. `hist_v[k]` 表示 **像素值為 `k` 的像素數量**: $$ \text{hist_v}[k] = \sum_{i=0}^{\text{height}-1} \sum_{j=0}^{\text{width}-1} \delta(v[i][j] - k) \] 其中 $δ(x)$ 是 Kronecker delta function: \[ \delta(x) = \begin{cases} 1, & \text{if } x = 0 \\ 0, & \text{otherwise} \end{cases} $$ **Python 實作:** ```python # 初始化 256 個 bin,每個 bin 計數初始為 0 hist_v = [0] * 256 # 影像尺寸 height = len(v) width = len(v[0]) # 計算直方圖 for i in range(height): for j in range(width): hist_v[v[i][j]] += 1 ``` **結果展示:** ![hist_v](https://hackmd.io/_uploads/SJFYVI_2yl.png) --- #### 2.2 計算累積分布函數(CDF) **目標:** - 計算 **累積分布函數(CDF, Cumulative Distribution Function)**。 - CDF 代表某個像素值 `r_k` 以下所有像素的累積機率,並用來調整直方圖。 --- ##### **數學公式** 累積分布函數(CDF)定義如下: $$ CDF(r_k) = \sum_{j=0}^{k} p_r(r_j) $$ 其中: - `r_k` 代表像素值(0~255)。 - `p_r(r_k)` 是該像素值的機率: $$ p_r(r_k) = \frac{\text{hist_v}[k]}{M \times N} $$ - `hist_v[k]`:像素值 `k` 的出現次數。 - `M × N`:影像的總像素數量(`height × width`)。 累積分布函數的 **離散形式**: $$ CDF(k) = CDF(k-1) + p_r(r_k) $$ 其中: - `CDF(0) = p_r(r_0)` - `CDF(k)` 表示小於等於 `k` 的所有像素值的累積機率。 --- ##### **Python 實作** ```python # 初始化 CDF 陣列 cdf_v = [0] * 256 cdf_v[0] = hist_v[0] # 第一個值與直方圖相同 # 計算累積分布函數(CDF) for i in range(1, 256): cdf_v[i] = cdf_v[i-1] + hist_v[i] ``` --- **結果展示:** ![cdf_v](https://hackmd.io/_uploads/SJg5PLO21l.png) #### 2.3 計算均衡化後的映射表(Histogram Equalization Mapping) **目標:** - 根據 **累積分布函數(CDF)** 產生一個 **像素值映射表**,用來將原始影像的像素值轉換為均衡化後的值。 --- ##### **數學公式** 均衡化的目標是將 CDF 轉換為新的像素值,使其分佈更均勻。這裡使用 **線性轉換公式**: $$ s_k = \text{round} \left( \frac{CDF(r_k) - CDF_{\min}}{ CDF_{\max}- CDF_{\min}} \times (L - 1) \right) $$ 其中: - $s_k$ 為新的均衡化後的像素值。 - $CDF(r_k)$ 為原始影像的累積分布函數值。 - $CDF_{\min}$ 為 CDF 中最小的非零值,確保影像不會壓縮至全黑。 - $M \times N$ 為影像的總像素數。 - $L$ 為像素值範圍,對於 8-bit 影像來說,\( L = 256 \)。 **這個公式的作用是將原本分佈不均的 CDF 映射到 [0, 255] 的範圍內,使得像素分佈更加均勻**。 --- ##### **Python 實作** ```python # 找到 CDF 中最小的非零值 cdf_min = min(filter(lambda x: x > 0, cdf_v)) cdf_max = max(cdf_v) # CDF 最大值 # 計算均衡化映射表 equalized_map = [(cdf_v[i] - cdf_min) / (cdf_max - cdf_min) * 255 for i in range(256)] equalized_map = [round(x) for x in equalized_map] # 四捨五入並轉換為整數 ``` --- #### 2.4 應用均衡化映射到 V 通道 **目標:** 使用前一步計算出的 **均衡化映射表(equalized_map)**,將原始影像的 V 通道轉換為 **均衡化後的 V 通道**。 --- ##### **數學公式** 對於原始影像中的每個像素值 `v[i][j]`,其均衡化後的像素值 `v'_ij` 由 **均衡化映射表** 決定: $$ v'_{ij} = \text{equalized_map}[v_{ij}] $$ 其中: - `v[i][j]` 是原始影像的 V 通道像素值(範圍 `[0, 255]`)。 - `equalized_map[v[i][j]]` 是新的均衡化後像素值。 --- ##### **Python 實作** ```python # 建立新的 V 通道 v_eq = [[0] * width for _ in range(height)] # 套用均衡化映射表 for i in range(height): for j in range(width): v_eq[i][j] = equalized_map[v[i][j]] ``` | 原始圖案灰階圖 | Equalization後灰階圖 | | -------- | -------- | | ![v_original](https://hackmd.io/_uploads/rk0GYIO3Jl.png)| ![v_equalized](https://hackmd.io/_uploads/SkuIYI_hkg.png) --- #### 2.5 將均衡化後的 V 通道合併回 HSV 影像並轉換回 BGR **目標:** - 使用均衡化後的 V 通道,與原本的 H、S 通道合併,形成新的 **HSV 影像**。 - 將 HSV 影像轉回 **BGR(RGB)格式**,以便顯示或儲存。 --- ##### **數學公式** 均衡化後的影像由以下公式定義: $$ \text{HSV'} = (H, S, V') $$ $$ \text{BGR'} = \text{HSV2BGR}(\text{HSV'}) $$ 其中: - `H` 為原影像的色相(Hue)。 - `S` 為原影像的飽和度(Saturation)。 - `V'` 為 **均衡化後的亮度通道**。 - `HSV2BGR()` 為 OpenCV 內建函式,將 HSV 轉換為 BGR 格式。 --- ##### **Python 實作** ```python import numpy as np import cv2 # 轉換 V 通道為 NumPy 陣列(確保資料型別正確) v_eq_array = np.array(v_eq, dtype=np.uint8) # 合併回 HSV 影像 hsv_equalized = cv2.merge([h, s, v_eq_array]) # 轉換為 BGR 影像 image_equalized = cv2.cvtColor(hsv_equalized, cv2.COLOR_HSV2BGR) # 儲存均衡化後的影像 cv2.imwrite(output_path, image_equalized) ``` --- ### 3. 結論 #### 3.1 **直方圖均衡化的影像效果** 以下是 **直方圖均衡化前後的比較圖**: ![result](https://hackmd.io/_uploads/ByuR1POnkg.png) **觀察結果:** 1. **原始影像(左上)** - 亮度分佈集中在較低的區域,導致整體 **對比度低,細節不明顯**。 - PDF(右上)顯示大部分像素值集中在 **較低灰階**(0~50),代表影像 **偏暗**。 2. **均衡化後影像(左下)** - 明亮區域與暗部區域的對比明顯提升,細節更加清晰。 - PDF(右下)顯示像素值已經 **較為均勻分佈**,代表影像亮度分佈更加均衡。 #### 3.2 **直方圖均衡化的優勢** - ✅ **提升影像對比度** - ✅ **改善低光環境影像** - ✅ **增強細節可見度**(特別適合 **醫學影像、夜間影像、監視攝影機**) - ✅ **簡單且高效**(僅需 CDF 計算與映射) #### 3.3 **可能的限制** - ⚠ **可能過度增強雜訊**: - 若影像原本含有雜訊,均衡化可能會讓雜訊變得更加明顯。 - ⚠ **非所有影像都適合**: - 若影像已經擁有良好的對比度,均衡化的效果可能不大,甚至可能導致不自然的結果(例如人像變得過度強調)。 - ⚠ **不適用於彩色影像的所有通道**: - 在 RGB 影像上直接均衡化可能會 **改變色彩**,所以通常只對亮度通道(如 **HSV 的 V 通道** 或 **Lab 空間的 L 通道**)進行均衡化。 --- ## 參考資料 1. [Rafael C. Gonzalez, Richard E. Woods, *Digital Image Processing*.](https://zh.wikipedia.org/zh-tw/%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%9D%87%E8%A1%A1%E5%8C%96) 2. OpenCV 官方文件 - [Histogram Equalization](https://docs.opencv.org/3.4/d5/daf/tutorial_py_histogram_equalization.html)