https://docs.opencv.org/4.2.0/d4/d13/tutorial_py_filtering.htmlから取得
https://docs.opencv.org/4.2.0/dc/dd3/tutorial_gausian_median_blur_bilateral_filter.htmlから取得
2Dコンボリューション(画像フィルタリング)
1次元信号と同様に、画像はさまざまなローパスフィルター(LPF)、ハイパスフィルター(HPF)などでフィルター処理することもできます。LPFはノイズの除去、画像のぼかしなどに役立ちます。HPFフィルターはエッジの検出に役立ちます画像。
OpenCVは、 カーネルを画像でたたみ込む関数cv.filter2D()を提供します 。
例として、画像に対して平均化フィルターを試します。
img = cv.imread('opencv_logo.png')
kernel = np.ones((5,5),np.float32)/25
dst = cv.filter2D(img,-1,kernel)
画像のぼかし(画像の平滑化)
画像のぼかしは、画像をローパスフィルターカーネルで畳み込むことによって実現されます。それは実際に画像から高周波コンテンツ(例えば:ノイズ、エッジ)を削除します。OpenCVは、4つの主要なタイプのぼかし手法を提供します。
1.平均化
これは、正規化されたボックスフィルターで画像を畳み込むことによって行われます。カーネル領域の下のすべてのピクセルの平均を取り、中央の要素を置き換えます。これは、関数cv.blur() または cv.boxFilter()によって行われ ます。カーネルの幅と高さを指定する必要があります。カーネルは以下のとおりです。
blur = cv.blur(img,(5,5))
2.ガウスぼかし
この方法では、ボックスフィルターの代わりにガウスカーネルが使用されます。これは関数cv.GaussianBlur()で行われ ます。カーネルの幅と高さを指定する必要があります。これは正で奇数でなければなりません。X方向とY方向の標準偏差sigmaXとsigmaYもそれぞれ指定する必要があります。sigmaXのみが指定されている場合、sigmaYはsigmaXと同じと見なされます。両方がゼロとして指定されている場合、それらはカーネルサイズから計算されます。ガウスぼかしは、画像からガウスノイズを除去するのに非常に効果的です。
必要に応じて、関数cv.getGaussianKernel()でガウスカーネルを作成できます 。
blur = cv.GaussianBlur(img,(5,5),0)
3.ぼかしの中央値
cv.medianBlur() は、カーネル領域の下のすべてのピクセルの中央値を取り、中央の要素はこの中央値に置き換えられます。これは、画像のソルトアンドペッパーノイズに対して非常に効果的です。カーネルサイズは正の奇数の整数でなければなりません。
median = cv.medianBlur(img,5)
4.双方向フィルタリング
cv.bilateralFilter() は、エッジをシャープに保ちながらノイズ除去に非常に効果的です。しかし、操作は他のフィルターと比較して遅いです。
ガウシアンフィルターと同様に、バイラテラルフィルターは、それぞれに重みが割り当てられている隣接ピクセルも考慮します。これらの重みには2つの成分があり、最初の成分はガウスフィルターで使用される重みと同じです。2番目のコンポーネントは、隣接するピクセルと評価されたピクセルの間の強度の違いを考慮します。
blur = cv.bilateralFilter(img,9,75,75)
表面のテクスチャはなくなりましたが、エッジはまだ保持されています。