6. opencv-python画像処理の応用操作(3) - 画像のスムージングとフィルタリング

学習目標

画像のノイズの種類を理解する

平均フィルタリング、ガウス フィルタリング、メディアン フィルタリングなどについて学びます。

フィルターを使用して画像を処理する機能

1. 画像のノイズ

画像の収集、処理、送信のプロセスには必然的にノイズが混入するため、人々による画像の理解と分析が妨げられます。一般的な画像ノイズには、ガウス ノイズ、塩胡椒ノイズなどがあります。

1. 塩胡椒ノイズ

インパルス ノイズとも呼ばれるソルト アンド ペッパー ノイズは、画像でよく見られるノイズの一種です。ランダムに現れる白または黒の点です。明るい領域では黒いピクセル、暗い領域では白いピクセルになることがあります
。 . (または両方)。
コショウノイズは、画像信号への突然の強い干渉、アナログ/デジタルコンバーター、またはビット伝送エラーなどによって発生する可能性があります。たとえば、センサーが故障すると最小ピクセル値が得られ、センサーが飽和すると最大ピクセル値が得られます。
ここに画像の説明を挿入します

2. ガウスノイズ

ガウス ノイズとは、ノイズ密度関数がガウス分布に従うタイプのノイズを指します。空間領域および周波数領域におけるガウス ノイズは数学的に扱いやすいため、このノイズ (ノーマル ノイズとも呼ばれる) モデルが実際によく使用されます。ガウス確率変数 z の確率密度関数は次の式で与えられます。
ここに画像の説明を挿入します
ここで、z はグレー値を表し、μ は z の平均値または期待値を表し、δ は z の標準偏差を表します。ラベルの差δ2の二乗をzの分散と呼びます。ガウス関数の曲線を図に示します。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2. 画像平滑化処理

信号処理の観点から見ると、画像の平滑化は高周波情報を除去し、低周波情報を保持することです。したがって、画像にローパス フィルタリングを実装できます。ローパス フィルタリングは、画像内のノイズを除去し、画像を滑らかにすることができます。
フィルタリングの違いに応じて、平均フィルタリング、ガウスフィルタリング、メディアンフィルタリング、バイラテラルフィルタリングに分けることができます

1. 平均値フィルタリング

平均値フィルタリングを使用して画像ノイズを除去します。また、(x, y) 点を中心とし、サイズが mxn のマトリックス サブイメージ ウィンドウの座標グループも表します。平均フィルターは次のように表すことができます。
ここに画像の説明を挿入します
正規化された畳み込みボックスによって完成されます。中心要素を、畳み込みボックスでカバーされる領域内のすべてのピクセルの平均に置き換えます。
たとえば、3X3 の正規化された平均化フィルターは次のようになります。

ここに画像の説明を挿入します
平均値フィルタリングの利点は、アルゴリズムが単純で計算速度が速いことです。欠点は、ノイズ除去中に多くの詳細が削除され、画像が非常にぼやけてしまうことです。

(1)API

cv.blur(src, ksize, anchor, borderType)

パラメータ:
src: 入力画像
ksize: コンボリューションカーネルサイズ
アンカー: コアの中心を示すデフォルト値 (-1,-1)
borderType: ボーダータイプ

(2) コード例

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/dogsp.jpeg')
# 2 均值滤波
blur = cv.blur(img,(5,5))
# 3 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('均值滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()

ここに画像の説明を挿入します

2. ガウスフィルター

2 次元ガウスはガウス フィルターを構築するための基礎です。その確率分布関数は次のとおりです:
ここに画像の説明を挿入します
G(x, y) の分布は上げられた帽子の形をしています。ここでの δ は 2 つの値と見なすことができ、1 つは x の値と見なされます方向の標準偏差δx、もう一方はy方向のラベル差δyで、
ここに画像の説明を挿入します
δxとδyの値が大きいほど全体の形状が平坦になる傾向があり、δxとδyの場合は全体の形状が平坦になる傾向があります。形状がより突き出ています。

正規分布は釣鐘型の曲線で、中心に近づくほど値が大きくなり、中心から離れるほど値が小さくなります。スムージング結果を計算するときは、「中心点」を原点として使用し、法線曲線上の位置に応じて他の点に重みを割り当て、加重平均を取得するだけです。

ガウス平滑化は、画像からガウス ノイズを除去するのに非常に効果的です。<\font>

(1) ガウス平滑化処理

1) まず重み行列を決定します

中心点の座標が (0, 0) であると仮定すると、それに近い 8 つの点の座標は次のようになります。それ
ここに画像の説明を挿入します
以降の点も同じです。
重み行列を計算するには、δ の値を設定する必要があります。δ = 1.5 と仮定すると、ぼかし半径 1 の重み行列は次のようになります: これら 9 点の重みの合計は 0.4787147 に等しくなります
ここに画像の説明を挿入します
。これら 9 つのポイントの加重平均を計算するだけで、それらの重みの合計を 1 に等しくする必要があるため、最終的な重み行列を取得するには、上記の 9 つの値を 0.4787147 で割る必要があります。
ここに画像の説明を挿入します

2) ガウスぼかしを計算する

重み行列を使用すると、ガウスぼかしの値を計算できます。
現在 9 つのピクセルがあり、グレースケール値 (0 ~ 255) が次のようになっていると仮定します。
ここに画像の説明を挿入します
各ポイントには、対応する重み値が乗算されます。

ここに画像の説明を挿入します
最終的に、行列は次のように取得されます。

ここに画像の説明を挿入します
これら9つの値を加算したものが中心点のガウスぼかし値となります。
すべてのポイントに対してこのプロセスを繰り返して、ガウスぼやけた画像を取得します。元の画像がカラー画像の場合、3 つの RGB チャネルでガウス平滑化を実行できます。

(2)API

cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)

パラメータ:
src: 入力画像
ksize: ガウス コンボリューション カーネルのサイズ、注意: コンボリューション カーネルの幅と高さは奇数である必要があり、異なる値にすることもできます。 sigmaX: 水平方向の標準偏差 sigmaY: 水平方向の
標準
偏差垂直方向。デフォルト値は 0 で、sigmaX
borderType: パディングボーダータイプと同じを示します。

(3) コード例

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/dogGasuss.jpeg')
# 2 高斯滤波
blur = cv.GaussianBlur(img,(3,3),1)
# 3 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('高斯滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()

ここに画像の説明を挿入します

3. メディアンフィルタリング

メディアン フィルタリングは典型的な非線形フィルタリング テクノロジであり、基本的な考え方は、ピクセルのグレー値を、そのピクセルの近傍のグレー値の中央値に置き換えることです。
メディアン フィルタリングは、一般的な値と大きく異なる近傍の値に依存しないため、ごま塩ノイズに特に役立ちます。

(1)API

cv.medianBlur(src, ksize )

パラメータ:
src: 入力画像
ksize: コンボリューションカーネルのサイズ

(2) コード例

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/dogsp.jpeg')
# 2 中值滤波
blur = cv.medianBlur(img,5)
# 3 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('中值滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()

ここに画像の説明を挿入します

要約する

画像ノイズ

塩とコショウのノイズ

ガウスノイズ

画像の平滑化

平均フィルター

アルゴリズムはシンプルで計算速度は速いですが、ノイズ除去プロセス中に多くの有用な情報が削除されるため、画像が非常にぼやけてしまいます。

ガウスフィルター

ガウスノイズも除去できますが、計算量が多く処理が複雑です。

メディアンフィルター

塩胡椒ノイズを除去するのに使いやすいです。

おすすめ

転載: blog.csdn.net/weixin_44463519/article/details/125978745