---
# System prepended metadata

title: '[影像處理]基礎教學 #1'

---

# 前言
目前在電腦視覺中大多應用都是使用深度學習，但我認為對於一個研究電腦視覺領域的人來說，且現在許多科技廠仍會使用此技術進行檢測，所以傳統影像處理技還是非常重要的。

雖然在大學和碩士期間也會用影像處理技術對影像做處理，但也只是非常簡單的處理，如二值化、灰階、旋轉等。不過，除了這些，影像處理還有非常多的技術可以學，因此從這篇是我學好影像處理和打好基礎的第一篇。

這是我的學習紀錄，所有範例都是跟著[數位影像處理](https://www.books.com.tw/products/0010923809)這本書的教學及查詢網路上的資料，並使用我自己的方法整理，以及加上自己的看法。

## 影像形成模型（3-4）

**定義**：
```f(x,y)=i(x,y)・r(x,y)```，其中i(x,y)為打光函數、r(x,y)反射函數

生活中有許多光源，而影像形成模型是用來模擬這些生活中常見的光源。光源主要可分成兩種：
- 環境光源：光線四面八方投射，形成均勻的照明，如太陽、市內照明
- 點光源：光線投射集中在特定局部區域，如檯燈等

反射函數的數值介於```0<r(x,y)<1```，0代表光線被物件完全吸收；1代表光線被物件表面反射。

**範例**
模擬點光源照明後所形成的影像，使用高斯函數進行點光源的模擬，其中```(x0,y0)```為平均值，用來控制打光的中心點；```sigma```為標準差，控制打光的範圍（半徑）。

```python=
def ImageFormationModel(img, x0, y0, sigma):
    
    img_copy = img.copy()
    nr, nc = img_copy.shape[:2]
    illumination = np.zeros([nr, nc], dtype='float32')
    
    # 打光函數
    for x in range(nr): 
        for y in range(nc):
            illumination[x, y] = np.exp(-(((x-x0)**2+(y-y0)**2)/(2*sigma**2)))
            
    for c in range(img.shape[2]):
        for x in range(nr):
            for y in range(nc):
                val = illumination[x, y]*img[x,y,c]
                img_copy[x,y,c] = val
                
    return img_copy
```

結果如下圖所示
![](https://hackmd.io/_uploads/H1WQDED1T.png)

<br>

[Source Code Please Visit](https://github.com/ChrisCodeNation/Digital-Image-Processing/blob/main/3-4%20影像形成模型.ipynb)

## 影像的取樣（3-5-1）

影像取樣的概念有點類似Pooling，只是不是取最大值或平均值，而是依照取樣率(Sampling rate)作為取樣的間隔擷取像素值。取樣的間隔越大，影像畫素越少，解析度越低；間隔越小，畫素越多，解析度越高。

```python=
def Down_sampling(img, sampling_rate):
    nr, nc = img.shape[:2]
    # 取樣後的大小
    nr_s, nc_s = nr//sampling_rate, nc//sampling_rate
    # 取樣後的影像
    result = np.zeros((nr_s, nc_s))
    
    for x in range(nr_s):
        for y in range(nc_s):
            result[x,y] = img[x*sampling_rate, y*sampling_rate]
            
    return result
```
結果如下圖所示
![lenna](https://hackmd.io/_uploads/H1ty8Vvyp.png)
<br>

[Source Code Please Visit](https://github.com/ChrisCodeNation/Digital-Image-Processing/blob/main/3-5-1%20取樣.ipynb)

## 影像的量化（3-5-2）
量化(Quantization)的概念就是將影像像素點的區間轉換成單個特定值的過程。以灰階影像來說，通常為8bits，灰階數有256種；而使用5bits量化時，只會有32種灰階；使用1bit量化時，只會有2種灰階，也就是0或255。

```python=
def quantization(img, bits):
    new_img = img.copy()
    nr, nc = img.shape[:2]
    # 幾種灰階 eg. 2bits有4種灰階
    level = 2**bits
    # 灰階的間隔範圍 256/4= 64, 0-64;64-128;128-192;192-256
    interval = 256/bits
    gray_level_interval = 255/(level-1)
    # look up table
    table = np.zeros(256, np.uint8)
    
    # 建立look up table
    for k in range(256):
        for l in range(level):
            if k >= l*interval and k < (l+1)*interval:
                table[k] = round(l*gray_level_interval)
                
    # 查表
    for x in range(nr):
        for y in range(nc):
            new_img[x,y] = table[img[x,y]]
            
    return new_img
```
上面的概念是先建立一個lookup table，根據每個位置決定是哪一種灰階值。接著就能根據原始影像的(x,y)位置的像素值去查表，並找到對應的灰階值。

結果下圖所示
![quantization](https://hackmd.io/_uploads/Hy2h64Dy6.png)
<br>

[Source Code Please Visit](https://github.com/ChrisCodeNation/Digital-Image-Processing/blob/main/3-5-2%20量化.ipynb)
