OpenCVには平均化フィルタblur()や畳み込み演算をするfliter2d()などがありますが、自前でコードを書いてみようという試みです。
import cv2
import numpy as np
# 画像ファイルの読み込み(グレースケール)
file = 'H:/py/old/opencv/input.jpeg'
src = cv2.imread(file, 0)
# カーネル
kernel = np.array([[1/9,1/9,1/9],[1/9,1/9,1/9],[1/9,1/9,1/9]])
# 領域外
d = 1
# 高さ、幅
h, w = src.shape[:2]
# オブジェクトのコピー
dst = src.copy()
# 畳み込み演算ループ
for y in range(d, h - d):
for x in range(d, w - d):
dst[y][x] = np.sum(src[y-d:y+d+1, x-d:x+d+1] * kernel)
# 画像の書き込み
cv2.imwrite("output.png", dst)
画像を畳み込み演算でフィルタ処理する場合、各画素に対しカーネルで設定した値と演算することでフィルタ処理が行われます。その場合、カーネルのサイズによって範囲外の領域が発生します。今回のサンプル(3×3カーネル)では外周1ドット(d = 1)分が範囲外となっていおり、範囲外の領域ははオリジナルがそのままコピーされるようにしています。
3×3のカーネルの各要素を1/9としているので、各ドットの色情報が1/9されそれを合計しているので結果平均値を求めることが出来ます。
コメント