Learning Objectives
- 用像素、解析度與色彩深度描述一張數位影像,算出未壓縮的大小
- 說明聲音數位化的兩個步驟:取樣與量化,以及取樣率要超過訊號頻率兩倍的原因
- 算出一段未壓縮聲音每秒的資料量
- 用連續長度編碼(RLE)理解壓縮,分辨無失真壓縮與失真壓縮
照片和聲音怎麼變成位元
手機拍的一張照片,檔案大約幾 MB;傳到通訊軟體之後,對方收到的檔案小了很多,放大看還有一點模糊。 一首歌從串流平台播放,傳過來的資料量也比 CD 上的原始音訊小很多。
前兩課講了數字與文字怎麼變成位元。這一課處理真實世界裡連續的東西:
- 一張影像怎麼切成像素、每個像素的顏色怎麼存?檔案為什麼這麼大?
- 聲音是連續的波,怎麼變成一串數字?每秒要存多少資料?
- 壓縮為什麼能讓檔案變小?為什麼有些壓縮會讓畫質變差,有些不會?
把連續的訊號變成有限個數字的過程,叫做數位化(digitization)。它都包含兩件事:在哪些地方量(切成像素、每秒量幾次)與每次量到的值用幾個位元記。
像素、解析度與色彩深度
數位影像(點陣圖)把畫面切成一格一格的像素(pixel),每格只記一種顏色:
| 名詞 | 意思 | 例子 |
|---|---|---|
| 解析度 | 寬和高各有幾個像素 | 1920 × 1080 共約 207 萬個像素 |
| 色彩通道 | 螢幕用紅(R)、綠(G)、藍(B)三種光混出顏色,每個像素存三個數字 | 純紅是 (255, 0, 0),白色是 (255, 255, 255) |
| 色彩深度 | 每個通道用幾個位元 | 常見每通道 8 位元,可以表示 0~255,三個通道合計 24 位元 |
每個像素 24 位元時,可以表示 2²⁴ = 16,777,216 種顏色,俗稱「全彩」。
未壓縮的大小 = 寬 × 高 × 每個像素的位元數 ÷ 8(換成位元組):
1920 × 1080 × 24 ÷ 8 = 6,220,800 位元組,約 6.2 MB
解析度越高、色彩深度越大,畫面越細緻,檔案也越大。另一種影像是向量圖(例如 SVG),存的是「從這裡畫一條線到那裡」的指令,放大不會出現格子,適合圖示與文字。
取樣與量化
聲音是空氣壓力隨時間連續的變化,麥克風把它變成連續變化的電壓(類比訊號)。數位化分兩步:
| 步驟 | 做什麼 | 決定什麼 |
|---|---|---|
| 取樣(sampling) | 每隔固定時間量一次電壓;每秒量幾次叫取樣率,單位 Hz | 能記錄多高的頻率 |
| 量化(quantization) | 量到的值四捨五入到最接近的一階,用固定位元數存;位元數 n 可以分成 2ⁿ 階 | 細微的大小變化記得多精細,誤差會變成雜音 |
取樣率要夠高:要記錄一個頻率的聲音,取樣率必須超過它的兩倍,否則取到的點會連成另一個頻率,甚至完全看不出原來的波(奈奎斯特取樣定理)。 人耳大約聽得到 20 Hz 到 20,000 Hz 的聲音,所以音樂 CD 的規格選了每秒取樣 44,100 次、每個取樣 16 位元、左右兩個聲道(1980 年 Sony 與 Philips 制定的 CD 規格)。
未壓縮的資料量 = 取樣率 × 量化位元數 × 聲道數(每秒的位元數):
44100 × 16 × 2 = 1,411,200 位元/秒 = 176,400 位元組/秒
一分鐘:176,400 × 60 = 10,584,000 位元組,約 10.6 MB
電話與語音通話只需要聽得清楚人聲,用的取樣率低很多,資料量也小很多。
想一想:算算資料量
一張 100 × 100 像素、每個像素 24 位元的圖片,未壓縮時是幾個位元組?
一段錄音的取樣率是 8000 Hz,它最多能正確記錄多高頻率的聲音?
量化位元數從 8 位元增加到 16 位元,每個取樣點能表示的「階數」變成原來的幾倍?
壓縮:無失真與失真
未壓縮的影像與聲音很大,壓縮利用資料裡的重複與規律讓它變小。分兩大類:
| 類型 | 解壓縮後 | 例子 | 適合 |
|---|---|---|---|
| 無失真壓縮(lossless) | 和原本一模一樣 | ZIP、PNG、FLAC | 文件、程式、試算表、需要精確的圖 |
| 失真壓縮(lossy) | 和原本不完全相同,丟掉人眼人耳不容易察覺的細節 | JPEG、MP3、AAC、常見的影片格式 | 照片、音樂、影片 |
最簡單的無失真壓縮是連續長度編碼(Run-Length Encoding,RLE):把連續相同的值記成「長度+值」。
原始:WWWWWWBBBWWWWB(14 個值)
RLE:6W 3B 4W 1B(4 段,8 個值)
RLE 對大片同色的圖(圖示、掃描的文件)很有效;但如果顏色一直換,每段都只有 1 個,反而比原本還大。實際的格式會組合好幾種方法,例如 PNG 先預測每個像素和旁邊像素的差,再用類似 ZIP 的方法壓縮。
失真壓縮的檔案小很多,但每次重新編碼都會再丟掉一些細節:同一張 JPEG 反覆編輯、存檔,畫質會越來越差。影片是每秒很多張畫面加上聲音,相鄰畫面通常只有一小部分在動,所以影片格式大多只存「和前一張不一樣的地方」。
一步一步做 RLE 壓縮與解壓縮
i 指著目前這一段的開頭,j 往右走,直到顏色改變;j - i 就是這一段的長度。看上方格子裡兩個指標怎麼移動,以及 runs 一段一段增加。最後照著(長度, 值)展開,檢查和原本是否相同。
想一想:壓縮
下面的程式會印出什麼?
s = 'AAAABBBCCD'
out = ''
i = 0
while i < len(s):
j = i
while j < len(s) and s[j] == s[i]:
j += 1
out += str(j - i) + s[i]
i = j
print(out)
要把一份期末報告的程式碼與試算表打包寄給老師,解壓縮後必須一字不差,應該用哪一種壓縮?
同一張 JPEG 照片反覆「開啟、編輯、存檔」很多次,畫質會怎樣?
重點整理
- 數位化包含兩件事:在哪些地方量(像素、取樣)與每次的值用幾個位元記(色彩深度、量化位元)。
- 影像:未壓縮大小 = 寬 × 高 × 每像素位元數 ÷ 8;每通道 8 位元、三個通道的全彩有 2²⁴ 種顏色。
- 聲音:取樣率要超過訊號頻率的兩倍;量化位元 n 可分成 2ⁿ 階;每秒資料量 = 取樣率 × 量化位元 × 聲道數,CD 是 44,100 × 16 × 2 位元。
- 壓縮利用資料的重複與規律:無失真壓縮(RLE、ZIP、PNG)可以完全還原,失真壓縮(JPEG、MP3)丟掉不易察覺的細節換取更小的檔案。
- RLE 適合大片相同的資料,顏色一直變化時反而會變大。
下一課:資料的表示告一段落。接下來看電腦怎麼「計算」:從最基本的 AND、OR、NOT 邏輯閘開始。