ガイド
この記事では、OpenCV を使用して周期的な線形ノイズを除去するスイッチ メディアン フィルターを実装する例を、実装手順とソース コードを含めて主に紹介します。
背景紹介
次の図のように、メディアン フィルタリングによって画像内のインパルス ノイズやごま塩ノイズを除去できることは誰もが知っています。
OpenCV が提供するメディアン フィルター関数を使用すると、ノイズを簡単に除去し、画像エッジの特徴をより適切に保存できます。
コードデモ:
import cv2
import numpy as np
img=cv2.imread('snow.jpg',0)
cv2.imshow('src',img)
dst = cv2.medianBlur(img,3)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
3 x 3 メディアン フィルター効果:
線形周期ノイズの場合、メディアンフィルターは使用できますか?
実装手順
下の図には、離散的な塩胡椒ノイズの代わりに、線形周期ノイズが含まれています。
上記のノイズを除去するためにメディアン フィルタリングを直接使用することもできますか? まずは試してみてください!
3 x 3 メディアン フィルター エフェクト (ライン ノイズはまだ存在します):
5 x 5 メディアン フィルタリング効果 (ライン ノイズは少ないですが、画像がぼやけています):
上記の 2 つの効果は私たちが望むものではないので、どうすればよいでしょうか? ここでは、スイッチング メディアン フィルタリングと呼ばれる、シンプルで効果的な方法を提供します。
切り替えメディアン フィルタは、まずノイズ ピクセルを検出し、検出されたノイズ ピクセルに対してのみメディアン フィルタを実行し、ノイズがないと判断されたピクセルはメディアン フィルタに参加しません。このようにして、ノイズを除去しながら、画像の細部がよりよく保存されます。
実装手順:
[1] ノイズのあるピクセルを検出します。各行を順番に走査し、現在の行のグレー値の合計を計算します。グレー値の合計が 100000 より大きい場合、現在の行はノイズ行と判断され、0 に設定されます。それ以外の場合は 1 になります。
def detect(img):
(w,h) = img.shape
flt = np.ones((w,h),dtype = int)
bright = []
for y in range(h):
bright.append(np.sum(img[:][y]))
x=np.arange(512)
plt.plot(x,bright,c='b')
plt.ylabel('Brightness')
plt.savefig('Brightness.jpg')
for i in range(h):
if bright[i]>100000:
flt[:][i]=0
return flt
[2] ノイズの多い行のピクセルにメディアン フィルターを実行します。次のコードは、ノイズ ピクセルに対応する平均値フィルターの結果を示しています。中央値フィルターは中央値を取得するように並べ替える必要があり、効果は同様です。
def medianBlur(img):
(w,h) = img.shape
for i in range(2,w-1):
for j in range(2,h-1):
n = 0
s = 0
if img[i][j] == 0:
for ii in range(i-1,i+1):
for jj in range(j-1,j+1):
if img[ii][jj] != 0:
n = n + 1
s = s + img[ii][jj]
if n != 0:
img[i][j] = int(s/n)
return img
【3】テストを呼び出して結果を処理します。
if __name__ == '__main__':
fileName = 'lena.jpg'
gray = cv2.imread(fileName,0)
cv2.imshow('src', gray)
flt = detect(gray)
grayWithoutNoise = gray*flt
mb = medianBlur(grayWithoutNoise)
mb = mb[1:512,1:512]
mb = np.array(mb,dtype=np.uint8)
cv2.imshow('result',mb)
cv2.waitKey(0)
cv2.destroyAllWindows()
総じて効果は悪くない。ノイズを除去しながら、ディテールはより良く保存されます。もちろん他にも実装方法はありますので、後ほどご紹介しますので、お楽しみに。