画像畳み込みフィルタリングの原理と、平均フィルタリング、ボックス フィルタリング、ガウス フィルタリング、メディアン フィルタリング、バイラテラル フィルタリングの Python プログラムの実装

画像畳み込みフィルタリングの基本原理:

2 次元フィルター マトリックス (つまり、畳み込みカーネル) と処理対象の 2 次元画像。画像の各ピクセルについて、その隣接ピクセルとフィルター マトリックスの対応する要素の積を計算し、加算します。それらをピクセル位置の値としてアップし、フィルタリングプロセスを完了します。

写真の説明を入力してください

6×6 の画像が 3×3 のカーネルで畳み込まれ、4×4 の画像が得られ、画像が縮小されることを見つけるのは難しくありません。じゃあどうすればいいの?元の画像を円で拡大して畳み込むことができます.この操作はパディングと呼ばれます.

実際、元の画像は n×n、畳み込みカーネルは f×f、最終結果の画像サイズは (n-f+1) × (n-f+1) です。

写真の説明を入力してください

cv2.copyMakeBorder()画像に境界線を追加するために使用されます。次のパラメーターがあります。

  • src: 処理する元の画像
  • top, bottom, left, right: 上下左右に拡大するピクセル数
  • borderType: ボーダー タイプ。これは注意が必要な塗りつぶし方法です。詳細については、 BorderTypesを参照してください。

一般的に使用される塗りつぶしの種類には、固定値の塗りつぶし、ミラー対称のピクセル塗りつぶしなどがあります。

一般的な画像の平滑化とフィルタリングのアルゴリズム

  • 平均フィルター、ボックス フィルター
  • ガウス フィルター
  • メディアン フィルター
  • バイラテラル フィルタリング

1.平均フィルター、ボックスフィルター

平均フィルタリングは典型的な線形フィルタリング アルゴリズムで、主にピクセル近傍のピクセル値を使用してピクセルの値を計算します。具体的な方法としては、最初にフィルタ テンプレート カーネルを指定します。これは、ピクセルの周囲の他の隣接ピクセルをカバーし、ピクセル自体を削除し、隣接ピクセルを追加してから、平均値を取得してピクセルの新しい値を取得します。ピクセル値、この平均フィルタリングの本質です。

関数:
cv2.blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )

パラメータの説明:

  • InputArray src: Mat タイプの入力画像で、画像深度は CV_8U、CV_16U、CV_16S、CV_32F、および CV_64F のいずれかです。
  • OutputArray dst: 入力画像と同じ深度とタイプの出力画像
  • サイズ ksize: フィルタ テンプレート カーネルのサイズ。通常、Size(3,3) などの Size(w, h) で指定されます。
  • Point anchor=Point(-1, -1): 文字通りアンカー ポイントを意味します, つまり, 処理されたピクセルがカーネル内にある場所です. デフォルト値は (-1, -1) です.カーネル. 特別な必要がなければ、変更は必要ありません
  • int borderType=BORDER_DEFAULT: 画像の外側のピクセルを推測するために使用されるボーダー モードで、デフォルト値は BORDER_DEFAULT です。

メリット:使いやすい、計算しやすい

特徴:コアエリアの貢献率は同じ

2. ガウス フィルター

ガウス フィルタリングは、画像全体の加重平均処理であり、各ピクセルの値は、そのピクセル自体と近傍の他のピクセル値の加重平均によって得られます。

関数:
cv2.GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )

パラメータの説明:

  • InputArray src: Mat タイプの入力画像で、画像深度は CV_8U、CV_16U、CV_16S、CV_32F、CV_64F です。
  • OutputArray dst: 入力画像と同じ型とサイズを持つ出力画像。
  • サイズ ksize: ガウス カーネル サイズ。このサイズは前の 2 つのフィルター カーネル サイズとは異なります。ksize.width と ksize.height は異なる場合がありますが、これら 2 つの値は正の奇数でなければなりません。それらの値は、シグマ計算によって決定されます。
  • double sigmaX: X 方向のガウス カーネル関数の標準偏差
  • double sigmaY: Y 方向のガウス カーネル関数の標準偏差. sigmaY が 0 の場合、関数は自動的に sigmaY の値を sigmaX と同じ値に設定します. sigmaX と sigmaY の両方が 0 の場合、これらの 2 つの値width と ksize.height が計算されます。詳細については、getGaussianKernel() 関数を参照してください。サイズ、sigmaX および sigmaY を指定することをお勧めします。
  • int borderType=BORDER_DEFAULT: 画像の外側のピクセルを推定する便利なモード. BORDER_DEFAULT のデフォルト値があります. 特に必要がなければ変更しないでください. 詳細については, borderInterpolate() 関数を参照してください.

利点: 正規分布に従うノイズに非常に効果的

特徴:核内の面積の寄与率は中心からの距離に比例し、重みはガウス分布に関係する

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

ピクセルのグレー値は、ピクセルの近傍のグレー値の中央値に置き換えられるため、周囲のピクセル値は実際の値に近くなり、孤立したノイズ ポイントが除去されます。この方法では、インパルス ノイズとごま塩ノイズを除去しながら、画像のエッジの詳細を保持できます。

関数:
cv2.medianBlur(InputArray src, OutputArray dst, int ksize)

パラメータの説明:

  • InputArray src: 入力画像、画像は 1、3、または 4 チャンネルの画像です。テンプレート サイズが 3 または 5 の場合、画像の深さは CV_8U、CV_16U、および CV_32F のいずれかになります。たとえば、より大きなアパーチャ サイズ、イメージ深度は CV_8U のみです。
  • OutputArray dst: 出力画像、サイズとタイプは入力画像と一致します。Mat::Clone を使用して、元の画像をテンプレートとして出力画像 dst を初期化できます
  • int ksize: フィルター テンプレートのサイズ。3、5、7 など、1 より大きい奇数にする必要があります。

利点: ごま塩ノイズに効果的

機能: 中心点のピクセル値は、カーネルの中央値ピクセルに置き換えられます

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

画像の空間的近接性とピクセル値の類似性を組み合わせて、空間、情報、およびグレーレベルの類似性を考慮しながら、エッジの保存とノイズ除去の目的を達成するための妥協処理であり、単純で、非-反復およびローカル処理。

関数:

cv2.bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)

パラメータの説明:

  • InputArray src: Mat タイプの入力画像で、画像は 8 ビットまたは浮動小数点のシングル チャネルまたは 3 チャネルの画像である必要があります。
  • OutputArray dst: 元の画像と同じサイズとタイプの出力画像。
  • int d: フィルタリング中の各ピクセル近傍の直径範囲を示します。この値が正でない場合、関数は 5 番目のパラメーター sigmaSpace から値を計算します。
  • double sigmaColor: 色空間フィルターのシグマ値. このパラメーターの値が大きいほど、値が大きくなり、ピクセル近傍の広い色が一緒に混合され、半等色領域が大きくなることを示します.
  • double sigmaSpace: 座標空間でのフィルターのシグマ値。値が大きい場合は、類似した色を持つ離れたピクセルが互いに影響し合うことを意味し、より広い領域で十分に類似した色が同じ色になるようにします。d>0 の場合、d は近傍のサイズを指定し、sigmaSpace に関連します。それ以外の場合、d は sigmaSpace に比例します。
  • int borderType=BORDER_DEFAULT: 画像の外側のピクセルを推測するために使用されるボーダー モードで、デフォルト値は BORDER_DEFAULT です。

機能: 画像のエッジの詳細を十分に保持し、低周波成分のノイズを除去できます。

特徴:バイラテラルフィルターの効率はあまり高くなく、他のフィルターに比べて消費時間が比較的長い

上記のアルゴリズムのプログラム実装は次のとおりです。

# -*- coding:utf-8 -*-
#本程序用于实现各种滤波算法
import cv2  #导入opencv模块
import numpy as np

print("Hellow word!")     #打印“Hello word!”,验证模块导入成功

img = cv2.imread("imag2.jpg")  #导入图片,图片放在程序所在目录
cv2.namedWindow("imagshow", 2)   #创建一个窗口
cv2.imshow('imagshow', img)    #显示原始图片

# 均值滤波
img_mean = cv2.blur(img, (3,3)) #参数1输入图像,参数2核大小
cv2.namedWindow("mean", 2)   #创建一个窗口
cv2.imshow('mean', img_mean)    #显示原始图片

# 高斯滤波
img_Guassian = cv2.GaussianBlur(img,(3,3),0)
cv2.namedWindow("Guassian", 2)   #创建一个窗口
cv2.imshow('Guassian', img_Guassian)    #显示原始图片

# 中值滤波
img_median = cv2.medianBlur(img, 5)
cv2.namedWindow("median", 2)   #创建一个窗口
cv2.imshow('median', img_median)    #显示原始图片

# 双边滤波
img_bilater = cv2.bilateralFilter(img,9,75,75)
cv2.namedWindow("bilater", 2)   #创建一个窗口
cv2.imshow('bilater', img_bilater)    #显示原始图片

cv2.waitKey()

効果画像:
写真の説明を入力してください
完全なコードをダウンロードしてください: opencv 共通フィルター アルゴリズム Python 言語の実装

左から順に、元の画像、メディアン フィルター、バイラテラル フィルター、平均値フィルター、ガウス フィルターです。

おすすめ

転載: blog.csdn.net/u014005758/article/details/88238941