![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
モルフォロジー変換は、画像の形状に基づくいくつかの単純な演算である。通常は二値画像に対して実行される。2つの入力が必要で、1つは元の画像、もう1つは構造要素またはカーネルと呼ばれるもので、演算の性質を決定する。基本的なモルフォロジー演算子は収縮 (Erosion) と膨張 (Dilation) の2つである。さらに、オープニング (Opening)、クロージング (Closing)、勾配 (Gradient) などの派生形も登場する。以下の画像を使って、これらを1つずつ見ていく:
収縮の基本的な考え方は土壌侵食とまさに同じで、前景オブジェクトの境界を削り取っていく(前景は常に白で保つようにするとよい)。では、何をするのか。カーネルが画像上をスライドする(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 のいずれかである必要がある。 |
| dst | src と同じサイズ・型の出力画像。 |
| kernel | 収縮に用いる構造要素。 |
| anchor | 要素内におけるアンカーの位置。デフォルト値 new cv.Point(-1, -1) は、アンカーが要素の中心にあることを意味する。 |
| iterations | 収縮を適用する回数。 |
| borderType | ピクセルの外挿方法(cv.BorderTypes を参照)。 |
| borderValue | 定数境界の場合の境界値 |
これは収縮のちょうど逆である。ここでは、カーネル下に少なくとも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 のいずれかである必要がある。 |
| dst | src と同じサイズ・型の出力画像。 |
| kernel | 膨張に用いる構造要素。 |
| anchor | 要素内におけるアンカーの位置。デフォルト値 new cv.Point(-1, -1) は、アンカーが要素の中心にあることを意味する。 |
| iterations | 膨張を適用する回数。 |
| borderType | ピクセルの外挿方法(cv.BorderTypes を参照)。 |
| borderValue | 定数境界の場合の境界値 |
オープニングとは、収縮の後に膨張を行う処理の別名にすぎない。ノイズの除去に役立つ。
次の関数を使う: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 | 境界が定数の場合の境界値。デフォルト値には特別な意味がある。 |
クロージングはオープニングの逆で、膨張の後に収縮を行う処理である。前景オブジェクト内部の小さな穴や、オブジェクト上の小さな黒い点を埋めるのに役立つ。
これは、画像の膨張と収縮の差分である。
結果はオブジェクトの輪郭のようになる。
これは、入力画像とその画像のオープニングとの差分である。
これは、入力画像のクロージングと入力画像との差分である。
前の例では、cv.Mat.ones を用いて手動で構造要素を作成した。これは長方形である。しかし、楕円形・円形のカーネルやひし形のカーネルが必要になる場合もある。そのために、OpenCV には cv.getStructuringElement() という関数がある。カーネルの形状とサイズを渡すだけで、目的のカーネルが得られる。
次の関数を使う:cv.getStructuringElement (shape, ksize, anchor = new cv.Point(-1, -1))
| shape | 要素の形状。cv.MorphShapes のいずれかを指定できる |
| ksize | 構造要素のサイズ。 |
| anchor | 要素内のアンカー位置。デフォルト値 [−1,−1] はアンカーが中心にあることを意味する。なお、アンカー位置に依存して形状が変わるのは十字形の要素のみである。それ以外の場合、アンカーはモルフォロジー演算の結果がどれだけシフトするかを調整するだけである。 |