OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
より発展的なモルフォロジー変換

前のチュートリアル: 収縮と膨張
次のチュートリアル: Hit-or-Miss変換

原著者Ana Huamán
互換性OpenCV >= 3.0

目的

このチュートリアルでは、以下の方法を学ぶ:

  • Use the OpenCV function cv::morphologyEx to apply Morphological Transformation such as:
    • オープニング
    • クロージング
    • モルフォロジー勾配
    • トップハット
    • ブラックハット

理論

覚え書き
以下の説明は、BradskiとKaehlerによる書籍 Learning OpenCV に基づくものである。

前のチュートリアルでは、2つの基本的なモルフォロジー演算を扱った。

  • 収縮 (Erosion)
  • 膨張 (Dilation)。

これら2つを基にして、画像に対してより高度な変換を行うことができる。ここでは、OpenCVが提供する5つの演算について簡潔に説明する。

オープニング

  • 画像を収縮した後に膨張することで得られる。

    \[dst = open( src, element) = dilate( erode( src, element ) )\]

  • 小さな物体を除去するのに有用である (物体は暗い前景上で明るいものと仮定する)
  • たとえば、以下の例を見てほしい。左の画像が元画像で、右の画像がオープニング変換を適用した結果である。小さな点が消えていることが観察できる。

クロージング

  • 画像を膨張した後に収縮することで得られる。

    \[dst = close( src, element ) = erode( dilate( src, element ) )\]

  • 小さな穴 (暗い領域) を除去するのに有用である。

モルフォロジー勾配

  • 画像の膨張と収縮の差である。

    \[dst = morph_{grad}( src, element ) = dilate( src, element ) - erode( src, element )\]

  • 以下に示すように、物体の輪郭を見つけるのに有用である。

トップハット

  • 入力画像とそのオープニングの差である。

    \[dst = tophat( src, element ) = src - open( src, element )\]

ブラックハット

  • クロージングとその入力画像の差である

    \[dst = blackhat( src, element ) = close( src, element ) - src\]

コード

解説

  1. Let's check the general structure of the C++ program:
    • 画像を読み込む
    • モルフォロジー演算の結果を表示するためのウィンドウを作成する
    • Create three Trackbars for the user to enter parameters:
      • 1つ目のトラックバー Operator は、使用するモルフォロジー演算の種類 (morph_operator) を返す。
        createTrackbar("Operator:\n 0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat", window_name, &morph_operator, max_operator, Morphology_Operations );
      • 2つ目のトラックバー Elementmorph_elem を返し、これはカーネルの構造の種類を示す。
        createTrackbar( "Element:\n 0: Rect - 1: Cross - 2: Ellipse - 3: Diamond", window_name,
        &morph_elem, max_elem,
        Morphology_Operations );
      • 最後のトラックバー Kernel Size は、使用するカーネルのサイズ (morph_size) を返す
        createTrackbar( "Kernel size:\n 2n +1", window_name,
        &morph_size, max_kernel_size,
        Morphology_Operations );
    • いずれかのスライダーを動かすたびに、ユーザー関数 Morphology_Operations が呼ばれて新しいモルフォロジー演算を実行し、現在のトラックバーの値に基づいて出力画像を更新する。

      void Morphology_Operations( int, void* )
      {
      // Since MORPH_X : 2,3,4,5 and 6
      int operation = morph_operator + 2;
      Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );
      morphologyEx( src, dst, operation, element );
      imshow( window_name, dst );
      }

      モルフォロジー変換を実行する主要な関数は cv::morphologyEx であることが分かる。この例では4つの引数を使う (残りはデフォルトのままにする)。

      • src : 元 (入力) 画像
      • dst: 出力画像
      • operation: 実行するモルフォロジー変換の種類。次の5つの選択肢がある点に注意する。

        • オープニング: MORPH_OPEN : 2
        • クロージング: MORPH_CLOSE: 3
        • 勾配: MORPH_GRADIENT: 4
        • トップハット: MORPH_TOPHAT: 5
        • ブラックハット: MORPH_BLACKHAT: 6

        見てのとおり値の範囲は <2-6> である。これがトラックバーで入力された値に (+2) を加える理由である。

        int operation = morph_operator + 2;
      • element: 使用するカーネル。独自の構造を定義するために cv::getStructuringElement 関数を使う。

結果

  • 上記のコードをコンパイルした後、画像のパスを引数として渡して実行できる。画像 baboon.png を使った結果は次のとおりである。
  • そして、表示ウィンドウのスナップショットを2枚示す。1枚目の画像は、クロス型カーネルでオープニング演算子を適用した後の出力を示している。2枚目の画像(右側)は、楕円型カーネルでブラックハット演算子を適用した結果を示している。