前のチュートリアル: 画像の平滑化
次のチュートリアル: さらなるモルフォロジー変換
| 原著者 | Ana Huamán |
| 互換性 | OpenCV >= 3.0 |
このチュートリアルでは、以下の方法を学ぶ:
このチュートリアルのコードを以下に示す。こちらからダウンロードすることもできる。
このチュートリアルのコードを以下に示す。こちらからダウンロードすることもできる。
このチュートリアルのコードを以下に示す。こちらからダウンロードすることもできる。
ここで示す内容のほとんどは自明である(疑問があれば、前のセクションのチュートリアルを参照してほしい)。C++プログラムの全体構造を確認しよう。
スライダーを動かすたびに、ユーザーの関数 Erosion または Dilation が呼び出され、現在のトラックバーの値に基づいて出力画像を更新する。
これら2つの関数を分析しよう。
収縮演算を実行する関数は cv::erode である。見てのとおり、3つの引数を受け取る。
element: 演算の実行に使うカーネルである。指定しない場合、デフォルトは単純な 3x3 行列となる。指定する場合は形状を指定できる。そのためには、関数 cv::getStructuringElement を使う必要がある。
カーネルには次の3つの形状のいずれかを選べる。
あとは、カーネルのサイズとアンカー点を指定するだけである。指定しない場合は、中心にあると仮定される。
以上である。これで画像の収縮を実行する準備が整った。
コードを以下に示す。見てのとおり、収縮のコードスニペットとまったく同様である。ここでも、カーネル、そのアンカー点、および使用する演算子のサイズを定義するオプションがある。
ここで示す内容のほとんどは自明である(疑問があれば、前のセクションのチュートリアルを参照してほしい)。ただし、Javaクラスの全体構造を確認しよう。Javaクラスには4つの主要な部分がある。
addComponentsToPane メソッド。ウィンドウの内容を埋めるupdate メソッド。ユーザーがいずれかの値を変更したときに何が起こるかを決定するmain メソッド。プログラムのエントリポイントであるこのチュートリアルでは addComponentsToPane と update メソッドに焦点を当てる。ただし、参考までに、コンストラクタで行う手順は次のとおりである。
addComponentsToPane でさまざまな制御コンポーネントを追加するコンポーネントは次のメソッドによって追加された。
簡単に言えば、次のことを行う
追加したアクションリスナーおよび状態変化リスナーは、最後に update メソッドを呼び出し、現在のスライダー値に基づいて画像を更新する。したがって、いずれかのスライダーを動かすたびに update メソッドが起動される。
画像を更新するために、次の実装を使用した:
言い換えると、次のことを行う
doErosion に基づいて 収縮 または 膨張 関数を実行するerode および dilate メソッドを分析してみよう:
収縮演算を実行する関数は cv::erode である。見てのとおり、3つの引数を受け取る。
element: これは操作を実行するために使用するカーネルである。形状を指定するには、関数 cv::getStructuringElement を使用する必要がある:
カーネルには次の3つの形状のいずれかを選べる。
形状とともに、カーネルのサイズと アンカーポイント を指定する。アンカーポイントが指定されない場合、中心にあると見なされる。
以上である。これで画像の収縮を実行する準備が整った。
コードを以下に示す。見てのとおり、収縮のコードスニペットとまったく同様である。ここでも、カーネル、そのアンカー点、および使用する演算子のサイズを定義するオプションがある。
ここで示す内容のほとんどは些細なものである(疑問がある場合は、前のセクションのチュートリアルを参照してほしい)。Pythonスクリプトの全体構造を確認してみよう:
いずれかのスライダーを動かすたびに、ユーザーの関数 収縮 または 膨張 が呼び出され、現在のトラックバー値に基づいて出力画像が更新される。
これら2つの関数を分析しよう。
収縮 操作を実行する関数は cv::erode である。見てのとおり、2つの引数を受け取り、処理した画像を返す:
element: 操作を実行するために使用するカーネル。関数 cv::getStructuringElement を使用してその形状を指定できる:
カーネルには次の3つの形状のいずれかを選べる。
あとは、カーネルのサイズと アンカーポイント を指定するだけである。アンカーポイントが指定されない場合、中心にあると見なされる。
以上である。これで画像の収縮を実行する準備が整った。
コードを以下に示す。見てのとおり、収縮のコードスニペットとまったく同様である。ここでも、カーネル、そのアンカー点、および使用する演算子のサイズを定義するオプションがある。
上記のコードをコンパイルして、画像を引数に実行する(Pythonを使用している場合はスクリプトを実行する)。画像を引数として指定しない場合、デフォルトのサンプル画像(LinuxLogo.jpg)が使用される。
例えば、この画像を使用すると:
以下の結果が得られる。トラックバーのインデックスを変化させると、当然ながら異なる出力画像が得られる。ぜひ試してみてほしい!反復回数を制御する3つ目のトラックバーを追加してみることもできる。
(プログラミング言語によっては、出力が少し異なったり、ウィンドウが1つだけになったりすることがある)
