這一頁要帶你用「看圖說故事」的方式,學完第七章的全部重點:怎麼把一張圖、一段聲音,濃縮成電腦能懂、能分辨的「特徵數字」。中間穿插 7 個可動手玩的互動示範,配合後面的 Python 筆記本,學完馬上能用。
這是一份「自學即戰力」導向的教材,不是教科書閱讀器。請照這個節奏使用:
主線 A(影像特徵 7.2–7.4)與主線 B(音訊特徵 7.5)各自獨立;先看地圖定位,再往下逐 Part 學習。完整版本(含學習基石與知識卡)見 00-知識地圖.md。
| 站 | 主題 | 難度 | 時數 | 動手(筆記本) |
|---|---|---|---|---|
| 0 | Python 熱身 | ★ | 1h | nb0 |
| 1 | ★ R0 為什麼要特徵 + A1 一階統計 | ★ | 2h | nb1 |
| 2 | ★ A2 共生矩陣 + A3 游程 | ★★ | 3h | nb1(對課本 7.8/7.12) |
| 3 | A4 Laws + A5 Hu 不變矩(+A6 Zernike) | ★★ | 3h | nb2 |
| 4 | ★ 形狀:A8 傅立葉描述子・A9 鏈碼・A10 幾何 | ★★ | 3h | nb2 |
| 5 | ★ B1 切幀/窗 + B4 頻譜 + B5 時域 | ★★ | 3h | nb3 |
| 6 | ★ B2 倒頻譜 + B3 MFCC(王者) | ★★★ | 3h | nb3(手刻 MFCC) |
| 7 | ✚ A7 AR 模型・A11 碎形(選修) | ★★★ | 2h | nb2 附錄 |
| 8 | 🏆 即戰力迷你專案 | ★★★ | 4h | nb4(紋理 kNN 96.7%/拍手 100%) |
想像這個處境:你拿到一張 64×64 的小圖。對電腦來說,它是 4,096 個數字(每個像素一個亮度值)。問題來了:
「讀取」圖片裡的區域資訊(紋理:平滑或粗糙?)與物體形狀(輪廓:圓的?有幾個洞?)。代表應用:醫學影像、遙測衛星、機器人視覺、光學字元辨識 OCR。
「聽取」音訊的頻譜與時間結構(有多亮?音高多少?是穩定的樂音還是雜訊?)。代表應用:語音辨識、音樂類型分類、影片內容檢索。
「紋理(texture)」沒有嚴格定義,但我們都會說:這張圖看起來粗或細、平滑或粗糙、均勻或雜亂。本 Part 教你把這些「感覺」變成數字。
做法只有三步:把圖片區域的每個像素亮度值拿出來 → 統計「每個灰階值出現的比例」得到直方圖(histogram)→ 從直方圖算出幾個數字當特徵。
| 特徵 | 公式留印象 | 白話意義 | 數字大代表… |
|---|---|---|---|
| 平均值 Mean | $m_1 = E[I]$ | 整體亮度 | 畫面偏亮 |
| 變異數 Variance | $\mu_2 = \sigma^2$ | 亮度的分散程度 | 明暗差異大 |
| 偏斜度 Skewness | $\mu_3$ | 直方圖左右不對稱 | 大多偏暗(或偏亮) |
| 峰態 Kurtosis | $\mu_4$ | 直方圖的高瘦/矮胖 | 高瘦 = 灰階集中在某些值 |
| 熵 Entropy | $H=-\sum_I P(I)\log_2 P(I)$ | 灰階的「豐富度」 | 直方圖越均勻 → 熵越高 |
升級思路:一階統計漏掉了「空間關係」。共生矩陣(co-occurrence matrix / 空間相依矩陣)補上這個洞——它統計:在「距離 $d$、方向 $\phi$」的相對位置上,灰階值 $(i,j)$ 的像素對出現的機率。
方向 $\phi$ 有四種:0°(水平)、45°(主對角)、90°(垂直)、135°(反對角);距離 d 通常先取 1(相鄰像素)。
| 特徵 | 公式 | 白話 | 粗紋理 / 平滑圖 |
|---|---|---|---|
| ASM 角二階矩 Angular 2nd Moment | $\sum_i\sum_j P(i,j)^2$ | 矩陣的「集中度」=平滑度 | 粗圖低、平滑圖高(→1) |
| CON 對比度 Contrast | $\sum_n n^2\sum_{|i-j|=n}P(i,j)$ | 鄰近像素亮度差多大 | 粗糙圖很高(如 989!) |
| IDF 反差分矩 Inverse Diff. Moment | $\sum_i\sum_j\frac{P(i,j)}{1+(i-j)^2}$ | 反过来的對比度 | 平滑圖高(→0.78) |
| 熵 Entropy | $-\sum_i\sum_j P(i,j)\log_2 P(i,j)$ | 排列的隨機性 | 平滑圖低、粗糙圖高 |
繪製中的藍色點對 = 你在右邊矩陣點選的格子 (i,j) 對應的像素對
| 共生矩陣 $A$(4×4,數值 = $\eta_{ij}/R$) |
|---|
✅ 0°(水平)的結果與課本 (7.8) 完全一致(R=24)。45°/135° 的課本印刷範例矩陣在不同版本間方向定義略有出入——重點是方法:都是「數像素對 → 除以總對數」。點矩陣格子反查像素對,最多能看懂的就會懂 😉
另一種看空間關係的方法:沿著某個方向掃過圖片,把「連續相同灰階的像素串」叫做一個游程(run)。統計「灰階 i 出現長度為 j 的游程有幾次」→ 得到游程矩陣 $Q_{RL}(i,j)$ → 從中算特徵。
還有 GLNU(灰階不均勻度)、RLN(游程長度不均勻度)、RP(游程比例)。
| Fig 7.3 實測(課本 Table 7.3) | SRE | LRE | GLNU | RLN | RP |
|---|---|---|---|---|---|
| 粗紋理(grass) | 0.932 | 1.349 | 255.6 | 3108 | 0.906 |
| 平滑 | 0.563 | 16.929 | 71.6 | 507 | 0.4 |
| 游程矩陣 Q_RL(列 = 灰階 0–3,欄 = 游程長度 1–4) |
|---|
一句話:用 9 個 3×3 的「濾鏡(遮罩 mask)」掃過圖片,每個濾鏡抓一種紋理性質,得到 9 張「特徵圖」,再從特徵圖算一階統計當特徵。
9 個 mask 由三條基本向量兩兩交叉相乘產生:[1,2,1]=局部平均(平滑)、[−1,0,1]=邊緣偵測、[−1,2,−1]=斑點偵測:
| 1 2 1 2 4 2 1 2 1 | −1 0 1 −2 0 2 −1 0 1 | −1 2 −1 −2 4 −2 −1 2 −1 |
| −1 −2 −1 0 0 0 1 2 1 | 1 0 −1 0 0 0 −1 0 1 | 1 −2 1 0 0 0 −1 2 −1 |
| −1 −2 −1 2 4 2 −1 −2 −1 | 1 0 −1 −2 0 2 1 0 −1 | 1 −2 1 −2 4 −2 1 −2 1 |
場景切換:現在我們不管紋理了,專注在物體的輪廓形狀。業界動機:醫學影像靠「形狀不規則 → 惡性腫瘤機率高」判讀;OCR 靠形狀認字——而且都要能不在乎物體的位置、大小、旋轉。
把影像當成一塊「蛋糕」:亮度值 = 密度。矩就是蛋糕的各種統計量——質心(一階矩)、「轉動慣量」(二階矩)等等。重點是課本證明了:矩可以完全重建回影像(資訊零流失),所以它是優良特徵。
Table 7.4 實測:縮放、旋轉 15°/90°/180° 後 $\phi_1..\phi_6$ 幾乎不變(93.13 → 94.28…);唯獨鏡射版 $\phi_7 = −0.53$ 變號!
🖱️ 在灰色畫布上按住滑鼠畫圖(白色=前景)
| Hu 不變矩 | 目前 | 原始 | 誤差 % |
|---|---|---|---|
| $\phi_1$ | – | – | – |
| $\phi_2$ | – | – | – |
| $\phi_3$ | – | – | – |
| $\phi_4$ | – | – | – |
| $\phi_5$ | – | – | – |
| $\phi_6$ | – | – | – |
| $\phi_7$ | – | – | – |
幾何矩的小毛病:它的基底函數 $x^p y^q$ 彼此「不垂直」(非正交)→ 資訊會重複。Zernike 矩改用單位圓內的正交多項式當基底 → 資訊不重複、旋轉不變性更好、抗雜訊更強(字元辨識實測勝過 Hu)。代價:徑向多項式計算較複雜。
換一個世界觀:前面的特徵都是「從影像算數字」。AR 模型反過來——假設影像/訊號是被某個「產生機制」製造出來的,而機制本身可以被「線性預測 + 隨機擾動」描述:
參數 $a(1)..a(p)$ 本身 = 特徵——不同紋理/不同聲音有不同「產生機制」,參數就不同。求解 = 最小化預測誤差 → 解線性方程 $R a_p = r_p$(7.31)。矩陣 $R$ 是 Toeplitz 結構 → 有 Levinson 快速演算法 $O(p^2)$。
把輪廓當「訊號」處理:沿輪廓取 N 個點 $(x_k,y_k)$,組合成複數 $u_k=x_k+jy_k$,對這串複數做 DFT → 係數 $f_l$ 就是傅立葉描述子(Fourier descriptors)。超棒的性質(課本 7.41 附近):
| 幾何變換 | 對傅立葉係數的影響 | → 不變性的做法 |
|---|---|---|
| 平移 | 只動 $f_0$ | 丟掉 $f_0$ 不用 |
| 旋轉 | 全部係數乘 $e^{j\theta}$(只轉相位) | 用大小 $|f_l|$ |
| 縮放 | 全部係數等比例放大 | 用比值 $f_i/f_j$ |
| 取樣起點不同 | 相位平移 | 正規化 $\hat{f}_l=f_l e^{jl\phi_1}$(7.42) |
把輪廓翻譯成「方向語言」:沿輪廓一步一步走,每一步用數字記錄方向(4 方向碼或 8 方向碼:0=右、1=右上、2=上…)。整條輪廓 = 一串方向編號,叫鏈碼。
鏈碼的兩個弱點與解藥:① 編碼很長 → 用方向出現次數比例(8 個方向 → 8 個特徵)當摘要;② 對雜訊敏感 → 先用較粗網格重新取樣再編碼。曲率特徵:統計「凸角(外角 <180°)」「凹角」出現比例(共 16 個特徵)。
為了一個簡單的「L 形」輪廓(5×5 網格),我們用 8 方向鏈碼編碼它的外緣。開始吧!
最直覺的形狀特徵,全部一筆算出(筆記本 2 用 skimage.measure.regionprops 一次拿齊):
| 特徵 | 公式 | 用途 |
|---|---|---|
| 周長 Perimeter | $P=\sum_i\|\mathbf{x}_{i+1}-\mathbf{x}_i\|$ | 大小估計 |
| 面積 Area | A = 區域內像素數 | 大小估計(課本:肺結節周長 >3cm → 惡性機率高!) |
| 圓度 Roundness | $\gamma=\frac{P^2}{4\pi A}$ | 圓形時 =1;越扁越大——「不規則邊界 → 惡性」的量化 |
| 方向 Orientation | $\theta=\frac{1}{2}\tan^{-1}\left(\frac{2\mu_{11}}{\mu_{20}-\mu_{02}}\right)$ | 物體主軸角度(最小慣性軸) |
| 離心率 Eccentricity | $\varepsilon=\frac{(\mu_{20}-\mu_{02})^2+4\mu_{11}}{A}$ | 拉長程度 |
| 孔洞數 Holes | — | 🎯 區分「8」和「0」的關鍵(外觀一樣圓!) |
先來個小魔術:海岸線的長度,用 1 公里的尺量是 X 公里;換成 100 公尺的尺,會量出更長!尺越細,長度越長,趨近無限大。這不是測量誤差——而是因為海岸線真的「每一段放大都長得跟原本一樣」:自相似性(self-similarity)。
應用場景:語音辨識、音樂類型分類、影片槍戰場景偵測(聽槍聲!)、哼歌找歌。核心挑戰:聲音是「一直在變」的訊號,我們要想辦法把它變成可分類的特徵。
問題:傅立葉轉換(頻譜分析)只對「統計性質不變」的平穩訊號有效,但語音/音樂隨時在變(「非平穩」)。
解法(聰明又樸素):把聲音切成一幀一幀(frame,約 10–50 ms),假設每幀內「大致穩定」(準平穩 quasistationary),就可以對每幀放心做頻譜分析。切幀 = 乘上一個「窗函數」(矩形窗最樸素;Hamming 窗兩端平滑收斂,減少頻譜洩漏)。
| 訊號類型 | 取樣率 | 合理幀長 | 對應時間 |
|---|---|---|---|
| 語音 | 10 kHz | 100–200 點 | 10–20 ms |
| 音樂 | 44.1 kHz | 2048–4096 點 | 45–95 ms |
原始訊號 + 目前幀的位置(綠色框)
被窗函數「切」出來的幀(乘上窗的結果 = 綠色實線,窗形 = 灰色虛線)
🎧 這是一個「兩段音樂」的合成訊號:前 40% 是穩定的弦音(正弦波),後面是快速變化的琶音。注意 Hamming 窗如何讓幀的兩端平滑地收斂到零。
一個超棒的數學魔術:我們聽到的聲音 = 「聲帶製造的聲源」×「嘴型(聲道)的濾波效果」。在時間域它們是相乘(卷積),不好分開;但若對頻譜取 log,乘法就變成加法,再反傅立葉一次,兩者會自動分家、住到不同的位置:
實作 4 步(課本 7.5.2 結尾):① 幀尾補零(512–1024 個,減少 aliasing)→ ② 做 M 點 DFT → ③ 對大小取 log → ④ 逆 DFT → 得到倒頻譜係數。
人耳的真相:我們對頻率的感受不是線性的——1000 Hz 以下線性,以上變對數(課本 Fig. 7.21:10 kHz 的純音,聽起來只比 1 kHz「高三倍」→ 3000 mel)。另外人耳有「臨界頻帶」:太靠近的兩個音分不出來。MFCC 就是模仿人耳來設計特徵:
上圖:線性頻率軸上的三角濾波器;下圖:同一組濾波器攤在 mel 刻度上(等距!)。
| 特徵 | 公式 | 白話=它量什麼 |
|---|---|---|
| Spectral Centroid 頻譜重心 | $C(i)=\frac{\sum_m m|X_i(m)|}{\sum_m |X_i(m)|}$ | 能量偏重高頻還低頻?高 →「明亮」的聲音 |
| Spectral Roll-off 頻譜滾降點 | $\sum_{m=0}^{m_c^R(i)}|X_i(m)|=\frac{c}{100}\sum_m|X_i(m)|$($c$ ≈ 85–90) | 頻譜的「歪斜」程度,另一個能量位置指標 |
| Spectral Flux 頻譜通量 | $F(i)=\sum_m\big(N_i(m)-N_{i-1}(m)\big)^2$ | 相鄰兩幀頻譜變化量 → 聲音「變得多快」(= 事件邊界偵測神器) |
| Fundamental Freq. 基頻(音高) | $f_0$:頻譜峰值頻率的 $\mathrm{GCD}$(Schroeder 法) | 樂器/濁音的基本週期(男聲 80–200 Hz、女聲 150–350 Hz)。課本 Fig 7.23 單簧管範例:基頻 230 Hz 居然不在頻譜上,但耳朵與演算法都聽得出來! |
| 特徵 | 公式 | 白話 |
|---|---|---|
| Zero-Crossing Rate 零交越率 ZCR | $Z(i)=\frac{1}{2N}\sum_n|\mathrm{sgn}[x_i(n)]-\mathrm{sgn}[x_i(n-1)]|$ | 訊號穿越零線的頻率 → 「吵雜程度」(清音/雜訊高,濁音/樂音低) |
| Energy 能量 | $E(i)=\frac{1}{N}\sum_n |x_i(n)|^2$ | 大小聲 → 分「有聲/無聲/清音/濁音」 |
讀講義只能懂 30%,跑完筆記本才是真的會。所有筆記本都在 handson/ 資料夾,逐格執行(Shift+Enter),每個練習都附「你應該看到什麼」的解說。
合成 3 類紋理圖 → 一階統計 → 共生矩陣(手寫 + graycomatrix 對照)→ 游程特徵 → Laws 9 遮罩。
對應 Part 2
Hu/Zernike 矩的旋轉縮放測試 → 傅立葉描述子(前 10 係數重建輪廓)→ 鏈碼 → regionprops 幾何特徵 → 附錄:AR 模型 + Koch 雪花。
對應 Part 3–4
合成訊號 → 切幀/窗函數 → 頻譜特徵(centroid/rolloff/flux)→ ZCR/能量 → 手刻 MFCC + librosa 對照 → 音高估計。
對應 Part 5
用 Notebook 1 的知識,把「平滑/粗糙/條紋」三類紋理圖抽成特徵向量 → 用 kNN 分類 → 畫出特徵空間散佈圖,證明「特徵真的能把類別分開」。
合成「脈衝聲」與「和絃聲」,算 ZCR/頻譜通量/MFCC 軌跡 → 用閾值規則判別 → 畫出兩者的特徵軌跡對比圖。
▲ 箭頭 = 發展路徑:先到「中繼站」補齊機器學習理論(課本 Ch3–Ch5),再選一條主線深耕,最終匯入多媒體/AI 系統開發與技術創新。