写真から多角形の検出

この記事はSYSKEN Advent Calendar 2016 1日目の記事です。

今年も始まりました!Advent Calendar~~
ということで, トップバッターを務めさせていただきます, 部長のsejiです。

今回はここで紹介した画像処理について詳しく書きたいと思います。
画像系のTipsです。

まず, 画像といってもいくつか種類があります。

%e8%a1%a8

今回説明するのが画像処理というものになります。
前回の記事を見てもらうとわかりますが, 書いた自分でもわかりずらいなと思います。

やったこととしては写真の画像を数値化って感じです。
具体的には下の写真のような感じです。

Before(写真で取った画像)

before

After(画像処理を行った後)

after

Afterを見てもらうとわかるように, 頂点が出力されています。ちなみに頂点は○で囲ってあります。
上の画像を見ると, 人間にとっては何角形かはぱっと見でわかりますよね!?
左上は四角形, 右下は六角形って感じに。

しかし!
コンピュータには残念ながらそんなことはわかりません。

なぜなら, コンピュータにとっては画像はただの数値でしかないからです。
じゃあ, どうやってやるのか??
それをこれから紹介します。

まず, 手順としては

  1. 元の写真を読み込む
  2. グレースケールにする
  3. しきい値を決めて2値化
  4. 3.のデータから輪郭を検出
  5. 4.のデータを直線で近似

順を追って説明します。
まず, 1. 元の写真を読み込むというのはBeforeの画像を読み込みます。

2. グレースケールにする。

まず, カラー画像をグレーの画像にします。
カラー画像はR(Red), G(Green), B(Blue) からなっています。
それをデータで表すと(0~255, 0~255, 0~255)となります。RGB共に256段階に色分けされます。
(0, 0, 0)は黒, (255, 255, 255)は白, (255, 0, 0)は赤のような表し方をします。
これの色のパターンは255×255×255 ≒ 1658万通りあります。
画像の大きさが100×100だったとすると1658億通りになります。
これはさすがに多すぎます。

次の画像がグレーにした画像です。

gray

元の画像は色彩があまりなかったので, ほとんどかわっていませんがきちんとグレーになっています。
グレーにしたことでパターンは1658万通りから256通りになりました!

3. しきい値を決めて2値化

2値化はグレーを”黒”と”白”に分けることです。
2値化にすることでさらにパターンが256通りから2通りまで減らすことができます。
それでは, 2値化にしてみます。

2%e5%80%a4%e5%8c%96

残念ながらうまく, できていません。なぜこうなったのか, 次の画像を見てください。

%e3%81%97%e3%81%8d%e3%81%84%e5%80%a4%ef%bc%91

上の画像はあくまでイメージとしてとらえてください。
ピースは黒, その他のところは白っぽかったり, 黒っぽかったりしてます。それが上のグラフです。
黒が少ししか取れていないのは, しきい値が適切な場所にないからです。
しきい値というのは黒と白を分ける境界線です。

それではしきい値を変更してみます。

%e3%81%97%e3%81%8d%e3%81%84%e5%80%a4%ef%bc%92

これでプログラムを動かしてみると・・・

2%e5%80%a4%e5%8c%96%ef%bc%92

いい感じになりました!

4. 3.のデータから輪郭を検出

準備が整ったので, まずは輪郭を検出します。

%e8%bc%aa%e9%83%ad

輪郭の点を一つ一つ円で囲っている状態です。数百個の点が密集しているのです。
点が多すぎて, 円が太い線になってしまっています。
ですが, これで輪郭もうまく出せています。

5. 4.のデータを直線で近似

最後にやることは, 輪郭の集合体をまとめてあげることです。
現在は点がたくさんありすぎてどれが頂点やらわかりません。
そこで近似というものを使います。
情報量は落ちてしまうのですが, 今回の場合は全く問題ありません。

%e8%bf%91%e4%bc%bc

上の図のようにたくさんある点を一つの直線と近似してあげます。
そうすると, 点は直線の始点と終点のみになります。
この動作を何度か行うと, きれいに頂点を求めることができるのです。
最後に頂点を出した画像をのせています。

after

これで, 何とか頂点を出すことができました。見てもらってわかる通り, 凹凸にもうまく対応してくれていることがわかります。
なかなか精度のよい感じですね!

以上です。

さて, 明日のAdvent Calendarはkim さんです。

参照
http://gihyo.jp/dev/feature/01/opencv/0001


コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください