---
# System prepended metadata

title: 數位影像處理學習筆記

---

多媒體 - 花凱龍

注意以下的數學推導基本上可以省略，尤其方框濾波（box filter）那邊

1）對於灰階影像中的每個像素，只使用一個整數來存取，以使用較少的參數來存取圖像的景深資訊

2）對於彩色影像轉成黑白影像，其將彩色影像分為 B、G、R 分別表示藍、綠、紅色的色彩空間，而由於人眼對綠色比較敏感，所以轉成灰度時所需的參數（權重）較高，由於對藍色比較遲鈍，所以參數較低，其常用轉換式子為 Gray = 0.1140 × B + 0.5870 × G + 0.2989 × R

3）彩色影像轉成灰度影像當中的參數需要依照人眼對 BGR 的敏感度而設定權重，此處的權重為經驗上常使用的參數，實際上也可以適配其他參數

4）轉成灰度的意義是可以將原本需要三個參數的彩色影像轉換成只需要使用一個參數來表示，此種轉換是因為對於某些不需要使用到彩度資訊的應用情境，強加非必要的參數會造成後續分析的失真

5）若對於資料的分析只需要部分資訊，但卻在分析時仍使用完整的資訊，則會造成處理資訊時，由於資訊過多而造成分析結果失真，為過度擬合的成因之一

6）CV\_8UC3 表示用 3 通道（“C”hannel）且每個頻道使用 8 位元的無符號整數（“U”nsigned）來表示，常用於存取一般的彩色影像；CV\_8UC1 常用於存取灰階影像；在 OpenCV 當中，可以使用 CV\_[the size of each channel][unsigned or signed]C[numbers of channel] 來儲存影像

7）OpenCV 當中，在使用三通道儲存彩色影像的資料結構為 Vec3b，表示 3 個 Byte 形成的向量（Vec3d 表示由 double 形成，不應混淆），使用單通道存取灰階影像的資料結構為 uchar，有時候會多使用一個通道以儲存影像的深度資訊

8）OpenCV 當中的單通道影像之資料結構 uchar 為無符號字元，不能寫成 char，否則在儲存影像時可能會出現負數，使影像失真

9）模糊效果可以使用平滑法（smoothing method）來實現，即是給定原影像與塊的大小 n，以表示一個 n × n 的像素塊，對於每一個原圖像中的像素，將該像素附近的一個塊求平均值以作為該塊的新值

10）抗噪效果可以使用中間值方法（median method）來實現，給定一個圖像與像素塊大小，讓像素塊中心的像素重新設為當前像素塊中的所有像素之中間值，故可以將過大或過小的值濾除，以達到抗噪的效果

11）對於圖像中較暗的地方，要使用更敏感的感光器才能接受更多光線，以拍攝更多細節，但此時也會導致對於圖像中較亮的地方會出現過度曝光的情況，此時要將感光器調整到不敏感的狀態才能限制到較少光線，使得在亮的地方也能看出差異

12）HDR 的原理是對於同一個景象，以不同的感光器之敏感度，在短時間內捕捉多張圖像，並且針對不同的亮度區塊，會有某個敏感度的圖像使得該區塊可以更清晰，並透過權重演算法來融合多張圖片，使得最後的結果會呈現最多的細節

13）隨著攝影技術的演進，技術逐漸從拍攝照片變成製作照片，拍攝照片對應的是硬體，而製作與處理照片對應的是軟體算法

14）HDR 當中的圖片合成是透過各個影像中的權重加成來共同決定輸出結果，其中對於圖片集當中的紋理（資訊）較多的區塊，其權重就會較大，實務上是透過滑動窗口，同時決定多張圖像在該滑動窗口下的離差（最小平方差）或訊息熵之大小來決定每張圖像在當前窗口的資訊，並以此數值決定權重的大小

15）3D 成像即是兩個鏡頭針對同一場景使用不同角度拍圖像，並將兩圖像合成來得到；兩個鏡頭所呈現的圖像根據其角度的不同，可以合成出立體感的圖像，根據不同應用，其可能只需要知道大略的位置關係即可，因此也會兩個鏡頭之間的距離較短的 3D 相機

16）傳統的 3D 攝像機中的兩個鏡頭之位置會距離一段距離，該段距離為普通人的眼距之平均，在由於每個人的眼距不同，因此 3D 攝像機產出的圖像之立體感可能因人而異

17）混合相機有兩種鏡頭，一種以較低的頻率去捕捉高解析度的圖像，另一種以較高的頻率去捕捉低解析度的影像，前者可以增加清晰程度，後者可以減少由於物件移動造成的模糊效果

18）360 度攝像機利用多個攝像機來捕捉圖像，並透過軟體拼接以得到環繞的圖像

19）景深所聚焦的位置不同會導致未聚焦的地方相較於聚焦的地方更為模糊，例如聚焦於前方時，後方就會比較模糊，反之亦然，根據聚焦的不同，也會得到不同景深的圖像，也可以使相對位置較遠的物件變得更近，而相對位置較近的物件變得更遠；將不同景深的圖像結合即可得到 3D 攝像機帶來的立體感，並保留各個圖像中的清晰部分

20）在攝像機中，硬體成本受輸入的解析度之精細程度影響而上升，並且透過對圖像的處理以提升圖像的觀感，此種軟體成本受算法所需的硬體之運算能力所影響

21）RGB 的標準取決於肉眼的可見光範圍，即紅色到綠色再到藍色，因此以紅綠藍作為不同的色彩屬性

22）紅外線攝影像機（IR）是深度攝影機的一種，其原理是利用紅外線的飛行時間來判斷距離

23）用於捕捉不可見光的攝像機，會將這些不可見光映射到可見光的光譜上，並且由於不可見光的穿透性，會捕捉到不同程度的穿透效果；例如根據不可見光的強度，可以見到穿透一個人的衣物、肉、骨的效果，導致捕捉到不同的影像

24）在低光源高敏感的情況下，會出現更清晰的細節，此時將每個像素乘以一個較高的倍率，就可以發現某些像素的失真，即是該圖片的噪點

25）肉眼在近處會關注高頻的資訊（精細的紋理），在遠處時會關注低頻的資訊（粗糙的輪廓）；高通濾波器用於捕捉高頻的細節，以增強圖像的精細程度；低通濾波器用於將高頻資訊平滑化，以去掉潛在的噪點

26）圖像隱碼術表示對於使用二進制來進行編碼的圖像，由於肉眼對較低權重的位元更不敏感，因此可以使用最後一位元來放入特定的資料，例如放入只有黑白之分的二維碼等，讓圖像在與原圖像的外觀沒有太大變化的前提下，隱含地傳遞額外的資訊

27）為了避免直接放大圖像時的模糊現象，會使用雙線性插值，例如對於要放大圖像至 s 倍，則需要對於放大圖像的每一個像素之座標 (x, y)，對應到原圖像的座標 (x', y') = (x÷s, y÷s)，並且根據 (x', y') 附近的整數點，有如下操作：
```
# 原點 (0, 0) 將從左上角開始向右下角拓展
左上 c00: (floor(x'), floor(y'))
右上 c01: (ceil(x'),  ceil(y'))
左下 c10: (floor(x'), ceil(y'))
右下 c11: (ceil(x'),  ceil(y'))

xd = (x'-x0) / (x1-x0)
yd = (y'-y0) / (y1-y0)

c0 = c00(1-xd) + c01(xd)
c1 = c10(1-xd) + c11(xd)
c = c0(1-yd) + c1(yd)
```
28）樣本表示圖像本身，而量化（quantize）表示記錄樣本的精細程度

29）灰階圖認定人眼對 RGB 的敏感程度比例為 0.2989 : 0.5870 : 0.1140，可以簡單將比例看作是 3 : 6 : 1，而 Bayer 濾色鏡是一種像素的排列方式，由於其簡單而被廣泛應用，其 RGB 的比例是 1 : 2 : 1

30）點運算子（point operation）表示以像素為單位的圖像處理運算子；鄰近運算子（local operator、neighborhood operator）表示根據附近特定區塊來決定處理當前像素的方法，多以方框濾波（box filter）的形式出現

31）圖像的對比度高，表示圖像的亮度分布較廣，反之，對比度較低，則圖像的亮度過於集中；判斷對比度高低的方式是使用一個容量為 256 單位的計數用陣列 H（代表 histogram，用來表示每個亮度值出現的頻率 0~255），對於圖像中的每一個像素，如果其亮度（灰階）為 i，則將 H[i] 遞增，當遍歷完圖像後，就可以根據 H 當中的值來觀察亮度為 i 的像素之數量，當數量的分布過於集中，就是屬於對比度較低的情況

32）對比度的提高有助於讓圖像的色彩表現更豐富，因此為了增加圖像的對比度，可以使用灰階直方圖均化，首先會先計算每個亮度值出現的頻率H[i]（可以視為機率密度函數），再者計算其前綴和 C[i]（可以視為累積直方圖、累積分布函數），前綴和可以用於得知當前像素的亮度總共需要超過圖像中的多少像素，最後可以插值利用 (C[i] - Cmin) / (Cmax - Cmin) 來算出其亮度的比例，其中的 Cmin 表示不為零的最小前綴和，Cmax 表示最大的前綴和，同時也是圖片的長寬之積 rows × cols，將該比例乘以 255 之後，再取一個下高斯函數換成整數即為結果；其程式如下：
```python
H = [0] * 255
for pixel in image:
  lumin = L(pixel)
  H[lumin] += 1

C = [0] * 255
C[0] = H[0]
for i in range(256):
  C[i] += C[i-1] + H[i]

Cmax = image.rows * image.cols
for pixel in image:
  rate = (C[L(i)] - Cmin) / (Cmax - Cmin)
  pixel = floor(255 * rate)

return image
```
33）肉眼對於亮度的敏感程度（灰度）比起彩度更大

34）可以將模糊視為圖像的低通濾波器，銳化視為圖像的高通濾波器，將二者結合時就會有模糊圖像的輪廓與清晰圖像的紋理

35）銳化可以令圖像的高頻資訊更多，以達到視覺上更好的效果，此效果可以使用方框濾波，以方框的中心做為目標像素，其鄰近運算子如下；對於只有中心為 2 的矩陣，可以視為兩倍的像素；對於全部都是 1 的矩陣，表示將附近的像素都考慮到，並且透過除以 9 來表示低頻訊號；將兩倍的像素減去低頻的訊號時，當前像素 + (當前像素 - 低頻紋理的像素) = 當前像素 + 中高頻紋理的像素 = 銳化的結果
$$
\begin{bmatrix}
0&0&0 \\ 0&2&0 \\ 0&0&0
\end{bmatrix} - \frac{1}{9}\cdot \begin{bmatrix}
1&1&1 \\ 1&1&1 \\ 1&1&1
\end{bmatrix}
$$$$ 
\begin{bmatrix}
 0&0&0 \\ 0&1&0 \\ 0&0&0
\end{bmatrix} + \begin{bmatrix}
 1/9&1/9&1/9 \\ 1/9&8/9&1/9 \\ 1/9&1/9&1/9
\end{bmatrix}
$$
36）肉眼對於圖像的輪廓之邊界情況，會將顏色更加銳化，因此在肉眼中的黑白邊界中，灰黑色的邊界更深，而灰白色的邊界更淺

37）在離散的圖像世界中，微分算子 lim_∆->0 (f(t+∆) - f(t)) / ∆ 當中的 ∆ = 1，即離散世界的最小值，結果等價於 f[t+1] - f[t]，因此對圖像微分，等價於當前像素與鄰近的像素值相減

38）為了實現邊緣檢測（find edge），可以使用 Sobel 運算子，分別抓取垂直輪廓與平行輪廓如下，當要使用時其結果 G 會取二者的歐式距離，即 G = √(Gx² + Gy²)，亦或是使用 Manhattan 距離，使 G = |Gx| + |Gy|
```
# 差分情況：
Gx = f[x+1] - f[x-1]
Gy = f[y+1] - f[y-1]

# Gx 垂直   # Gy 平行
[+1  0 -1] [+1 +2 +1]
[+2  0 -2] [ 0  0  0]
[+1  0 -1] [-1 -2 -1]
```

39）Sobel 運算子可以根據其矩陣的形式呈現出斜線，來得到一個圖像中的斜線的能量，即是將圖像中對應的斜線都呈現到結果中；對於圓形的矩陣形式也會將圖像中具有圓形的部分都篩選出來

40）Laplacian 遮罩是使用全微分來形成的，表示觀察上下左右的像素與當前像素的變化情況，以取得其中的差異，達到邊緣檢測的效果：
```
# 差分情況：
Δf[x] = f[x+1] - f[x]
Δf[y] = f[y+1] - f[y]

Δ²f[x]
= (f[x+2] - f[x+1]) - (f[x+1] - f[x])
=  f[x+2] - 2f[x+1] + f[x]
=> f[x+1] - 2f[x] + f[x-1]

Δ²f[y]
= (f[y+2] - f[y+1]) - (f[y+1] - f[y])
=  f[y+2] - 2f[y+1] + f[y]
=> f[y+1] - 2f[y] + f[y-1]

Δ²f
= Δ²f[x] + Δ²f[y]
= Δf[x+1] + Δf[y+1] + Δf[x-1] + Δf[y-1] - 4f[x,y]

矩陣結果：
[0  1  0]   [0  1  0]   [0  0  0]   [0  0  0]   [0  0  0]
[1 -4  1] = [0 -1  0] + [0 -1  1] + [0 -1  0] + [1 -1  0]
[0  1  0]   [0  0  0]   [0  0  0]   [0  1  0]   [0  0  0]
```
41）Gaussian 模糊表示根據 Gaussian 函數 e^(x²+y²)的形式來決定權重，根據該函數的圖形，會呈現出中間權重大而四周權重小的情況，四周的圖形都會對稱，且相較於方框濾波的效果更為平滑，因此模糊後的觀感更好

42）Gauss 模糊還可以透過標準差來決定其權重的分布，因此彈性也更好；標準差越小，則權重越往中間集中

43）直方圖匹配用於將來源圖像的調色風格轉成目標圖像的調色風格，其方法是先針對來源圖像與目標圖像分別計算其像素亮度的機率分布函數 CDF¹ 與 CDF²，再將每個 CDF¹ 的值 C[pixel] 對應到 CDF² 中的同等機率，再從同等機率找到目標圖像對應的像素亮度，將原本的像素 pixel 設為對應到的像素亮度即可完成匹配，對每一個像素都可以執行

44）實務上由於圖像是離散的，所以會使用二分搜尋來查找 CDF¹ 至 CDF² 的對應亮度值，注意其中 CDF 對應的是必然具有已排序性質的前綴和陣列；也可以使用雙指標來建出對應表 mapping，如果目標圖像的機率密度 CDF²[j] 小於來源圖像的機率密度 CDF¹[i]，則將執行 mapping [i] = j，表示將來源圖像的像素亮度 i 對應到目標圖像的像素亮度 j，反之需要持續遞增 CDF² 的索引值 j，程式如下：
```cpp
int j = 0;
for (int i = 0; i < 256; i++) {
  while (j < 255 && CDF1[i] > CDF2[j]) j++;
  mapping[i] = j;
}
```
45）中間值濾波會讓高頻訊號減弱，因此對於物件的輪廓之細節表現不佳，而平均值濾波具有平滑效果，並且因此會讓輪廓也因為平滑而模糊

46）對於重設圖像大小（亦稱重定位）方法，可以直接使用線性收縮，例如要橫向收縮 n 倍，則需要從原有圖像的橫排中的每 n 個像素中取出 n-1 個像素，即平均每 n 個像素只保留一個像素作為結果

47）圖像中的每個像素對應的資訊量程度可以用能量圖表示，例如對於變化較大的部分，例如物體的輪廓，則該區塊的能量（資訊量）會大得多，反之如果與鄰近像素為同一個色塊，則能量（資訊量）越低

48）為了縮短或拉長圖像，可以利用裁剪接縫的技術，接縫表示從左到右（橫向）或從上到下（直向）當中資訊量最小的一連串離散像素所形成的像素線，該線的每一個鄰接像素之間的差距不能超過一個像素；為了在一張圖像中找到接縫（資訊量最小的線），可以使用遞迴式如下所示：
```
dp[0,j] = info[0,j]
dp[i,j] = info[i,j] + min(dp[i-1, j-1], dp[i-1, j], dp[i-1, j+1])
# 實務上會使用到動態規劃來計算
```

49）裁剪接縫在用於在垂直或水平方向縮短圖像時，會將資訊量最小的移除，因此拿走圖像中比較小的能量，會導致平均能量提高；裁剪接縫用於在拉長圖像時，會將資訊量最不重要的像素線加粗一倍，使得在圖像的總能量沒有太大的變化（資訊量不會變太多），因此新增圖像中較小的能量，會導致平均能量下降

50）裁剪接縫也可以用於物件移除，即是在移除資訊量較小的像素線的同時，只將碰到物件的像素線移除，移除物件之後，也可以透過加上訊息量低的接線來回復圖像原本的尺寸；由於使用水平或垂直的像素線來實作物件移除，會要求欲移除的物件與圖像中的其他物件之間，可以使用一條水平或者垂直方向的像素線將二者分離，否則如果無法乾淨的分割，就會造成相鄰物件也受到影響

51）裁剪接縫可以拓展到三維以構成一個像素曲面，可以讓影像在垂直或水平方向上收縮或拉伸的時候，在確保其中的每一張圖像壓縮的同時，也能令每張圖像之間的變化之差異較小，即是在影像中找到一個資訊量最低的連續曲面並移除（對應影像被縮短）或複製（對應影像被拉長）；縮短或拉伸的操作也可以適用於影片的時長

52）對於影像辨識中的算法，若處理的不是灰度圖而是彩圖，則需要將同樣的方法分別應用於各個顏色分量上，再加以合成即可；在 OpenCV 當中，可以使用 split 與 merge 函式來處理：
```cpp
void split(Mat inputImage, vector<Mat> &outputVector);
void merge(vector<Mat> &inputVector, Mat outputImage);

Mat src = imread("foo.jpg");
vector<Mat> channels;
split(src, channels);

for(auto &channel: channels) {
  handle(channels);
}

Mat tgt;
merge(channels, tgt);
```
53）由於一個事件的發生機率與其事件模型當中的事件數量呈反比，表示資料庫當中的事件越多，單一事件發生的機率越小，造成該事件發生時，其蘊含的資訊量會較大，因為有關該事件的資訊較少，故資訊量可以定義為 log(1/p(X))，而基於資訊量可以大致推測出該資料庫的資訊量，稱為熵（entropy），以期望值定義如下：

$\Sigma log\frac{1}{P(x)} × P(x) = -\Sigma logP(x) \times P(x)$

66）機器學習的過程是先蒐集資料，之後再進行數學建模並使用資料進行最佳化，最後根據完成的模型，推測當新資料傳入時，可以依照規律來得到特定的資訊，並將整個過程自動化：
資料蒐集：建立資料庫並正規化其中的資料；至少花費 80% 的時間
數學建模：可能需要領域知識來幫助模型更客觀
最佳化：即使用預處理的資料來填充先前所建立的數學模型
推測：根據最佳化的結果來將其應用到新資料上

67）機器學習的一個常見領域是圖像辨識，先透過領域知識來決定需要判別的特徵，再以各個特徵作為節點，而這些節點形成網路，在辨識時會從較小的部分（例如邊緣檢測），逐漸合併成較大的部分（例如更大的物件），透過這一層的特徵，可以推得出下一層的大特徵，而這一層的特徵，又取決於上一層的小特徵，而上層的每個特徵對當前節點可能有不同權重，隨著特徵傳遞的層數越多，其觀察的特徵會更宏觀

---

# 數位影像處理學習筆記

## 1. 影像的基本資料結構與格式

### 灰階影像
- 灰階影像使用單一整數（如 8-bit 整數）代表每個像素的亮度值。
- 儲存更省空間且可用於景深或簡化的影像分析應用。

### 彩色影像轉灰階
- 使用 RGB 色彩空間：R(紅)、G(綠)、B(藍)。
- 人眼對綠色最敏感，對藍色最遲鈍，轉換公式為：
  ```
  Gray = 0.1140 × B + 0.5870 × G + 0.2989 × R
  ```
- 實務上也可根據需求調整權重。
- 灰階化可降低參數維度，避免不必要的資訊造成分析誤差或過度擬合。

### OpenCV 的影像資料型態
- `CV_8UC3`：3 通道，8-bit 無符號整數，彩色影像。
- `CV_8UC1`：單通道灰階影像。
- Vec3b：表示三個 Byte 組成的彩色像素。
- `uchar`：單通道灰階像素型別。

## 2. 影像模糊與去噪

### 平均濾波（模糊）
- 將每個像素附近的區塊（如 n×n）取平均作為新值。
- 簡單實現模糊與降噪。

### 中值濾波（去噪）
- 將區塊內的中間值作為中心像素的新值，有效去除極端值（雜訊）。
- 適合處理椒鹽噪聲，但會損失邊緣清晰度。

### Gaussian 模糊
- 權重依據高斯函數，中心權重大，邊緣小，模糊效果更自然。
- 可調整標準差來控制模糊程度。

## 3. 感光與 HDR 原理

- 感光器需根據場景亮暗調整靈敏度，高感光會導致亮區過曝。
- HDR 透過不同曝光度拍攝多張照片，選擇每區最清晰者合成。
- 合成時使用資訊熵或平方差來計算圖像塊的清晰度。

## 4. 深度影像與 3D 攝影

- 雙鏡頭拍攝不同視角圖像後合成立體圖像。
- 3D 攝像機的立體感依眼距設計，可能產生個人差異。
- 混合相機與 360 度攝影機擴展了拍攝方式與應用彈性。
- 紅外線相機透過飛行時間或穿透特性捕捉深度資訊。

## 5. 濾波器與影像增強

### 高通濾波器（銳化）
- 強化圖像細節與邊緣，保留高頻成分。
- 與低通濾波（模糊）結合，可提取細節紋理：

```
[000]   [111]
[020] - [111] × 1/9
[000]   [111]
```

### 邊緣銳化感知（人眼）
- 人眼會誇大邊界差異，造成更強的輪廓感。

## 6. 邊緣偵測與微分運算

### 一階導數（差分）
- 離散圖像中 ∆ = 1，微分為 `f[t+1] - f[t]`

### Sobel 運算子
- 檢測水平與垂直邊緣：
```
Gx:
[+1 0 -1]
[+2 0 -2]
[+1 0 -1]

Gy:
[+1 +2 +1]
[ 0  0  0]
[-1 -2 -1]
```
- 邊緣強度：G = sqrt(Gx² + Gy²) 或 G = |Gx| + |Gy|

### Laplacian 運算子
- 檢查上下左右變化：
```
[0  1  0]
[1 -4  1]
[0  1  0]
```

## 7. 灰階與對比度分析

### 直方圖
- 使用長度為 256 的陣列統計每個灰階值出現次數。
- 對比度高：亮度分布廣；對比度低：集中。

### 直方圖均化
- 計算累積機率分布函數（CDF），將像素灰度拉伸以提升對比。
- 實現更豐富的亮度層次。


| 影像特徵描述 | 解釋 | 建議使用的轉換函數 | 效果預期 |
|------|-----|-----|-----|
暗部過多（太暗） | 灰階值多集中在低端（左邊） | 對數函數（Log Transform） | 增加亮度、展開暗部
亮部過多（太亮） | 灰階值多集中在高端（右邊） | 反對數函數 / 指數函數（Exp Transform） | 壓縮亮部、保留細節
亮度集中在中間（低對比） | 灰階值集中在中間、缺少高低灰階 | Histogram Equalization（直方圖均衡化） | 拉開灰階，提升對比
整體都很亮 | 灰階值分布偏右，但均勻 | Gamma Correction（γ > 1） | 壓暗亮部，讓圖更柔和
整體都不亮 | 灰階值偏左但均勻分布 | Gamma Correction（γ < 1） | 拉高亮度但保留細節


## 8. 影像變形與裁剪接縫

### 雙線性插值
- 圖像放大時根據鄰近 4 像素做加權平均。

### 能量圖與裁剪接縫
- 能量圖代表圖像的資訊量，輪廓變化大者能量高。
- 尋找最小能量接縫並移除（縮小）或複製（放大）。
- 接縫移除應用於物件移除或影片長度調整。

## 9. 色彩空間與通道操作

### 色彩比例與 Bayer 濾鏡
- 人眼對 RGB 敏感度比例約為 R:G:B = 3:6:1。
- Bayer 濾鏡排列為 G R / B G（二倍綠色像素）。

### OpenCV 通道操作
```cpp
split(Mat input, vector<Mat>& channels);
merge(vector<Mat>& channels, Mat& output);
```

## 10. 資訊論基本概念

### 資訊量與熵（Entropy）
- 資訊量定義： `I(x) = -log(P(x))`
- 熵定義為所有事件資訊量的期望值：

$H(X) = -\Sigma_i P(x_i) logP(x_i)$

- 常用於評估圖像中資訊的平均量與分布

## 11. 影像隱碼術與安全性應用

- 利用像素最低有效位元（LSB）嵌入資訊，如 QR Code。
- 不易被肉眼察覺，可作為隱藏資料傳輸方式。

# Image Filtering

## 一、影像與數位影像概念

### 1. 數位影像（Digital Image）
- 本質上是**像素（pixel）矩陣**。
- 每個像素代表在一個位置 (x, y) 上的**強度值（intensity）**。
- 灰階影像通常用單一值表示（0~255），彩色影像則用 R/G/B 三個通道。
- 在 MATLAB 中，影像矩陣操作如：
  - `im(y,x,b)` 取的是第 y 列第 x 欄第 b 個通道的像素值。

### 2. 色彩感知與轉換
- 常見灰階轉換公式：  
  `Gray = 0.114B + 0.587G + 0.2989R`
- 人眼對綠色敏感度最高，藍色最低。
- Munker-White illusion：色彩感知會受到**周圍環境影響**，顯示**視覺錯覺**的本質。

---

## 二、影像濾波（Image Filtering）

### 1. 定義
- 利用「鄰域運算（local operator）」處理影像。
- 每個像素值由其周圍像素的加權組合來決定。
- 可用於**影像增強、去噪、模糊、特徵擷取、邊緣偵測**等。

---

## 三、操作分類

### 1. 點運算（Point Operations）
- 僅針對單一像素進行操作：  
  `g(i,j) = h(f(i,j))`  
  - 例子：改變亮度與對比  
    `g(i,j) = a*f(i,j) + b`

### 2. 直方圖均衡化（Histogram Equalization）
- 目的：讓各亮度值出現的頻率更平均 → **增強對比**。
- 步驟：
  1. 計算亮度直方圖 H(z)
  2. 計算累積直方圖 C(z)
  3. 定義轉換函數 T(z)
  4. 套用至每個像素：`g(i,j) = T(f(i,j))`

### ✅ 題目：對以下 3×3 灰階圖進行直方圖均衡化（灰階值範圍為 0～7）

```
原圖：
3 1 1  
1 7 6  
0 2 1
```

---

### ✏️ 步驟 1：統計每個灰階出現次數（Histogram）

| 灰階值 | 次數 |
|--------|------|
| 0      | 1  
| 1      | 4  
| 2      | 1  
| 3      | 1  
| 6      | 1  
| 7      | 1  

總像素數：9

---

### ✏️ 步驟 2：計算機率 (PDF) 與累積機率 (CDF)

| 灰階值 | 機率 \( p_i \) | 累積機率 \( \text{CDF}(i) \) |
|--------|----------------|-----------------------------|
| 0      | 1/9 ≈ 0.11     | 0.11  
| 1      | 4/9 ≈ 0.44     | 0.11 + 0.44 = 0.55  
| 2      | 1/9 ≈ 0.11     | 0.55 + 0.11 = 0.66  
| 3      | 1/9 ≈ 0.11     | 0.66 + 0.11 = 0.77  
| 6      | 1/9 ≈ 0.11     | 0.77 + 0.11 = 0.88  
| 7      | 1/9 ≈ 0.11     | 0.88 + 0.11 = 0.99  

---

### ✏️ 步驟 3：計算轉換表

使用公式：

$$
s_i = \text{round}\left( (L - 1) \cdot \text{CDF}(i) \right) = \text{round}(7 \cdot \text{CDF}(i))
$$

| 原灰階 \( i \) | \( \text{CDF}(i) \) | 新灰階 \( s_i \) |
|----------------|---------------------|------------------|
| 0              | 0.11                | 1  
| 1              | 0.55                | 4  
| 2              | 0.66                | 5  
| 3              | 0.77                | 5  
| 6              | 0.88                | 6  
| 7              | 0.99                | 7  

---

### ✏️ 步驟 4：將原圖每個像素對應新灰階

```
原圖：           新圖：
3 1 1           5 4 4  
1 7 6    →      4 7 6  
0 2 1           1 5 4
```

---

### ✅ 最終結果（均衡化後圖像）

```
5 4 4  
4 7 6  
1 5 4
```

---

## 四、線性濾波（Linear Filtering）

### 1. 核心概念
- 每個輸出像素是其鄰域像素的**加權總和**：
  `h(i,j) = Σ f(i+k, j+l) * g(k,l)`
- 實現方式：**cross-correlation（互相關）**

### 2. 卷積（Convolution） vs. 互相關（Cross-Correlation）

概念 | cross-correlation（互相關） | convolution（卷積）
| -------- | -------- | -------- |
公式 | $g(x, y) = \Sigma f(x+u, y+v) \times h(u,v)$ | $g(x, y) = \Sigma f(x+u, y+v) \times h(-u,-v)$
是否翻轉 kernel | ❌ 不翻轉 | ✅ 翻轉（水平與都反向）
運算結果 | 幾乎相同（若 kernel 對稱） | 同上，但會有方向差異
實際應用 | OpenCV 中的 filter2D()，預設使用 cross-correlation | 有些理論分析（如傅立葉）使用 convolution


## 五、常見濾波器範例

### 1. 平滑濾波（Smoothing / Box Filter）
- 把像素值取周圍平均，降低雜訊、模糊圖像。
- Kernel 範例（Box filter）：

```
1/9 * [1 1 1
       1 1 1
       1 1 1]
```

### 2. 高斯濾波（Gaussian Filter）
- 模擬真實鏡頭模糊，效果比 Box filter 更自然。
- Gaussian kernel 為**旋轉對稱（isotropic）**，依標準差 σ 控制模糊程度。

### 3. 銳化濾波（Sharpening / Laplacian）
- 加強邊緣，公式：
  `h = f - k*(f * g)`，稱為**Unsharp Masking**
- Laplacian kernel：

```
[ 0  1  0
  1 -4  1
  0  1  0 ]
```

---

## 六、邊緣偵測（Edge Detection）

### 1. Sobel 濾波器（Sobel Filter）
- 用於提取垂直與水平邊緣：
  - 垂直：
    ```
    [-1  0  1
     -2  0  2
     -1  0  1]
    ```
  - 水平：
    ```
    [-1 -2 -1
      0  0  0
      1  2  1]
    ```

---

## 七、實作與效率考量

### 1. 高斯核可分離（Separable Kernel）
- 2D 高斯可拆解成 2 個 1D 濾波器，提升運算效率：
  `G(x, y) = Gx(x) * Gy(y)`

### 2. 卷積性質
- 線性、平移不變（shift-invariant）
- 可交換（commutative）、可結合（associative）、分配律成立。

### 3. 邊界處理（Padding）
- 影像邊緣處濾波器不完整，處理方式：
  - 0填充、延伸邊界、鏡射、環繞
  - MATLAB 指令如 `imfilter(f, g, 'replicate')`

---

## 八、非線性濾波（Non-linear Filtering）

### 1. 中值濾波（Median Filter）
- 適合去除 salt & pepper noise。
- 非線性濾波器，會**保留邊緣**。

---

## 九、雙邊濾波（Bilateral Filtering）

- 結合空間距離與像素值相似度加權的濾波器。
- 可以模糊同時保留邊緣。
- 公式概念：
  ```
  I'(p) = 1/W * Σ Gs(||p - q||) * Gr(|I(p) - I(q)|) * I(q)
  ```

# Texture Synthesis

### ● 基本概念
- 很容易辨識，但難以準確定義。
- 分為兩類：
  - **Deterministic / Regular**：規律的、像物體一樣（thing-like）
  - **Stochastic**：隨機的、像物質一樣（stuff-like）

### ● 相關任務
- 材質辨識與分類（discrimination, classification）
- 材質合成（texture synthesis）
- 根據材質推估形狀（shape from texture）
- 材質轉換（texture transfer）
- 視訊材質（video textures）

---

## 📌 二、Texture Synthesis 材質合成

### ● 定義
- 目的：**生成與給定材質樣本相似的新圖像區塊**
- 應用場景：
  - 虛擬環境建模
  - 修補（hole-filling）與圖像修復（inpainting）
  - 材質映射（texture mapping）
  - 圖像壓縮

---

## 📌 三、基本方法與挑戰

### 方法一：拷貝像素區塊（Block Copy）
- 直接將樣本中的小區塊貼在合成圖上
- 缺點：容易產生明顯接縫（block artifacts）

### 方法二：統計建模
- 將材質視為**隨機過程的重複試驗**
- 常見模型：**馬可夫隨機場（Markov Random Field, MRF）**
  - 每個像素只依賴附近像素的條件機率：  
    $p(pixel | rest) = p(pixel | neighborhood)$
- 滿足：
  - 定常性（stationarity）
  - 馬可夫性（只依賴鄰近像素）

---
<!---
## 📌 四、Efros & Leung Algorithm（1999）

### ● 演算法流程
1. **由小區塊成長**（“grow” output image）
2. 每次填一個像素
3. 找出樣本圖中與目前鄰近像素最接近的 patch
4. 隨機選一個，填入中心像素值

### ● 特點
- 非參數採樣（non-parametric sampling）
- 利用已知區域進行逐步擴展
- 需考慮鄰近像素匹配誤差（SSD）

---

## 📌 五、Texture Quilting（Efros & Freeman, 2001）

### ● 改進之處
- 以「**區塊**」為單位合成，而非逐像素
- 可大幅提升效率與視覺品質
- 使用「**最小誤差邊界切割**」動態規劃方法，避免接縫

---

## 📌 六、Texture Transfer（材質轉換）

- 將一張圖的材質「轉移」到另一張圖的形狀或輪廓上
- 結合：
  - 材質重建誤差（與樣本相似）
  - 對應誤差（與目標圖像對應區域相似）
- 誤差函數：
  $$
  Error = \alpha \cdot (overlap\_difference) + (1 - \alpha) \cdot (correspondence\_difference)
  $$

---

## 📌 七、加速技巧與進階方法

### ● Fast Texture Synthesis（Wei & Levoy, 2000）
- 使用**高斯金字塔（Gaussian pyramid）**
  - 由低解析度合成，逐層向上
- 每層的合成參考前一層已合成的內容

### ● Tree-Structured Vector Quantization (TSVQ)
- 建立樹狀索引以快速查找匹配區塊（取代暴力搜尋）

---

## 📌 八、其他擴展應用

### ● 擴展方式
- Hole Filling（修補缺損區域）
- Extrapolation（擴展圖像）
- Texture on Surfaces（合成到 3D 曲面上）
- Solid Texture（3D 材質體積合成）
- Multiscale Texture（多尺度材質合成）
  - 使用 **Exemplar Graph** 管理多尺度圖樣
  - **從粗到細（coarse-to-fine）**進行合成

---

## 📌 九、Image Analogies（Hertzmann et al., 2001）

### ● 基本概念
- 給定 A → A′ 的轉換樣本（如模糊、邊緣化）
- 對新圖 B 應用同樣效果，產生 B′
- 常見應用：
  - 模糊、銳化、邊緣濾波
  - 藝術風格轉換（Artistic Filters）
  - 超解析度（Super-Resolution）
  - 上色（Colorization）

---
## ✅ 總結

| 主題 | 技術 | 優點 | 缺點 |
|------|------|------|------|
| Efros & Leung | 逐像素合成 | 高品質、自然 | 非常慢、易greedy |
| Texture Quilting | 區塊合成 | 快速、易實作 | 較難處理大變化 |
| Texture Transfer | 材質轉移 | 可模擬風格化、藝術應用 | 難處理複雜幾何對應 |
| Pyramid-based Synthesis | 多尺度處理 | 可控制解析度與速度 | 架構與參數較複雜 |
| Tree-structured VQ | 加速搜尋 | 快速生成大圖 | 建立成本略高 |
| Image Analogies | 藝術處理與類比學習 | 適用於風格轉換與應用遷移 | 資料對齊需求高 |
```
--->

# Image Resizing / Retargeting）

### ● Image Retargeting 的目標
1. **改變圖像尺寸**（如寬高調整）
2. **保留重要內容與結構**
3. **避免視覺上明顯的失真與假象（Artifacts）**



## 📌 二、傳統方法的限制

| 方法 | 缺點 |
|------|------|
| Scaling（縮放）| 會導致變形（如人臉拉長） |
| Cropping（裁切）| 容易裁掉重要內容 |

---

## 📌 三、Seam Carving（接縫雕刻）

由 Avidan & Shamir 在 SIGGRAPH 2007 提出  
是一種 **內容感知式（content-aware）影像縮放方法**

---

### 🧠 核心概念
- **Energy function（能量函數）**：衡量像素的重要程度  
  越「不顯眼」的像素，其能量越低。
- **Seam（接縫）**：一條穿越整張圖的「細路徑」，通常是一條垂直或水平的連續像素路徑。

---

## 📌 四、能量函數（Energy Function）

常見的能量函數：
- **Gradient Magnitude（梯度幅值）** → 可以檢測邊緣
- Entropy、HOG、Saliency 等也可用

📷 能量圖示意：邊緣明顯的區域會有高能量，背景或平坦區域則能量低。

---

## 📌 五、如何找出 Seam？

透過 **動態規劃（Dynamic Programming）** 演算法：

### 🧮 Forward Pass（從上到下）
定義：
- M(i,j)：到達 pixel(i,j) 的最小能量
- 遞推式：  
  $$
  M(i,j) = e(i,j) + \min\left(M(i-1, j-1), M(i-1, j), M(i-1, j+1)\right)
  $$

### 🔙 Backward Pass
- 從最後一列找到最小值位置，**回溯整條 seam 路徑**

---

## 📌 六、Seam Carving 的應用

### 1. 縮小圖片（Image Shrinking）
- 每次移除一條 seam（最小能量路徑）
- 可重複進行以改變寬度或高度

### 2. 擴大圖片（Image Enlarging）
- 在低能量 seam 處插入像素
- 避免明顯的拉伸痕跡

### 3. 物件移除（Object Removal）
- 手動標記物件
- 強迫 seam 經過該區域，反覆移除直到物件不見

---

## 📌 七、最佳 Seam 移除順序（Optimal Seam Ordering）

如果要同時縮減 **寬度與高度**：
- 應該先移除水平 seam 還是垂直 seam？
- 解法：使用 **transport map（運輸圖）** 儲存最佳順序  
  定義一個矩陣 T(r, c)：縮減 r 行和 c 列的最小代價

---

## 📌 八、加速與多尺寸處理

### ● 預先計算 seam index map
- 每個像素記錄其是第幾次 seam 移除時被刪除
- 適用於即時或多尺寸輸出需求

---

## 📌 九、Seam Carving 的進階應用

| 應用 | 說明 |
|------|------|
| **內容放大（Amplification）** | 先等比放大，再用 seam carving 修正非重要區域 |
| **即時縮放（Multi-size output）** | 利用 seam index map 快速產出各種尺寸 |
| **避免破壞區域** | 標記不可穿越區域，防止 seam 破壞物件結構 |

---

## 📌 🔴 錯誤案例與限制（Failures）

- 內容過於密集，seam 難以避開重要區域
- 多次 seam 移除可能會出現扭曲（如臉部變形）

---

## 📌 🔍 評估與研究現況

- 目前缺乏**標準評估方法**
- 許多方法仍以視覺效果比較為主
- 建立 benchmark（如：RetargetMe dataset）是重要進展

---

## ✅ 總結

| 方法 | 優點 | 缺點 |
|------|------|------|
| Seam Carving | 保留關鍵內容 | 計算耗時、對複雜內容失效 |
| Scaling | 速度快 | 容易變形 |
| Cropping | 保留解析度 | 易刪除重點 |
| 多重策略混合 | 結合多種操作（如 Multi-Operator） | 複雜、難以最佳化參數 |

# 考古

![image](https://hackmd.io/_uploads/HJ5900a0ke.png)


### (1) Histogram Equalization（15%）

- **Fig.1(a)**: 偏向暗部（左邊）的像素多 → 應該將低灰階映射拉開、增加對比 → log
- **Fig.1(b)**: 分佈近似常態分布 → 轉換函數應為 **S型 Sigmoid 曲線**，中間擴張、兩端壓縮
- **Fig.1(c)**: 均勻分佈，已是均勻 → exp

---

### (2) 兩階段壓縮（6%）

1. **去除冗餘（redundancy reduction）**：例如 Entropy Encoding（Huffman, Arithmetic）
2. **去除不重要資訊（irrelevancy reduction）**：例如量化（Quantization）、人眼不敏感資訊移除（如高頻部分）

---

### (3) 建立 Huffman Tree（5%）

- 符號及機率：
  ```
  a1: 0.2, a2: 0.4, a3: 0.2, a4: 0.1, a5: 0.1
  ```

- 步驟：
  1. 合併 a4 (0.1) + a5 (0.1) → node A: 0.2
  2. 合併 node A (0.2) + a1 (0.2) → node B: 0.4
  3. 合併 a3 (0.2) + a2 (0.4) → node C: 0.6
  4. 合併 node B (0.4) + node C (0.6) → root

- 編碼（其中一種可能）：
  ```
  a2: 11, a3: 10, a1: 01, a4: 000, a5: 001
  ```

---

### (4) 平均長度與熵比較（4%）

- 平均長度 L = ∑ P(ai) × length(codeword)
  ```
  = 0.4×2 + 0.2×2 + 0.2×2 + 0.1×3 + 0.1×3 = 2.2 bits
  ```

- 熵 H ≈ 
  ```
  H = -∑ P(ai) log2(P(ai)) ≈ 2.12 bits
  ```

- 所以平均長度 > 熵，**不能小於熵（Shannon 下限）**

---

### (5) 改進 Huffman Coding（6%）

- 改進方式：**Arithmetic Coding**
  - 優點：能更接近熵下限，處理非整數位長
  - 缺點：計算複雜度較高，實作不易

---

### (6) KLT vs. DCT（6%）

| 項目 | KLT | DCT |
|------|-----|-----|
| 定義 | 基於影像統計協方差矩陣做特徵分解 | 固定的餘弦基底 |
| 優點 | 能取得最佳能量壓縮 | 計算快速、適合硬體實作 |
| 缺點 | 計算昂貴、需根據影像變動 | 能量壓縮略遜於 KLT |

### (7) Transform Coding 圖示說明（8%）

- 每張圖像分成小區塊（block）
- 對每塊進行 DCT → 得到係數（DCT coefficients）
- 進行量化（Quantization） → 只保留重要係數（資訊壓縮）
- 最後重建圖像
- 核心概念：**將空間域轉換為頻率域，再刪去高頻雜訊、保留低頻重要資訊**

### (8) 視訊壓縮與影像壓縮差異（5%）

- **影像壓縮**：單張圖像
- **視訊壓縮**：利用「時間上的冗餘」，如 GOP 結構中的 I/P/B frame，僅儲存前後幀差異，壓縮效率更高

### (9) 影像對比的變化問題（6%）

- 兩次相同的線性對比調整後，圖像會**失真**，因為第一次的壓縮已造成資訊損失（量化誤差）
- 因此 Y 經過兩次操作後不會還原為 X

### (10) 人眼對 RGB 敏感度（6%）

- **對綠色 G 最敏感**
- 因為人眼中感光細胞對綠光（M cone）最密集
- 所以圖像處理如轉灰階時給予綠色較高權重（如 0.587）

### (11) Afterimage Effect（6%）

- **殘影效應**：長時間注視某種顏色後快速轉向白色背景，會看到補色殘像
- 原因：視覺感受器疲勞，對應顏色通道未立即恢復所致

![image](https://hackmd.io/_uploads/HyTKC0aRkl.png)

### (12) 請解釋「不確定性關係 (The Uncertainty Relation)」
不確定性關係是指在訊號處理或影像處理中，空間域（位置）與頻率域（變化速度）之間的權衡。根據不確定性原理，我們無法同時在空間與頻率上取得非常高的解析度。舉例來說，如果你希望在影像中準確定位邊緣（高空間解析度），你就會損失一些頻率資訊，反之亦然。

### (13) 請根據圖表簡要解釋亮度感知 (brightness perception)
圖中顯示實際亮度（x軸）與人眼感知亮度（y軸）的關係。顯示人眼對亮度的感知是非線性的：對暗部變化較敏感，對高亮度變化則較遲鈍。

### (14) 給定一張影像 X，如果將其色相加上 360 度會發生什麼？
色相是循環性的，360 度代表一整圈。因此，加上 360 度等於沒變，所以影像色彩不會改變，顯示效果與原圖相同。

### (15) 請設計一個基於一階導數的垂直邊緣偵測器
垂直邊緣偵測可透過一階微分來實現，常見的方法為使用如下的卷積遮罩（kernel）：

```
[-1 0 1]
[-2 0 2]
[-1 0 1]
```

此 kernel 可以沿著 Y 方向偵測垂直邊緣，因為它計算上下像素的強度變化。

### (16) 在 RGB 中人類對哪種顏色更敏感？為什麼？
人類對綠色 (G) 更敏感。這是因為人眼視網膜上最多的是對綠光敏感的視錐細胞（M-cones）。此外，在影像壓縮中也會更強調保留綠色通道資訊。