Python はノッチ フィルター、ローパス フィルター、ガウス フィルター、バターワース フィルターを実装します

画像において、低周波成分は画像の全体的な外観や輪郭に対応するゆっくりと変化する部分に対応し、高周波成分は画像の詳細に対応して急速に変化する部分に対応します(画像のノイズも高周波成分です)。

ローパスフィルタ

低周波フィルターは、その名前が示すように、画像の高周波成分を除去または大幅に減衰させ、画像の低周波成分を通過させます。低周波フィルタは画像を平滑化し、画像のノイズを除去することができ、高周波フィルタは逆に低周波成分をフィルタリングし、高周波成分を通じて画像を鮮明にするという目的を達成することができる。
理想的なローパス フィルターは非常にシャープなフィルター処理をしますが、ガウス ローパス フィルターは非常に滑らかなフィルター処理を行います。バターワース ローパス フィルターはその中間で、次数が高いと理想ローパス フィルターに近く、次数が低いとガウス ローパス フィルターに近くなります。

理想的なローパス フィルターは、原点を中心、D0 を半径とする円内のすべての周波数を通過させ、円の外側のすべての周波数をカットします。(円の中心は最も低い周波数を持ち、変換の直流 (dc) 成分です)。
例: pandas は、データ分析タスクを解決するために作成された NumPy ベースのツールです。

ハイパスフィルタ

スペクトログラムの中心に近い低周波数部分はハイパス フィルターによって廃棄され、スペクトログラムの中心から遠く離れた高周波数部分は保持されます。通常、オブジェクトの境界は保持されます。実際には、画像の鮮明化は、境界を強調する必要があり、境界部分が高周波成分であるため、ハイパス フィルターを使用することで実現できることがよくあります。lh を 1 に設定してハイパス フィルターを表します。
ここに画像の説明を挿入

ノッチフィルター

周波数領域技術が周期的ノイズの除去に適している理由は、周期的ノイズが周期的外乱に対応する周波数で集中したエネルギー パルスの形で現れるためです。フィルタリング方法の 1 つは選択フィルタ (バンド ストップ、バンド パス、ノッチ) です。画像には生成、送信、または取得中にノイズが含まれる場合があり、ノイズ除去は画像処理で一般的に使用される方法です。通常、ノイズを除去するにはメディアン フィルタリングや平均値フィルタリングなどのフィルタリング方法が使用されます。しかし、このようなアルゴリズムは、文字などの細長い画像の処理には適していません。文字自体のピクセルがフィルタ処理中に削除される可能性が高いためです。
ノッチ フィルターは、事前に定義された中心周波数の近傍の周波数をブロックまたは通過させます。フーリエ変換の対称性により、ノッチ フィルターは原点に関して対称な形で現れる必要があります (ノッチ フィルターが原点に配置されている場合、ノッチ フィルター自体がそれ自体です)。同様に、ノッチ領域に含まれる周波数が既知であるノッチフィルタではなく、ノッチバンドパスフィルタに対応するノッチバンドパスフィルタを取得することも可能である。

各フィルター実験

1. 理想的なローパスフィルター

コードは以下のように表示されます。

def low_pass_filter(img, radius=80):
    rows, cols = img.shape
    center = int(rows/2), int(cols/2)

    mask = np.zeros((rows, cols, 2), np.uint8)
    x, y = np.ogrid[:rows, :cols]
    mask_area = (x-center[0])**2+(y-center[1])**2 <= radius*radius
    mask[mask_area] = 1
    return mask

ここに画像の説明を挿入

2. ガウスフィルター

コードは以下のように表示されます。

def gaus_filter(img, radius=80):
    rows, cols = img.shape
    center = int(rows/2), int(cols/2)

    mask = np.zeros((rows, cols, 2), np.float32)
    for i in range(rows):
        for j in range(cols):
            dist = (i-center[0])**2+(j-center[1])**2
            mask[i, j] = np.exp(-0.5*dist/(radius**2))
    return mask

ここに画像の説明を挿入

3.バターワースフィルター

コードは以下のように表示されます。

def bw_filter(img, radius=80, n=2):
    rows, cols = img.shape
    center = int(rows / 2), int(cols / 2)

    mask = np.zeros((rows, cols, 2), np.float32)
    for i in range(rows):
        for j in range(cols):
            dist = (i - center[0]) ** 2 + (j - center[1]) ** 2
            mask[i, j] = 1/(1+(dist/radius)**(n/2))
    return mask

---

4. ノッチフィルター

コードは以下のように表示されます。

def notch_filter(img, h, w):
    rows, cols = img.shape
    center = int(rows / 2), int(cols / 2)

    mask = np.zeros((rows, cols, 2), np.float32)
    for u in range(rows):
        for v in range(cols):
            mask[u,v]=0
    for u in range(rows):
        for v in range(cols):
            if abs(u - center[0]) < h and abs(v - center[1]) < w:
                mask[u, v] = 1

    return mask

---

おすすめ

転載: blog.csdn.net/qq_48068259/article/details/127096263