【再現】非線形フィルタリングのOpenCV-Pythonシリーズ(19)

前のチュートリアルで線形フィルタリングについて説明しました。これに対して、線形フィルタリングでのガウシアンフィルタリングが最も一般的ですが、問題も残っています。線形フィルタリングは、塩コショウノイズのフィルタリングにはあまり適していません。 OpenCVの非線形フィルタリングについて説明します。

前に説明した線形フィルタリングは、2つの信号の合計の応答がそれぞれの応答の合計に等しいことです。つまり、各ピクセルの出力値は、いくつかの入力ピクセルの重み付けされた合計であり、線形フィルターは構築が簡単で、周波数応答の観点から分析が容易です。

実際、多くの場合、隣接するピクセルの非線形フィルタリングがより良い結果を得る可能性があります。たとえば、ガウスノイズではなくショットノイズである場合、つまり、画像の値が大きくなる場合があります。この場合、ガウスフィルターを使用して画像をぼかすと、ノイズのあるピクセルは削除されず、より柔らかく、まだ見えるショットに変換されるだけです。これは、中央値フィルターがステージに来るときです。

中央値フィルター

メディアンフィルタリングは、一般的な非線形フィルタリングテクノロジーです。基本的な考え方は、ピクセルのグレー値をピクセルの近傍のグレー値の中央値で置き換えることです。この方法では、インパルスノイズとソルトアンドペッパーノイズを同時に削除できます。画像のエッジの詳細を保持します。

メディアンフィルタリングは、ノイズを効果的に抑制することができるランク付け統計理論に基づく非線形信号処理テクノロジです。その基本的な原理は、デジタルイメージまたはデジタルシーケンスのポイントの値を、そのポイントの近傍の各ポイントのメディアン値として使用することです。代わりに、周囲のピクセル値を真の値に近づけて、孤立したノイズポイントを排除します。これは、スペックルノイズやソルトアンドペッパーノイズに特に役立ちます。これは、典型的な値とは大きく異なる近傍の値に依存しないためです。連続画像ウィンドウ関数を処理する場合、メディアンフィルターは線形フィルターと同様に機能しますが、フィルター処理は重み付け演算ではなくなります。

特定の条件下では、メディアンフィルタリングは、最小平均二乗フィルタリング、ボックスフィルター、平均フィルタリングなどの一般的な線形フィルターによって引き起こされる画像の細部のぼやけを克服できます。また、インパルス干渉や画像スキャンノイズの除去にも非常に効果的です。エッジ情報を保護するために、エッジを保存する機能は、エッジブラーが不要な場合に非常に役立ちます。これは、非常に古典的なスムージングノイズ処理方法です。

名前が示すように、中央値フィルターは各ピクセルの隣接ピクセルの中央値を出力として選択するか、中央値フィルターが各ピクセルのグレー値をそのポイントの特定の近傍ウィンドウ内のすべてのピクセルのグレー値に設定します中央値。

素人の言葉で言えば、ちょうど中央値を見つけて、それでも例としてその写真を撮ってください:
ここに画像の説明を挿入

値を最小から最大に並べ替えましょう:

24 75 78 104113 121 154 204 235

次に、中央値は113です。

通常、奇数ポイントの近傍を使用して中央値が計算されますが、ピクセル数が偶数の場合、中央値はソートされたピクセル間の2つのポイントの平均です。

メジアンフィルタリングは、塩コショウノイズの除去に特に効果的です。まず、塩コショウノイズの定義を見てみましょう。

塩コショウノイズは、イメージセンサー、伝送チャネル、およびデコード処理によって生成される白黒の明暗ノイズです。ソルトアンドペッパーノイズとは、2種類のノイズを指します。1つはソルトノイズ(ソルトノイズ)ソルト=ホワイト(255)、もう1つはペッパーノイズ(ペッパーノイズ)、ペッパー=ブラック(0)です。前者は高灰色ノイズで、後者は低灰色ノイズです。通常、2種類のノイズが同時に現れ、画像上では白黒のノイズとして現れます。カラー画像の場合、単一ピクセルBGRの3つのチャネルにランダムに出現する255と0として表示され、中央値フィルター値は真ん中の値なので、これらの極値はフィルターで除外されます。関数のプロトタイプを見てみましょう:

dst = cv.medianBlur(src、ksize [、dst])

ここで、dstは出力イメージです。

srcは入力画像です。

ksizeはたたみ込みカーネルのサイズで、奇数で1より大きい必要があります。

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

	view plaincopy to clipboardprint?
import cv2  
import matplotlib.pyplot as plt  
import numpy as np  
  
img = cv2.imread("shu.jpg")  
blur =  cv2.medianBlur(img,3)  
cv2.imshow("org",img)  
cv2.imshow("result", blur)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

示されているように:
ここに画像の説明を挿入

塩とコショウのノイズを除去することの効果は非常に明白であることがわかります。メディアンフィルタリングの長所と短所をまとめてみましょう。

メディアンフィルターと平均フィルターの利点:平均フィルターでは、ノイズ成分が平均計算に入れられるため、出力はノイズの影響を受けますが、メディアンフィルターではノイズ成分を選択することは困難です。したがって、出力にはほとんど影響しません。したがって、同じ3x3領域が処理に使用され、メディアンフィルターのノイズ除去能力が向上します。メディアンフィルタリングは、ノイズを除去したり、エッジを保持したりするのに適した方法です。

平均フィルターと比較した中央値フィルターの欠点:中央値フィルターは、平均フィルターの5倍以上かかります。

双方向フィルタリング

バイラテラルフィルタリングは、画像の空間的な近接性とピクセル値の類似性を組み合わせた非線形フィルタリング手法であり、空間情報とグレースケールの類似性を考慮して、エッジの保存とノイズ除去の目的を達成します。それは単純で、非反復的で、部分的です。

バイラテラルフィルターの利点は、エッジの保存に使用できることです。通常、過去にノイズを減らすために使用されたガウスフィルターは、エッジをよりはっきりとぼかし、高周波の詳細に対する保護効果は明白ではありません。バイラテラルフィルターは、その名前が示すように、ガウスフィルターよりもガウス分散sigma-dが1つ多くなります。これは空間分布に基づくガウスフィルター関数であるため、エッジの近くにあるピクセルは、エッジのピクセル値にあまり影響を与えません。これにより、エッジ近くのピクセル値が保持されます。ただし、保存されている高周波情報が多すぎるため、バイラテラルフィルターはカラー画像の高周波ノイズをきれいに取り除くことができず、低周波情報をより適切にフィルタリングできます。

その原理は、おおよそ次のとおりです。
ここに画像の説明を挿入

バイラテラルフィルタリング距離とピクセル差の2つの影響要因を理解するには、まず、理解に役立つ次の2つの概念を説明します。

空間距離:現在の点とフィルターテンプレートの中心点の間のユークリッド距離。
ここに画像の説明を挿入

灰色の距離:現在の点とフィルターテンプレートの中心点との差の絶対値。
ここに画像の説明を挿入

バイラテラルフィルタリングのカーネル関数は、空間ドメインカーネルとピクセル範囲ドメインカーネルの統合結果です。

1)画像の平坦な領域では、ピクセル値はほとんど変化せず、ピクセルの差は0に近く、対応するピクセル範囲ドメインの重みは1に近くなります。このとき、空間ドメインの重みは主要な役割を果たし、ガウスぼかしと同等です。

2)画像のエッジ領域では、ピクセル値が大きく変化し、次にピクセル差分値が大きくなり、対応するピクセル範囲ドメインの重みが大きくなります。距離空間ドメインの重みが小さくても、合計係数とピクセルドメインの重みの合計も大きくなります。エッジで情報を保護します。

関数プロトタイプを見てみましょう:

cv2.bilateralFilter(src、d、sigmaColor、sigmaSpace [、dst [、borderType]])→dst

src:入力画像

d:フィルタリング時の各ピクセル領域の直径

sigmaColor:シグマを色空間でフィルター処理します。パラメータが大きいほど、隣接するピクセルが混合されます。

sigmaSpace:シグマを座標空間でフィルタリングします。パラメータが大きいほど、十分に類似している色の影響が大きくなります。

コードを見てください:

	view plaincopy to clipboardprint?
import cv2  
import matplotlib.pyplot as plt  
import numpy as np  
  
img = cv2.imread("example.png")  
blur =  cv2.bilateralFilter(img,21,55,55)  
cv2.imshow("org",img)  
cv2.imshow("result", blur)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

最初に元の画像を見てください
ここに画像の説明を挿入
:処理された画像をもう一度
ここに画像の説明を挿入
見てください美化効果がありますか?バイラテラルフィルタリング自体がエッジ情報の保持を強化するため、輪郭やすべてが保持されます。

OpenCVの非線形フィルタリングにも最大フィルタリングと最小フィルタリングがありますが、それらの原理は中央フィルタリングと同じであり、めったに使用されないため、ここではあまり説明しません。

記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44237705/article/details/108273386