###### tags: `影像處理`
# *2022/03/15 影像處理 HW03*
## Coding Part
### 實戰(1)
#### 題目:

##### 最近鄰內插法
```
#最近鄰內插法
from numpy.matrixlib.defmatrix import matrix
import numpy as np
import cv2
import math
from matplotlib import pyplot as plt
from google.colab.patches import *
matrix=np.array([[10,20,30],[40,50,60],[70,80,90]])
print(matrix.shape)
def NN_interpolation(img):
srcH,srcW = img.shape
dstH, dstW = 5,5
retImg = np.zeros([5,5],dtype='uint8')
for i in range(5):
for j in range(5):
srcX = int(round(i)*(3/5)) #Force to int type
srcY = int(round(j)*(3/5)) #Force to int type
if srcX >= srcW:
scrX = srcW -1
if srcY >= srcH:
scrY = srcH -1
retImg[i,j] = img[srcX,srcY]
return retImg
newImg = NN_interpolation(matrix)
print(newImg.shape)
print(newImg)
```
#### 輸出結果:

所以A=50,B=50
##### 雙線性內插法
```
#雙線性內插法
import numpy as np
import cv2
import math
from google.colab import drive
from google.colab.patches import *
matrix=np.array([[10,20,30],[40,50,60],[70,80,90]])
print(matrix.shape)
def double_linear(input_signal,zoom_multiples):
input_row,input_col = input_signal.shape
output_row = 5
output_col = 5
output_signal = np.zeros((output_row,output_col))
for i in range(output_row):
for j in range(output_col):
temp_x = i / output_row * input_row
temp_y = j / output_col * input_col
x1 = int(temp_x)
y1 = int(temp_y)
x2 = x1;y2 = y1 + 1
x3 = x1 + 1;y3 = y1
x4 = x1 + 1;y4 = y1 + 1
t = temp_x;u = temp_y - y1
if x4 >= input_row:
x4 = input_row -1
x2 = x4
x1 = x4 -1
x3 = x4 -1
if y4 >= input_col:
y4 = input_col -1
y3 = y4
y1 = y4 -1
y2 = y4 -1
output_signal[i,j]=(1-t)*(1-u)*input_signal[x1,y1] + (1-t)*u*input_signal[x2,y2] + t*(1-u)*input_signal[x3,y3]+t*u*input_signal[x4,y4]
return output_signal
dstImg = double_linear(matrix,(5/3)).astype(np.uint8)
print(dstImg.shape)
print(dstImg)
```
#### 輸出結果:

所以A=88,B=112
### 實戰(2)
#### 題目:

```
import numpy as np
import cv2
import math
from google.colab import drive
from google.colab.patches import *
drive.mount('/content/drive')
image = cv2.imread('/content/drive/My Drive/Colab Notebooks/imgs/landscape.webp',-1)
scale = eval(input('Please enter scale:'))
nr,nc=image.shape[:2]
nr2 = int(nr*scale)
nc2 = int(nc*scale)
newImg = cv2.resize(image,(nr2,nc2),interpolation=cv2.INTER_NEAREST)
newImg_2 = cv2.resize(image,(nr2,nc2),interpolation=cv2.INTER_LINEAR)
newImg_3 = cv2.resize(image,(nr2,nc2),interpolation=cv2.INTER_CUBIC)
images = [image,newImg,newImg_2,newImg_3]
titles = ['Original','NN_interpolation_Rescaling_'+str(scale),'Double_Linear_Rescaling_'+str(scale),'CUBIC_Rescaling_'+str(scale)]
plt.figure(figsize=(100,100))
for i in range(4):
plt.subplot(1,4,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i],fontsize=100,color='r')
plt.xticks([]),plt.yticks([])
plt.tight_layout()
plt.show()
```
#### 輸出結果:

##### 說明:
從照片中看起來,雙立方內插法的影像塗抹感比較嚴重,在細節表現沒有那麼出色,相較起來線性的亮暗表現最為突出(可能是因為選的照片本身是黑白,解析度也沒有那麼高)

範例圖片(landscape)
## 簡答題
#### 題目:

解答:
1. 空間轉換:(x’,y’)=T{(x,y)},(x,y)表示輸入的空間座標,(x’,y’)表示輸出的空間座標,T{}表示空間轉換函數
* 正向映射:容易有破洞問題
* 反向映射:不會有破洞問題
2. 幾何轉換:改變數位影像中像素空間座標的幾何關係,但不改變像素的灰階或色彩值
* 仿射轉換:縮放、旋轉、平移、翻轉、偏移
* 透視轉換
* 其他轉換
3. 常用的數位影像內插法:
* 最鄰近內插法
* 雙線性內插法
* 雙立方內插法