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

前のチュートリアル: 画像の平滑化
次のチュートリアル: さらなるモルフォロジー変換

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

目的

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

  • Apply two very common morphological operators: Erosion and Dilation. For this purpose, you will use the following OpenCV functions:
覚え書き
以下の説明は、BradskiとKaehlerによる書籍 Learning OpenCV に基づくものである。

モルフォロジー演算

  • 簡単に言えば、形状に基づいて画像を処理する一連の演算である。モルフォロジー演算は構造化要素 (structuring element)を入力画像に適用し、出力画像を生成する。
  • The most basic morphological operations are: Erosion and Dilation. They have a wide array of uses, i.e. :
    • ノイズの除去
    • 画像内の個々の要素の分離、および離れた要素の連結。
    • 画像内の輝度の盛り上がりや穴の検出
  • 次の画像を例として、膨張と収縮を簡単に説明する。

膨張

  • この演算は、画像 \(A\) を、任意の形状やサイズ(通常は正方形または円)を持つカーネル ( \(B\)) で畳み込むことから成る。
  • カーネル \(B\) にはアンカー点 (anchor point)が定義されており、通常はカーネルの中心である。
  • カーネル \(B\) を画像上で走査しながら、\(B\) が重なるピクセルのうち最大の値を計算し、アンカー点の位置にある画像のピクセルをその最大値で置き換える。推測できるとおり、この最大化演算によって画像内の明るい領域が「成長」する(このため膨張 (dilation)という名前になっている)。
  • 膨張演算は次のとおりである。\(\texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\)
  • 上の画像を例にとる。膨張を適用すると、次のような結果が得られる。
  • 文字の明るい領域が、背景の黒い領域の周りで膨張する。

収縮

  • この演算は膨張と対をなすものである。与えられたカーネルの領域にわたって局所的な最小値を計算する。
  • カーネル \(B\) を画像上で走査しながら、\(B\) が重なるピクセルのうち最小の値を計算し、アンカー点の下にある画像のピクセルをその最小値で置き換える。
  • 収縮演算は次のとおりである。\(\texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\)
  • 膨張の例と同様に、元の画像(上に示したもの)に収縮演算子を適用できる。下の結果を見るとわかるように、画像の明るい領域は細くなり、暗い領域は大きくなる。

コード

解説

覚え書き
さらに、複数回の収縮/膨張(反復)を一度に実行したり、境界タイプと値を設定したりできる引数も用意されている。ただし、この簡単なチュートリアルでは使用していない。詳細はリファレンスを参照してほしい。

結果

上記のコードをコンパイルして、画像を引数に実行する(Pythonを使用している場合はスクリプトを実行する)。画像を引数として指定しない場合、デフォルトのサンプル画像(LinuxLogo.jpg)が使用される。

例えば、この画像を使用すると:

以下の結果が得られる。トラックバーのインデックスを変化させると、当然ながら異なる出力画像が得られる。ぜひ試してみてほしい!反復回数を制御する3つ目のトラックバーを追加してみることもできる。

(プログラミング言語によっては、出力が少し異なったり、ウィンドウが1つだけになったりすることがある)