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

目的

  • ここでは収縮 (Erosion)、膨張 (Dilation)、オープニング (Opening)、クロージング (Closing) などのさまざまなモルフォロジー演算を学ぶ。
  • 次のようなさまざまな関数を学ぶ:cv.erode(), cv.dilate(), cv.morphologyEx() など。

理論

モルフォロジー変換は、画像の形状に基づくいくつかの単純な演算である。通常は二値画像に対して実行される。2つの入力が必要で、1つは元の画像、もう1つは構造要素またはカーネルと呼ばれるもので、演算の性質を決定する。基本的なモルフォロジー演算子は収縮 (Erosion) と膨張 (Dilation) の2つである。さらに、オープニング (Opening)、クロージング (Closing)、勾配 (Gradient) などの派生形も登場する。以下の画像を使って、これらを1つずつ見ていく:

image

1. 収縮 (Erosion)

収縮の基本的な考え方は土壌侵食とまさに同じで、前景オブジェクトの境界を削り取っていく(前景は常に白で保つようにするとよい)。では、何をするのか。カーネルが画像上をスライドする(2次元の畳み込みと同様)。元画像のピクセル(1または0)は、カーネル下のすべてのピクセルが1である場合のみ1とみなされ、そうでなければ収縮される(0にされる)。

つまり、カーネルのサイズに応じて、境界付近のすべてのピクセルが除去される。その結果、前景オブジェクトの太さやサイズが減少する、言い換えれば画像内の白い領域が減少する。これは、小さな白いノイズを除去する(カラースペースの章で見たように)、つながった2つのオブジェクトを切り離す、などに役立つ。

次の関数を使う:cv.erode (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())

引数
src入力画像。チャンネル数は任意でよいが、ビット深度は cv.CV_8U, cv.CV_16U, cv.CV_16S, cv.CV_32F, cv.CV_64F のいずれかである必要がある。
dstsrc と同じサイズ・型の出力画像。
kernel収縮に用いる構造要素。
anchor要素内におけるアンカーの位置。デフォルト値 new cv.Point(-1, -1) は、アンカーが要素の中心にあることを意味する。
iterations収縮を適用する回数。
borderTypeピクセルの外挿方法(cv.BorderTypes を参照)。
borderValue定数境界の場合の境界値

試してみよう

2. 膨張 (Dilation)

これは収縮のちょうど逆である。ここでは、カーネル下に少なくとも1つのピクセルが '1' であれば、ピクセル要素は '1' になる。したがって、画像内の白い領域が増加する、つまり前景オブジェクトのサイズが大きくなる。通常、ノイズ除去のような場合には、収縮の後に膨張を行う。なぜなら、収縮は白いノイズを除去するが、同時にオブジェクトも縮小させるからである。そこで膨張させる。ノイズは消えているので戻ってこないが、オブジェクトの面積は増加する。これは、オブジェクトの途切れた部分をつなぐのにも役立つ。

次の関数を使う:cv.dilate (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())

引数
src入力画像。チャンネル数は任意でよいが、ビット深度は cv.CV_8U, cv.CV_16U, cv.CV_16S, cv.CV_32F, cv.CV_64F のいずれかである必要がある。
dstsrc と同じサイズ・型の出力画像。
kernel膨張に用いる構造要素。
anchor要素内におけるアンカーの位置。デフォルト値 new cv.Point(-1, -1) は、アンカーが要素の中心にあることを意味する。
iterations膨張を適用する回数。
borderTypeピクセルの外挿方法(cv.BorderTypes を参照)。
borderValue定数境界の場合の境界値

試してみよう

3. オープニング (Opening)

オープニングとは、収縮の後に膨張を行う処理の別名にすぎない。ノイズの除去に役立つ。

次の関数を使う:cv.morphologyEx (src, dst, op, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())

引数
src入力画像。チャンネル数は任意でよい。ビット深度は cv.CV_8U, cv.CV_16U, cv.CV_16S, cv.CV_32F, cv.CV_64F のいずれかである必要がある
dst入力画像と同じサイズ・同じ型の出力画像。
opモルフォロジー演算の種類(cv.MorphTypes を参照)。
kernel構造要素。cv.getStructuringElement を用いて作成できる。
anchorカーネル内のアンカー位置。負の値はアンカーがカーネルの中心にあることを意味する。
iterations膨張を適用する回数。
borderTypeピクセルの外挿方法(cv.BorderTypes を参照)。
borderValue境界が定数の場合の境界値。デフォルト値には特別な意味がある。

試してみよう

4. クロージング (Closing)

クロージングはオープニングの逆で、膨張の後に収縮を行う処理である。前景オブジェクト内部の小さな穴や、オブジェクト上の小さな黒い点を埋めるのに役立つ。

試してみよう

5. モルフォロジー勾配 (Morphological Gradient)

これは、画像の膨張と収縮の差分である。

結果はオブジェクトの輪郭のようになる。

試してみよう

6. トップハット (Top Hat)

これは、入力画像とその画像のオープニングとの差分である。

試してみよう

7. ブラックハット (Black Hat)

これは、入力画像のクロージングと入力画像との差分である。

試してみよう

構造要素

前の例では、cv.Mat.ones を用いて手動で構造要素を作成した。これは長方形である。しかし、楕円形・円形のカーネルやひし形のカーネルが必要になる場合もある。そのために、OpenCV には cv.getStructuringElement() という関数がある。カーネルの形状とサイズを渡すだけで、目的のカーネルが得られる。

次の関数を使う:cv.getStructuringElement (shape, ksize, anchor = new cv.Point(-1, -1))

引数
shape要素の形状。cv.MorphShapes のいずれかを指定できる
ksize構造要素のサイズ。
anchor要素内のアンカー位置。デフォルト値 [−1,−1] はアンカーが中心にあることを意味する。なお、アンカー位置に依存して形状が変わるのは十字形の要素のみである。それ以外の場合、アンカーはモルフォロジー演算の結果がどれだけシフトするかを調整するだけである。

試してみよう