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

$ pip3 install scikit-image

元画像

非局所平均値フィルタ

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)

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