[画像認識] 非局所平均値フィルタを実装

$ pip3 install scikit-image

元画像

非局所平均値フィルタ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
import matplotlib.pyplot as plt
from skimage import img_as_float
from skimage.restoration import denoise_nl_means, estimate_sigma
from skimage.util import random_noise
 
img = plt.imread('src/face.jpg')
original = img_as_float(img)
 
sigma = 0.1
noisy = random_noise(original, var=sigma**2)
 
sigma_est = np.mean(estimate_sigma(noisy, multichannel=True))
 
patch_kw = dict(patch_size=5,   # ノイズ除去のパッチサイズ 5x5
                patch_distance=6, # パッチを検索する距離 13x13 searchera
                multichannel=True)
 
denoise = denoise_nl_means(original, h=1.15*sigma_est, fast_mode=False, **patch_kw) # hはカットオフ
 
fig, ax = plt.subplots(figsize=(8, 6.5), sharex=True, sharey=True)
 
ax.imshow(denoise)
ax.axis('off')
ax.set_title('ノイズ除去')
 
fig.tight_layout()
plt.savefig('local_denoise_mangf.jpg',dpi=100)

かなり綺麗になってるのはわかります。