[再現] OpenCV-Pythonシリーズの線形フィルタリング(18)

このチュートリアルでは、OpenCVで一般的に使用されるいくつかの種類のフィルターを紹介し、それらの詳細な原​​理を紹介します。画像フィルタリングは、OpenCV画像処理の非常に重要な部分です。OpenCV全体におけるそのコンポーネントは非常に重要です。それを完全にマスターします。

画像のフィルタリングは、画像の細部を可能な限り維持しながら対象画像のノイズを抑制することであり、画像の前処理では不可欠な操作です。その処理効果の品質は、後続の画像処理と分析の有効性と分析に直接影響します。信頼性。

画像のノイズ成分を除去することを、画像の平滑化またはフィルタリングと呼びます。信号または画像のエネルギーは、ほとんどが振幅スペクトルの低域および中域に集中するのが一般的ですが、より高い周波数帯域では、関心のある情報はノイズに圧倒されることがよくあります。したがって、高周波成分の振幅を低減できるフィルタは、ノイズの影響を低減できます。

画像フィルタリングの目的は2つあります
。1つは画像認識の特徴モードとしてオブジェクトの特徴を抽出すること、もう1つは
画像処理の要件に適応して画像をデジタル化するときに混入するノイズを除去することです。

また、フィルター処理には2つの要件があります
。1つは
画像の輪郭やエッジなどの重要な情報に損傷を与えないことであり、もう1つは画像を鮮明で良好なものにすることです。

平滑化フィルタリングは、低周波数強調のための空間領域フィルタリング技術です。その目的には2つのカテゴリがあります
。1つはぼかし、
もう1つはノイズを除去することです。

空間領域での平滑化とフィルタリングは、一般的に単純な平均法によって実行されます。これは、隣接するピクセルポイントの平均輝度値を見つけることです。近傍のサイズは平滑化効果に直接関係します。近傍が大きいほど平滑化効果は高くなりますが、近傍が大きすぎると、平滑化によりエッジ情報の損失が大きくなり、出力画像が不鮮明になるため、適切な選択が必要です近所のサイズ。
  フィルターに関して、画像のメタファーは、フィルターを重み付け係数を含むウィンドウと考えることができます。このフィルターを使用して画像を平滑化する場合、このウィンドウを画像の上に配置して、このウィンドウを通過させます。得られた画像を見てください。

原理

近傍演算子(ローカル演算子)は、特定のピクセルの周囲のピクセル値を使用して、このピクセルの最終的な出力値を決定する演算子です。線形近傍フィルタリングは、一般的に使用される近傍演算子です。ピクセルの出力値は、入力ピクセルの加重和に依存します。具体的なプロセスは次のとおりです。
ここに画像の説明を挿入

左の画像と中央の画像の畳み込みにより、右の画像が生成されます。ターゲット画像の青でマークされたピクセルは、元の画像の赤でマークされたピクセルを使用して計算されます。

ローカルトーン調整に加えて、近傍演算子を画像のフィルタリングに使用して、画像の平滑化と鮮明化、画像のエッジの強調、または画像のノイズの除去を実現できます。この記事で紹介する主役は線形近傍フィルター演算子です。線形近傍フィルター演算子は、異なる重みを使用して小さな近傍のピクセルを組み合わせ、目的の処理効果を得ます。

出力画素値線形フィルタリングプロセスは、ある加重和入力画素値の

加重和を「コア」と呼ばれ、フィルタの重み付け係数は、フィルタの「フィルタリング係数」です。

上記の式は簡単に書くことができます:
ここに画像の説明を挿入

ここで、fは入力ピクセル値を表し、hは重み付け係数「コア」を表し、gは出力ピクセル値を表します

OpenCVの新しいバージョンでは、次の3つの一般的に使用される線形フィルタリング操作が提供されています。これらは、使いやすい非常に便利な個別の関数にカプセル化されています。

1平均フィルターぼかし関数
2ボックスフィルターボックスぼかし関数3ガウスフィルターガウスぼかし
関数

平均フィルター

平均フィルターはローパスフィルターであり、線形フィルターでもあります。画像の場合、そのピクセル値は0〜255であることは誰でも知っています。一般的に、フィルターで使用されるフィルターテンプレートは奇数です。ここでは例として3 * 3を取り上げます。
ここに画像の説明を挿入

真ん中の黄色の部分はフィルターテンプレート(たたみ込みカーネル)で、画像とのたたみ込みとその後のフィルター処理に使用されます。平均フィルターの場合、名前が示すように、そのピクセルポイントは中央の9つのピクセル値の平均であり、画像全体になります。のピクセルは、この平均ピクセルに置き換えられます。
ここに画像の説明を挿入

関数プロトタイプ:
dst = cv.blur(src、ksize [、dst [、anchor [、borderType]]])

最初のパラメーターは入力画像で、2番目のパラメーターはたたみ込みカーネルのサイズで、残りはデフォルト値を使用できます。

サンプルコードを与える:

	view plaincopy to clipboardprint?
import cv2  
import matplotl	ib.pyplot as plt  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
blur = cv2.blur(img,(5,5))  
cv2.imshow("org",img)  
cv2.imshow("result", blur)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

ここに画像の説明を挿入
欠陥:平均フィルタリング自体に固有の欠陥があります。つまり、画像の細部を適切に保護できません。また、画像のノイズを除去しながら画像の詳細を破壊するため、画像が不鮮明になり、ノイズポイントを適切に削除できません。特に塩コショウノイズ

ボックスフィルター

実際、ボックスフィルターと平均フィルターは基本的に同じです。ソースコードを直接見てみましょう。

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

boxFilterは、iボックスフィルター関数です。

	view plaincopy to clipboardprint?
normalize=True  

これは、平均フィルターとまったく同じです。図に示すように、フィルター処理されたピクセル値の計算方法も平均計算です。

ここに画像の説明を挿入

でもいつ

view plaincopy to clipboardprint?
normalize=False  

これは平均値ではなく、畳み込みカーネル内のすべてのピクセル値の合計であり、9で除算しないで、図に示すように、255より大きい値の場合、代わりにすべて255になります。
ここに画像の説明を挿入

ガウスフィルタリング

ガウスフィルタリングは線形平滑化フィルターであり、ガウスノイズを除去するのに適しており、画像処理のノイズ低減プロセスで広く使用されています。素人の言葉で言えば、ガウスフィルタリングは画像全体の加重平均プロセスです。各ピクセルの値は、それ自体と近隣の他のピクセル値の加重平均によって取得されます。ガウスフィルタリングの特定の操作は、テンプレート(または畳み込み、マスク)を使用して画像の各ピクセルをスキャンし、テンプレートによって決定された近傍のピクセルの加重平均グレー値を使用して、テンプレートの中心ピクセルの値を置き換えることです。

まず、ガウス関数を理解しましょう。ガウス分布関数は、確率論における正規分布の確率密度関数を指します。平均μ= 0の場合の1次元および2次元の形式は、次のとおりです。このうち、σは正規分布の標準偏差であり、その値は関数の減衰速度を決定します。
ここに画像の説明を挿入
ここに画像の説明を挿入
これらの2つの式から、2次元の式が実際に2つの1次元関数の乗算に等しいことを理解することは難しくありません。確率論の観点から、確率変数XとYは互いに独立しているため、それらの結合確率密度は限界確率密度の積に等しくなります。この機能は非常に重要です。次に、ガウス関数と2次元ガウス畳み込みカーネルの画像分布を見てみましょう。
ここに画像の説明を挿入
ここに画像の説明を挿入

画像では、起点に近い位置が高く、起点から離れるほど地形が低くなります。同様に、畳み込みカーネルも最大の中心値を持ち、周囲に向かって減少します。減少の大きさはランダムではありませんが、ガウス関数の画像を近似するために、畳み込みカーネル全体が必要です。ガウスフィルタリングは本質的に加重平均フィルタリングであるため、平均化を達成するために、カーネルには上図の1/16や1/8のような係数もあります。これらの係数は、行列内のすべての値の合計に等しくなります。相互。

理解できない人もいるかもしれませんが、ガウシアンフィルタリングの原理について簡単に説明します。次の図を例にとります。
ここに画像の説明を挿入

中央の204が中心点であると仮定すると、次の図のように、重み係数が中心点に近いほど重み係数が大きくなるというガウスフィルタリングの原理があります。
ここに画像の説明を挿入

次に、距離204に近づくほど、重み係数は大きくなります。それでも、平均フィルターとは非常に異なります。平均フィルターは、204付近の75と24の2つの小さい値に非常に不利であり、これにより、大きな誤差が発生します。ただし、ガウスフィルター処理とは、あなたが私の近くにいる場合は食べるのが美味しいことを意味し、遠くにいる場合は、値の大小に関係なく音声コンポーネントがそれほど重くなることはありません。関数プロトタイプを見てみましょう:

GaussianBlur(src、ksize、sigmaX [、dst [、sigmaY [、borderType]]])-> dst

——Src入力画像。画像には任意の数のチャネルを含めることができ、これらのチャネルは個別に処理できますが、深度はCV_8U、CV_16U、CV_16S、CV_32F、またはCV_64Fにする必要があります。

——dst出力イメージのサイズとタイプはsrcと同じです。

——Ksizeガウスカーネルサイズ。ksize.widthとksize.heightは異なる場合がありますが、両方とも正で奇数、またはゼロでなければならず、シグマに従って計算されます。

-SigmaX X方向のガウスカーネル標準偏差。

-sigmaYガウスカーネル標準偏差(Y方向)。sigmaYがゼロの場合はsigmaXに設定します。2つのシグマがゼロの場合は、それぞれksize.widthとksize.heightから計算され、結果を完全に制御します。これらすべてのセマンティクスの将来の変更に関係なく、すべてのksize、sigmaX、およびsigmaYを指定することをお勧めします。

コードを見てみましょう:

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

ここに画像の説明を挿入

3つの線形フィルターのいずれも、画像のソルトアンドペッパーノイズを十分に除去できないことがわかります。ソルトアンドペッパーノイズを除去するには、次に導入する非線形フィルターを使用する必要があります。これらの3つのフィルターを要約しましょう:
ここに画像の説明を挿入
記事の要約ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
さらに多くのopenvino技術情報をグループで交換できます〜
ここに画像の説明を挿入

おすすめ

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