電腦圖像學

**電腦圖像學**（）係研究電腦圖像嘅一個電腦科學子領域。

## 二維圖像

### 點陣圖

一幅點陣圖（raster image）由若干粒像素（pixel）組成。一部電腦所顯示嘅點陣圖每一幅都係由一大柞像素所組成嘅，每一粒像素都有一個坐標記住佢喺邊個位置，並且有一隻色水，隻色水係由唔同濃度嘅紅、綠、同藍結合形成（例如紅溝藍會出紫），從而一齊組成一幅圖。舉個例說明，喺用紅綠藍色彩模式（RGB model）將一幅圖存入去佢嘅記憶體嗰陣，部電腦會記住類似
  [207, 229, 78], [141, 159, 138], [146, 109, 81], ...]
噉嘅一系列數字，每組數字有三個數，每個最細可以係 0 最大可以係 255，第一個數代表嗰一點有幾多紅（R），第二個數代表嗰一點有幾多綠（G），而第三個數代表嗰一點有幾多藍（B），而成串嘢當中有 <math>n</math> 組「每組三個數」嘅數－<math>n</math> 就係幅圖嘅像素；最後形成一個[矩陣，令到部電腦可以記住幅圖嘅樣。

一幅點陣圖嘅解像度（resolution）係指幅圖有幾多粒像素（n），解像度愈高，幅圖就會愈精細，但同時亦都需要嘥更多嘅記憶體嚟保存。廿一世紀嘅電腦經已先進到幅幅圖像都閒閒地都有過 1,000,000 粒像素，用佢哋整嘅圖像就噉用肉眼睇望落好似冇點點噉，但係無論一幅電腦圖像幾精細都好，如果靠得夠近，係可以睇到佢由一點點組成嘅。

### 向量圖像

向量圖像（vector graphics）係相對於點陣圖嘅一種圖像記憶法。點陣圖嘅做法將一幅圖像以一大柞像素同埋「每粒像素係乜嘢色水」嘅方式嚟代表，並且要部電腦死記住每粒像素嘅色水數值。相比之下，向量圖像用嘅係一種冇咁靠死記嘅做法：喺向量圖像當中，部電腦會記住幅圖有啲乜嘢形狀同每個形狀喺乜嘢位置（每種形狀都可以用一條數學式表達；睇幾何學），仲有係幅圖每一忽係乜嘢色水，當個用家想睇幅圖像嗰時，部電腦再用呢啲資訊即場砌返幅圖出嚟。例：部電腦記住一幅向量圖像當中背景係白色，有一個紅色嘅圓形，圓形直徑係幾多幾多，圓心坐標喺邊（唔使好似點陣圖噉死記一大柞數字），然後當個用家叫部電腦顯示幅圖像嗰時，部電腦就即刻按照佢所知嘅呢啲資訊即刻砌返幅圖出嚟。喺某啲情況下，向量圖像儲起上嚟比較慳記憶體，而且無論放幾大，幅圖都唔會起格。

### 記住啲顏色

電腦圖像學界有研究唔同嘅方法嚟向部電腦表示一點嘅顏色。頭先提到嘅紅綠藍色彩模式（**R**ed **G**reen **B**lue）係最常用嘅，幅圖每點用三個由 0 到 255 嘅數嚟表達嗰點有幾多紅幾多綠同幾多藍，但電腦圖像學界仲有第啲方法嚟向部電腦表示一點嘅顏色，例如 HSV 色彩模式（HSV model）噉，都係用三個數字代表一點嘅顏色，不過三個數字代表嘅唔係紅綠藍嘅濃度，而係代表**色相**（**H**ue；基本顏色屬性）、**飽和度**（**S**aturation；色彩純度）、同**光度**（**V**alue；色彩光度）。有電腦圖像學方面嘅學者指出，一般人類思考一隻顏色嗰陣都係傾向諗「呢隻係乜嘢色」（色相），而唔係諗「呢隻係幾多紅幾多綠幾多藍」，所以 HSV 色彩模式比較合乎直覺，對唔係專業做圖像嘢嘅人嚟講比較易用。

### 精靈圖

精靈圖（sprite）係指一啲用嚟結合埋一齊，並且產生一部大嘅景嘅二維圖像。例如係喺一隻二維嘅超級瑪利奧（Super Mario）電子遊戲入面，個遊戲嘅程式會內含主角嘅精靈圖同埋啲怪獸嘅精靈圖，而個主角瑪利奧嘅精靈圖又會包含咗（例如）佢企喺度嗰陣嘅樣、佢行路嗰陣嘅樣、同埋佢跳嗰陣嘅樣等等。喺每一個時間點，個程式都會
#接收玩家俾嘅輸入（例：如果玩家撳咗個「跳」掣，就將遊戲主角向上移動），
#按照「個主角同每隻怪獸喺邊個位置，喺度做緊乜」呢樣資訊，揀應該用邊幾幅精靈圖，並且
#按照每件物件嘅位置（可以睇埋物件導向程式編寫），將呢啲精靈圖同個背景合拼埋一齊，最後形成一個畫面。

精靈圖喺廿世紀嘅電子遊戲當中極之常見，好似係超任時代嘅遊戲多數都係用精靈圖嚟代表隻遊戲啲人物嘅。但由廿一世紀開始，電子遊戲產業變成以三維圖像做主導，會用精靈圖嘅遊戲已經買少見少，多數都係喺一啲運算能力冇咁勁嘅平台上面出嘅遊戲嗰度先會見到，好似係手機遊戲噉。 

## 三維圖像

三維電腦圖像（3D computer graphics）會要部電腦記住一啲三維嘅圖像。呢啲圖像會要求部電腦記住三維嘅資訊，即係長度、闊度、同高度－相比之下，二維嘅圖像淨係使部電腦記住一幅圖像長度同闊度。三維電腦圖像嘅處理會用到一啲二維圖像會用嘅技術（例如記顏色嘅方法），但又會涉及一啲二維圖像唔需要嘅技術，例如係彩現（睇下面）噉。

### 三維模型

三維模型（3D model），或者叫「立體模型」，係指一個（對於部電腦嚟講）用數字呈現嘅三維物體。三維模型可以用自動或者手動嘅方法整：有研究者會用一啲架生掃描一件真實嘅物件，再將啲數據傳去部電腦嗰度，等部電腦計算出個三維模型嘅樣，例如個掃描器嘅感應器可以射啲波出嚟，喺每一點嗰度量度吓「啲波射出去嘅時間」同「返到個感應器度嘅時間」之間差幾遠，噉就可以知道喺每個點度件物件嘅表面離個感應器幾遠，跟手將呢個數據傳過去部電腦，就係有關件物件嘅形狀嘅數據；另一方面，研究者又有得手動噉整啲 3D 模型出嚟。

舉個簡單例子說明，以下呢段 VRML 原始碼（VRML 係一種廿世紀常用嘅程式語言，專門用嚟整立體模型）代表咗一個喺一條好幼嘅藍色圓柱上面嘅紅色球體（即係好似珍寶珠噉嘅形狀）：


```c++
Shape {     // 整一件物體出嚟。
   geometry Cylinder {    // 設佢形狀係「圓柱體」。
      radius 0.1
      height 3.0}    // 碌圓柱嘅高度係 3.0 個單位，但係半徑得嗰 0.1 個單位－係一碌好幼嘅圓柱。
   appearance Appearance {
      material Material { diffuseColor 0.1 0.1 0.9 }     // 設佢色水係藍色。
   }
}

Transform {     // 整一件新物體
   translation 0 2.5 0     // 將佢移去第一件物體對上 2.5 單位高嘅位置。
   children [
      Shape {
         geometry Sphere { radius 1 }     // 設佢形狀係「球體」，半徑係 1 個單位。
         appearance Appearance {
            material Material { diffuseColor 1 0 0 }     // 設佢色水係紅色。
         }
      }
     ]
}
```

呢段碼係一個簡單嘅例子，一啲複雜啲嘅模型－好似係一個人類角色嘅立體模型－閒閒地可以有成幾千幾萬行呢啲噉嘅碼。

### 線框模型

線框模型（wire-frame model）係三維模型嘅一種。呢啲模型會用類似上面嗰段 VRML 碼噉嘅源碼，話俾部電腦聽件物體有邊啲邊（edge），每條連接住兩個喺數學上連續嘅平滑表面，又或者俾部電腦知件物體有邊啲頂點（vertex）同每隻角嘅位置坐標以及邊啲角之間有邊，再俾部電腦喺要睇個模型嗰陣按某啲法則（例如「所有邊都係直線」）做彩現，砌個模型俾個用家睇。線框模型淨係考慮角同邊，唔似得多邊形網格噉會講埋表面嘅色水同光源等嘅資訊，所以一旦一個線框模型做咗彩現，望落會好似用鐵線幫件物體整咗個模型噉。如果喺個線框模型上加色水同光源等嘅資訊，就會變成一個完整嘅多邊形網格（睇下面）。即係好似噉：

一個線框模型例子：
;每隻角嘅坐標

;個模型有邊幾條邊

### 多邊形網格

多邊形網格（polygon mesh）係完整過－即係更加接近出得街嘅完成品－線框模型嘅三維模型。呢啲模型又係會用類似上面嗰段 VRML 碼噉嘅語言，話俾部電腦聽個模型有幾多個角（vertex）、每隻角嘅位置坐標、每兩個角之間有冇邊（edge）、同埋（更加重要嘅係）塊表面係乜嘢色水呀噉。而當個用家要睇個三維模型嗰陣，部電腦就會即場砌返個模型出嚟，再考慮個用家由乜嘢角度睇緊個模型，計出最後個平面影像應該係點嘅樣（彩現）。廿一世紀開始嘅電腦運算能力勁到可以俾個用家即場改變觀察角度，即刻以肉眼睇唔到嘅速度計出由呢個新角度睇個模型會係乜樣，等個用家可以自由噉睇個模型嘅唔同面。

好似係以下呢個立方體嘅立體模型噉：

上面幅圖嘅意思係：部電腦記住咗一串數字，代表每隻角嘅坐標位置（vertex list；vn 代表第 n 隻角），跟住另一串數字記住每條邊喺邊兩隻角之間（edge list；en 代表第 n 條邊），最後再有一串數字記住邊啲邊之間有表面（face list；fn 代表第 n 塊面）。當要用個模型嗰陣，部電腦就會睇吓個用家由乜嘢角度睇緊個模型，計出個模型由嗰個角度睇應該係點嘅樣嘅。

### 材質貼圖

材質貼圖（texture mapping）指嘅係，個圖像處理程式要加一啲仔細位、色水、或者表面材質落一個立體模型嗰度。個電腦圖像設計師喺整好咗一個立體模型之後，好多時會想個模型表面唔淨係只係得純色，而係想個模型望落似真實嘅物體，而真實嘅物體嘅表面好少可真係純色嘅，所以佢哋就會想加啲**材質**（texture）落個模型嗰度，令到個模型表面好似用（例如）木頭造嘅噉；佢要搵一幅二維嘅圖像返嚟，幅圖像望落似佢想要嗰款材質，然後再教部電腦將幅材質圖貼落去個模型嘅表面嗰度；成個過程可以想像成將一張有圖案嘅紙包落去一件立體物件嗰度噉。

## 攷