実際の戦闘 | OpenCV を使用してスイッチ メディアン フィルタリングを実装し、周期的な線形ノイズを除去します (ステップ + ソース コード)

ガイド

    この記事では、OpenCV を使用して周期的な線形ノイズを除去するスイッチ メディアン フィルターを実装する例を、実装手順とソース コードを含めて主に紹介します。  

背景紹介

    次の図のように、メディアン フィルタリングによって画像内のインパルス ノイズやごま塩ノイズを除去できることは誰もが知っています。

写真

    OpenCV が提供するメディアン フィルター関数を使用すると、ノイズを簡単に除去し、画像エッジの特徴をより適切に保存できます。

    コードデモ:

import cv2import 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()

写真

    総じて効果は悪くない。ノイズを除去しながら、ディテールはより良く保存されます。もちろん他にも実装方法はありますので、後ほどご紹介しますので、お楽しみに。

おすすめ

転載: blog.csdn.net/stq054188/article/details/132257273