logo

C++ でのガウス フィルターの生成

ガウスフィルタリング 画像処理の分野で広く使われています。 画像のノイズを軽減するために使用されます。 この記事では、 2D ガウス カーネル。 2D ガウス カーネルは、以下の所定のガウス分布に従います。 
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
ここで、 y は原点からの垂直軸に沿った距離、 x は原点からの水平軸に沿った距離、 ? は原点からの水平軸に沿った距離です。は標準偏差です。

ガウスフィルタリングとは何ですか?

ガウス フィルタリングは、画像を滑らかにしてノイズを低減するために画像処理で使用される技術です。 これは、ガウス関数と呼ばれる数学関数を使用してぼかし効果を適用することで機能します。この関数は、中心のピクセルに多くの重みを与え、周囲のピクセルに重みを与えません。これにより、自然なぼかしが得られ、粒子や小さなアーティファクトなどの不要なディテールが除去されます。ガウス フィルタリングは、エッジ検出オブジェクト認識や画像強調などのタスクの前処理ステップとして広く使用されており、アルゴリズムが重要な機能に焦点を当てやすくなります。



C++での実装  

C++
// C++ program to generate Gaussian filter #include  #include    #include    using namespace std; // Function to create Gaussian filter void FilterCreation(double GKernel[][5]) {  // initialising standard deviation to 1.0  double sigma = 1.0;  double r s = 2.0 * sigma * sigma;  // sum is for normalization  double sum = 0.0;  // generating 5x5 kernel  for (int x = -2; x <= 2; x++) {  for (int y = -2; y <= 2; y++) {  r = sqrt(x * x + y * y);  GKernel[x + 2][y + 2] = (exp(-(r * r) / s)) / (M_PI * s);  sum += GKernel[x + 2][y + 2];  }  }  // normalising the Kernel  for (int i = 0; i < 5; ++i)  for (int j = 0; j < 5; ++j)  GKernel[i][j] /= sum; } // Driver program to test above function int main() {  double GKernel[5][5];  FilterCreation(GKernel);  for (int i = 0; i < 5; ++i) {  for (int j = 0; j < 5; ++j)  cout << GKernel[i][j] << 't';  cout << endl;  } } 

出力: 

0.00296902 0.0133062 0.0219382 0.0133062 0.00296902   
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.0219382 0.0983203 0.162103 0.0983203 0.0219382
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.00296902 0.0133062 0.0219382 0.0133062 0.00296902 

ガウス フィルタリングの実世界への応用

ガウス フィルターは、日常の多くのテクノロジーで使用されています。 画質を向上させる そして 有益な情報を抽出する :

  • コンピュータビジョン : 検出アルゴリズムを適用する前にノイズを低減することで、エッジと形状の検出を支援します。
  • 医用画像処理 : MRI または CT スキャンを滑らかにするために使用され、組織や異常を特定しやすくなります。
  • 物体検出 : 気を散らすものを取り除いて画像を準備し、モデルが主要な特徴に集中できるようにします。
  • 写真編集ツール : 適用によく使用されます ぼかし効果 画像を柔らかくしたり、粒状感を軽減して見た目をきれいにします。

他のフィルターとの比較

その方法は次のとおりです ガウスフィルター 他の一般的なフィルターとは異なります。



  • ボックスフィルター(平均フィルター) :与えることで画像をぼかします 等しい重み 周囲のすべてのピクセルに適用されます。ガウス フィルターの方が優れています。 中心ピクセルの重みを増やす より滑らかで自然なぼかしを作成します。
  • メディアンフィルター : 各ピクセルを 中央値 近くの値を削除するのに最適です ごま塩ノイズ 。ガウスとは異なり、画像はそれほどぼやけませんが、エッジが歪む可能性があります。
  • バイラテラルフィルター : ガウスと同様ですが、同様に考慮します ピクセル強度 差異の保存 エッジ スムージングしながら。より高度ですが、さらに多くの機能を備えています 計算的に重い

2D 対 1D ガウス フィルタリング

2Dガウスフィルター に分解できます 2 つの 1D フィルター — 水平方向と垂直方向に 1 つずつ。これはと呼ばれます 分離性 これは、完全な 2D カーネルを一度に適用する必要がないことを意味します。

なぜそれが重要なのか:

大きな 2D カーネル (例: 5×5) で重い計算を行う代わりに、 1D カーネルを水平方向に それから 垂直方向に同じカーネル 。これにより計算時間が短縮され、次の結果が得られます。 同じ結果

Javaスライス

パフォーマンスに関する考慮事項

の生成と適用 ガウスカーネル できる 計算コストが高い 特に大きなイメージやカーネルの場合。



  • 時間計算量 :
    • 一定のサイズのカーネルの場合 k×k に適用される n×n 時間計算量をイメージしてください O(n² × k²)
    • これは、各ピクセル操作にカーネル全体のループが含まれるためです。
  • 最適化 – 分離可能なフィルター :
    ガウスカーネルは、 分離可能な つまり、2D フィルターは侵入できるということです。 2 つの 1D フィルター : 水平方向と垂直方向に 1 つずつ。
    • これにより、時間の複雑さが軽減されます。 O(n² × k) それを作る はるかに速い より大きなカーネルの場合。

分離可能なフィルタを使用することは、品質を損なうことなくガウス フィルタリングを高速化するための実際のシステムにおける一般的な手法です。

必読

  • Python を使用して画像にガウス フィルターを適用する
  • NumPy を使用して 2 次元ガウス配列を生成するにはどうすればよいですか?
  • ガウス関数の統合

結論

ガウス フィルタリングは、シンプルでありながら強力な手法です。 画像のノイズとぼやけを軽減する ガウス関数に基づく滑らかな加重平均を使用します。この記事では、 2D ガウス カーネル そしてさまざまな分野でのその役割を調査しました 現実世界のアプリケーション コンピュータービジョンの医療画像処理や写真編集など。他のフィルターとの比較や、 パフォーマンスを最適化する 分離可能なフィルターを使用。全体的なガウス フィルタリングは、 画像処理の基本ツール これにより、画質が向上し、アルゴリズムが重要な視覚的詳細に焦点を合わせやすくなります。