[OpenCV-Python] 16画像スムージング

OpenCV-Python:OpenCVでのIV画像処理

16画像のスムージング

目標
  •さまざまなローパスフィルターを
  使用して画像をぼかす方法を学ぶ•カスタムフィルターを使用して画像を畳み込む(2D畳み込み)

2D畳み込み
  1次元信号と同様に、2D画像にローパスフィルタリング(LPF)、ハイパスフィルタリング(HPF)などを実装することもできます。LPFは、ノイズを除去して画像をぼかすのに役立ちます。HPFは、画像のエッジを見つけるのに役立ち
ます。OpenCVが提供する関数cv.filter2D()を使用すると、画像に対して畳み込み演算を実行できます。以下では、画像に平均化フィルターを使用します。以下は、5x5平均フィルターカーネルです。
      K = \ frac {1} {25} \ begin {bmatrix} 1&1&1&1&1 \ 1&1&1&1&1 \ 1&1&1&1&1 \ 1&1&1 &1&1 \ 1&1&1&1&1 \ end {bmatrix}
操作は次のとおりです。カーネルを画像のピクセルAに配置し、カーネルに対応する画像上の25(5x5)ピクセルの合計を見つけて、平均を取り、置き換えます。この平均でそれをピクセルAの値。画像の各ピクセル値が更新されるまで、上記の操作を繰り返します。コードは次のとおりです。実行してみましょう。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('opencv_logo.png')

kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)

plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Averaging')
plt.xticks([]), plt.yticks([])
plt.show()

結果:

画像のぼけ(画像のスムージング)
ローパスフィルターを使用して、画像のぼけの目的を達成します。これは、ノイズ除去に非常に役立ちます。実際には、画像内の高周波成分(ノイズ、境界線など)を削除することです。そのため、境界線が少しぼやけます。(もちろん、境界をぼかさないぼかしテクニックがいくつかあります)。OpenCVは、4つのぼかしテクニックを提供します。

16.1平均

これは、正規化された畳み込みボックスによって行われます。彼は、たたみ込みボックスで覆われた領域のすべてのピクセルの平均値を使用して、中央の要素を置き換えます。関数cv2.blur()およびcv2.boxFilter()を使用して、このタスクを実行できます。コンボリューションボックスの詳細については、ドキュメントも参照してください。コンボリューションボックスの幅と高さを設定する必要があります。以下は、3x3の正規化された畳み込みボックスです。
      K = \ frac {1} {9} \ begin {bmatrix} 1&1&1 \ 1&1&1 \ 1&1&1 \ end {bmatrix}
注:正規化された畳み込みボックスを使用しない場合は、cv2.boxFilter()を使用してから、パラメーターnormalize = Falseを渡す必要があります。
以下は、最初の部分と同じ例です。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('opencv_logo.png')

blur = cv2.blur(img,(5,5))

plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()

結果:

ぼかし

16.2ガウスぼかし

ここで、畳み込みカーネルをガウスカーネルに置き換えます(簡単に言うと、ボックスは変更されず、各ボックスの元の値は等しく、内部の値はガウス分布に従い、ボックスの中心が最大の値になります。 、および残りのボックスは、中心要素からの距離に応じて減少し、ガウスヒルバッグを形成します。元の平均は加重平均になり、ボックス内のすべての値になります)。実装されている関数はcv2.GaussianBlur()です。ガウスカーネルの幅と高さを指定する必要があります(奇数である必要があります)。そして、XおよびY方向に沿ったガウス関数の標準偏差。X方向の標準偏差のみを指定すると、Y方向も同じ値になります。両方の標準偏差が0の場合、関数はカーネル関数のサイズに従ってそれ自体を計算します。ガウスフィルタリングは、画像からガウスノイズを効果的に除去できます。
必要に応じて、関数cv2.getGaussianKernel()を使用してガウスカーネルを自分で構築することもできます。
ガウスぼかしを使用する場合は、上記のコードを次のように記述する必要があります。

#0 是指根据窗口大小( 5,5 )来计算高斯函数标准差
blur = cv2.GaussianBlur(img,(5,5),0)

結果:

ガウシアンぼかし

16.3中央値ブラー

名前が示すように、畳み込みボックスに対応するピクセルの中央値は、中央のピクセルの値を置き換えるために使用されます。このフィルターは、塩とコショウのノイズを除去するためによく使用されます。以前のフィルターは、計算された新しい値を使用して中央のピクセルの値を置き換えますが、中央値フィルターはそれを中央のピクセル(またはそれ自体)の周囲の値に置き換えます。彼は効果的にノイズを取り除くことができます。畳み込みカーネルのサイズも奇数にする必要があります。
この例では、元の画像に50%のノイズを追加してから、中央値のぼかしを使用します。
コード:

median = cv2.medianBlur(img,5)
# 运行有问题,出不了如下结果,下图为照搬的

結果:

中央値のぼかし

16.4バイラテラルフィルタリング

関数cv2.bilateralFilter()は、境界を明確に保ちながら、ノイズを効果的に除去できます。ただし、この操作は他のフィルターよりも遅くなります。ガウスフィルターは、中心点の近くにあるピクセルのガウス加重平均を見つけることであることはすでにわかっています。このガウスフィルターは、ピクセル間の空間的関係のみを考慮し、ピクセル値間の関係(ピクセルの類似性)は考慮しません。したがって、この方法では、ピクセルが境界上にあるかどうかは考慮されません。したがって、境界がぼやけることはなく、これは私たちが望んでいることではありません。バイラテラルフィルタリングは、空間ガウス重みとグレー値類似性ガウス重みの両方を使用します。空間ガウス関数は、隣接する領域のピクセルのみが中心点に影響を与えることを保証し、グレー値の類似性ガウス関数は、中心ピクセルのグレー値のみがブラー操作に使用されるものと類似していることを保証します。したがって、この方法では、境界のグレー値の変化が比較的大きいため、境界がぼやけることはありません。
バイラテラルフィルタリングのコードは次のとおりです。

#cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
#d – Diameter of each pixel neighborhood that is used during filtering.
# If it is non-positive, it is computed from sigmaSpace
#9 邻域直径,两个 75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
blur = cv2.bilateralFilter(img,9,75,75)
# 运行有问题,出不了如下结果,下图为照搬的  

結果:
ご覧ください。上の画像のテクスチャはぼやけていますが、境界線はまだ残っています。

バイラテラルフィルタリング

詳細については、公式アカウントに注意してください。
img

おすすめ

転載: blog.csdn.net/yegeli/article/details/113418884