Programming

UnityでOpenCV その4

Programming
スポンサーリンク

さて、なんやかんや2か月以上も過ぎていましたがorz
いよいよ前回の実装に入ります。
OpenCVUnity_findcontour1.png
抽出処理については、基本的にこちらの記事を参考にしました。
OpenCVで輪郭抽出から隣接領域の切り出し(その1)輪郭抽出まで
では、抽出処理の流れに沿って、それぞれの処理を見てみましょう。
なお、ここから先は画像処理に関係する処理を主に抜粋して載せています。
追記に当方の作成した全ソースコードを載せているため、先にそちらをご覧いただいてもかまいません。
【前処理】
まずは、元画像、および画像処理とマスク用のMat型インスタンスをそれぞれ用意しておきます。
画像処理用のMatには、元画像のグレースケールを格納します。

また、二値化処理をかけて輪郭抽出に適した画像(モノクロ画像)にしておきます。
二値化処理はいくつか方法があり、まず手動で調整するとこのようになります。

ただ、閾値は画像の状態によって大きく左右されるため、いちいち手動で値を設定するのは面倒です。
そこで、画像に適した閾値を自動で計算してくれるアルゴリズムを用いた方法もあるため、下で紹介していきます。
まずは大津の手法による二値化処理です。

ただし、先ほどの手法でも画素内の明るさが大きく異なる部分があると、処理の結果が芳しくないことがあります。
そこで、それぞれの場所に応じた閾値を設定できる、適応的閾値処理を使うことも可能です(引数の詳しい説明などは省きます)。

【輪郭抽出】
ここまで、輪郭抽出に必要な二値化画像が手に入った段階です。
いよいよ輪郭の抽出に入っていきます。
まずは全体の流れから見ていきましょう。

実は、上記のスクリプトでは一部、自作のメソッドを用いていたのですが、
各メソッドの実装内容は以下の通りです。

【仕上げ】
ここまで、画像の特定の領域に対する輪郭抽出ができました。
ですが、わずかに残るノイズを処理するため、以下の処理を加えて不要な部分を除去します。

【マスク処理】
あとは抽出できた輪郭を使い、画像の一部分だけを取り出す処理を行ってみましょう。

こうして、輪郭抽出の大まかな流れは終わりです。
以上の処理をもとに輪郭抽出した結果はこちらです。
OpenCVUnity_findcontour2.png
Unityで画像処理をする機会は少ないかもしれませんが、当方の記事が少しでも参考になれば幸いです。
ではまた。

【ソースコード】
本当は本文中に載せたかったのですが、長すぎたのでこちらに移動しました。
なお、ここでは本文中の処理に加え、元画像をトリミングする処理なども実行されています。

コメント

タイトルとURLをコピーしました