owned this note
owned this note
Published
Linked with GitHub
# 前言
目前在電腦視覺中大多應用都是使用深度學習,但我認為對於一個研究電腦視覺領域的人來說,且現在許多科技廠仍會使用此技術進行檢測,所以傳統影像處理技還是非常重要的。
雖然在大學和碩士期間也會用影像處理技術對影像做處理,但也只是非常簡單的處理,如二值化、灰階、旋轉等。不過,除了這些,影像處理還有非常多的技術可以學,因此從這篇是我學好影像處理和打好基礎的第一篇。
這是我的學習紀錄,所有範例都是跟著[數位影像處理](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
```
結果如下圖所示

<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
```
結果如下圖所示

<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)位置的像素值去查表,並找到對應的灰階值。
結果下圖所示

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