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

前のチュートリアル: Hit-or-Miss変換
次のチュートリアル: 画像ピラミッド

原著者Theodore Tsesmelis
互換性OpenCV >= 3.0

目的

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

  • 2つの非常に一般的なモルフォロジー演算子(すなわち膨張と収縮)を、カスタムカーネルの作成とともに適用し、水平軸および垂直軸上の直線を抽出する。この目的のために、以下のOpenCV関数を使用する:

    • erode()
    • dilate()
    • getStructuringElement()

    楽譜から音符を抽出することを目標とする例の中で。

理論

モルフォロジー演算

モルフォロジーは、カーネルとしても知られる事前定義された 構造化要素 に基づいて画像を処理する一連の画像処理演算である。出力画像の各ピクセルの値は、入力画像内の対応するピクセルとその近傍との比較に基づいて決まる。カーネルのサイズと形状を選ぶことで、入力画像に対して特定の形状に敏感なモルフォロジー演算を構築できる。

最も基本的なモルフォロジー演算のうちの2つが膨張と収縮である。膨張は画像内のオブジェクトの境界にピクセルを追加し、収縮はちょうどその逆を行う。それぞれ追加または除去されるピクセルの量は、画像を処理するために使用する構造化要素のサイズと形状に依存する。一般に、これら2つの演算が従う規則は以下のとおりである:

  • 膨張: 出力ピクセルの値は、構造化要素のサイズと形状の範囲内に入るすべてのピクセルの 最大 値である。例えば二値画像において、カーネルの範囲内に入る入力画像のピクセルのいずれかが値1に設定されていれば、出力画像の対応するピクセルも同様に1に設定される。後者はあらゆる種類の画像(例: グレースケール、bgr など)に当てはまる。
Dilation on a Binary Image
Dilation on a Grayscale Image
  • 収縮 (Erosion): 膨張とは逆のことが収縮処理にも当てはまる。出力ピクセルの値は、構造要素のサイズと形状の範囲内に入るすべてのピクセルの最小値となる。下の例の図を参照のこと:
Erosion on a Binary Image
Erosion on a Grayscale Image

構造化要素

上で示したとおり、また一般にあらゆるモルフォロジー演算において、入力画像を走査するために使う構造要素は最も重要な部分である。

構造要素とは、0と1のみからなる行列で、任意の形状とサイズを取り得る。通常は処理対象の画像よりはるかに小さく、値が1のピクセルが近傍を定義する。構造要素の中心ピクセルは原点 (origin) と呼ばれ、着目するピクセル、すなわち処理対象のピクセルを示す。

例えば、次の図は7x7サイズのダイヤモンド形の構造要素を示している。

A Diamond-Shaped Structuring Element and its Origin

構造要素は、直線、ダイヤモンド、円板、周期的な線、円など、多くの一般的な形状やサイズを取り得る。通常は、入力画像内で処理・抽出したい対象と同じサイズ・形状の構造要素を選ぶ。例えば、画像内の線を見つけるには、後で示すように線状の構造要素を作成する。

コード

このチュートリアルのコードを以下に示す。

解説 / 結果

画像はこちらから取得する。

画像の読み込み

グレースケール

グレースケールから二値画像へ

出力画像

これで、水平線と垂直線を抽出し、その結果として楽譜から音符を分離するためにモルフォロジー演算を適用する準備が整った。ただしその前に、この目的で使用する出力画像を初期化しておこう:

構造要素

理論の節で述べたとおり、目的の対象を抽出するには、それに対応する構造要素を作成する必要がある。ここでは水平線を抽出したいので、その目的に対応する構造要素は次のような形状になる:

ソースコードでは、これは次のコードスニペットで表される:

垂直線についても同様で、対応する構造要素は次のとおり:

そしてこれも同様に次のように表される:

エッジの精緻化 / 結果

見てのとおり、ほぼ完成である。しかしこの時点で、音符のエッジが少し粗いことに気づくだろう。そのため、より滑らかな結果を得るにはエッジを精緻化する必要がある: