# 影像處理作業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 直方圖圖像**,以顏色或高度顯示像素數量。

## 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
```
**結果展示:**

---
#### 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]
```
---
**結果展示:**

#### 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後灰階圖 |
| -------- | -------- |
| | 
---
#### 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 **直方圖均衡化的影像效果**
以下是 **直方圖均衡化前後的比較圖**:

**觀察結果:**
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)