###### tags: `影像處理`
# *2022/05/10 影像處理 HW09*
## Coding Part
### 實戰(3)
#### 題目:

```
import numpy as np
import cv2
import math
from numpy.fft import *
from numpy.random import *
from matplotlib import pyplot as plt
from google.colab import drive
from google.colab.patches import *
drive.mount('/content/drive')
image = cv2.imread("/content/drive/My Drive/Colab Notebooks/imgs/Barbara.bmp",-1)
def gaussian_noise(f,scale):
g = f.copy()
nr,nc = f.shape[:2]
for x in range(nr):
for y in range(nc):
value = f[x,y] + normal(0,scale)
g[x,y] = np.uint8(np.clip(value,0,255))
return g
def wiener_filtering(f,cutoff,K):
nr,nc=f.shape[:2]
fp = np.zeros([nr,nc])
for x in range(nr):
for y in range(nc):
fp[x,y] = pow(-1,x+y)*f[x,y]
F = fft2(fp)
G = F.copy()
for u in range(nr):
for v in range(nc):
dist = np.sqrt((u -nr/2)*(u-nr/2)+(v-nc/2)*(v-nc/2))
H = np.exp(-(dist*dist)/(2*cutoff*cutoff))
H = H/(H*H+K)
G[u,v]*=H
gp = ifft2(G)
gp2 = np.zeros([nr,nc])
for x in range(nr):
for y in range(nc):
gp2[x,y]=round(pow(-1,x+y)*np.real(gp[x,y]),0)
g = np.uint8(np.clip(gp2,0,255))
return g
def PSNR(f,g):
nr,nc = f.shape[:2]
MSE = 0
for x in range(nr):
for y in range(nc):
MSE += (float(f[x,y])-float(g[x,y]))**2
MSE /= (nr*nc)
PSNR = 10 * np.log10((255*255)/MSE)
return PSNR
image_noise = gaussian_noise(image,15)
image_noise_PSNR = PSNR(image,image_noise)
image_noise_Inverse_1 = wiener_filtering(image_noise,50,0.05)
image_noise_Inverse_2 = wiener_filtering(image_noise,50,0.01)
image_noise_Inverse__1_PSNR = PSNR(image,image_noise_Inverse_1)
image_noise_Inverse__2_PSNR = PSNR(image,image_noise_Inverse_2)
images = [image,image_noise,image_noise_Inverse_1,image_noise_Inverse_2]
titles = ['Original','gaussian_noise scale=15','Wiener (K=0.05)','Wiener (K=0.01)']
labels = ['','PSNR='+str(image_noise_PSNR,),'PSNR='+str(image_noise_Inverse__1_PSNR),'PSNR='+str(image_noise_Inverse__2_PSNR)]
plt.figure(figsize=(15,10))
for i in range(4):
plt.subplot(1,4,i+1),plt.imshow(images[i],cmap='gray')
plt.title(titles[i],fontsize=15,color='r')
plt.xlabel(labels[i],fontsize=15,color='b')
plt.tight_layout()
plt.show()
```
#### 輸出結果:

### 實戰(4)

#### 程式碼:
```
import numpy as np
import cv2
from numpy.fft import *
from numpy.random import *
from matplotlib import pyplot as plt
from google.colab import drive
from google.colab.patches import *
drive.mount('/content/drive')
imag_1 = cv2.imread("/content/drive/My Drive/Colab Notebooks/imgs/Japan.jpg")
imag_1 = cv2.cvtColor(imag_1,cv2.COLOR_BGR2RGB)
imag_2 = cv2.imread("/content/drive/My Drive/Colab Notebooks/imgs/Japan_4.jpg")
def imgMask(f):
nr,nc = f.shape[:2]
mask = np.zeros([nr,nc],dtype='uint8')
for x in range(nr):
for y in range(nc):
if f[x,y,0] >= 0 and f[x,y,0] <50 and f[x,y,1] <= 255 and f[x,y,1] >200 and f[x,y,2] <= 255 and f[x,y,2] >200:
mask[x,y] = 255
return mask
img_msk = imgMask(imag_2)
img_inpaint = cv2.inpaint(imag_1,img_msk,3,cv2.INPAINT_TELEA)
#img_inpaint = cv2.cvtColor(img_inpaint,cv2.COLOR_BGR2RGB)
imag_2 = cv2.cvtColor(imag_2,cv2.COLOR_BGR2RGB)
images = [imag_1,imag_2,img_msk,img_inpaint]
titles = ['Original','Img with Mask','Img Mask','Img Inpaint']
plt.figure(figsize=(15,10))
for i in range(4):
plt.imshow(images[i],cmap='gray')
plt.title(titles[i],fontsize=15,color='r')
plt.tight_layout()
plt.show()
```
#### 輸出結果:

## 簡答題:

解答:
1. 分析方法:
透過直方圖,將影相作分析,將分析出來的影像找出可能的對應雜訊模型,套用濾波器還原影像,或 是透過訊號雜訊比來評估影像,訊號雜訊比包含計算:總誤差、均分誤差(MSE)、均分跟誤差(RMSE)、峰直雜訊比(PSNR)來做運算,最常見的是PSNR
2. 挑戰:
* 雜訊函數N(x,y)無法事先得到,所以會影響影像還原的效果
* 如果失真函式H(u,v)太小,會造成 數值過大,干擾原始影像的資訊
→透過H(u,v)數值較小的區域設定處理範圍
3. 補繪的時機:
將影像中,多餘的部分,透過演算法與補繪的方式,去除掉,例如一張風景照中多了一根電線桿,可以透過補繪技術,將其抹除掉,Google Pixel 6系列開始就有推出魔術橡皮擦功能,就是透過類似技術去處理,更早之前的HUAWEI、Xiaomi也有推出類似功能,可以將影像中多餘的人物去除
4. 課程重點:
|S.O.P.|
| -------- |
| 透過分析→選取適合的濾波器→套用濾波器→比對是否良好還原影像→優化影像→輸出|
這堂課總體來言,就是透過以上的S.O.P.去完成影像的還原,搭配不同的演算法,可以滿足不同類型的影像達到更好的影像還原。