Pythonによる画像処理100本ノック#11 平滑化フィルタ(平均フィルタ)
はじめに
どうも、らむです。
今回は画像中のノイズを除去するメディアンフィルタを実装します。
11本目:平滑化フィルタ(平均フィルタ)
平滑化フィルタとは画像の平滑化を行うフィルタです。このフィルタを適用することによって画像全体をぼやかしたような加工ができます。
このフィルタでは注目画素を周辺画素の平均値で置き換えます。
例えば、3×3や5×5の平均フィルタは以下のようになります。
$\frac{1}{9}$ | $\frac{1}{9}$ | $\frac{1}{9}$ |
---|---|---|
$\frac{1}{9}$ | $\frac{1}{9}$ | $\frac{1}{9}$ |
$\frac{1}{9}$ | $\frac{1}{9}$ | $\frac{1}{9}$ |
$\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |
---|---|---|---|---|
$\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |
$\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |
$\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |
$\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ | $\frac{1}{25}$ |
注目画素が中心だとすると、周辺画素と対応するフィルタ値の積の総和を注目画素に代入すれば良いですね。
3×3フィルタであれば$I(x_0,y_0)×\frac{1}{9} + I(x_0,y_1)×\frac{1}{9} + ... I(x_2,y_2)×\frac{1}{9}$の値を注目画素に代入します。これで、周辺画素の平均値が注目画素に代入されていますね。
また、前回同様、画像の端部分はフィルタリング処理が行えないので存在しない画素は0を用いる0パディング処理を行います。
ソースコード
import numpy as np
import cv2
import matplotlib.pyplot as plt
def meanFilter(img,k):
w,h,c = img.shape
size = k // 2
# 0パディング処理
_img = np.zeros((w+2*size,h+2*size,c), dtype=np.uint8)
_img[size:size+w,size:size+h] = img.copy().astype(np.uint8)
dst = _img.copy()
# フィルタ作成
ker = np.zeros((k,k), dtype=np.float)
for x in range(-1*size,k-size):
for y in range(-1*size,k-size):
ker[x+size,y+size] = (1/k**2)
# フィルタリング処理
for x in range(w):
for y in range(h):
for z in range(c):
dst[x+size,y+size,z] = np.sum(ker*_img[x:x+k,y:y+k,z])
dst = dst[size:size+w,size:size+h].astype(np.uint8)
return dst
# 画像読込
img = cv2.imread('image.jpg')
# 平均フィルタ
img = meanFilter(img,9)
# 画像保存
cv2.imwrite('result.jpg', img)
# 画像表示
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
画像左は入力画像、画像右は出力画像です。
ぼやけた感じの出力画像になっており、平滑化が行えていることが分かります。
おわりに
もし、質問がある方がいらっしゃれば気軽にどうぞ。
imori_imoriさんのGithubに公式の解答が載っているので是非そちらも確認してみてください。
それから、pythonは初心者なので間違っているところがあっても優しく指摘してあげてください。
Author And Source
この問題について(Pythonによる画像処理100本ノック#11 平滑化フィルタ(平均フィルタ)), 我々は、より多くの情報をここで見つけました https://qiita.com/muro5866/items/c74d06aeb3aba75c0997著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .