やりたい事ときっかけ
- 機械学習のデータセットづくりに輪郭を取る機会が多いけれどそれをなるべく自動化したい。
- openCV, numpy, matplotlib の学習
-
ミリオタ成分強めの主が魚雷の誘導法(ウェーキホーミング)を知ったので、それを使ってみたかった。色々いじっていくうちにウェーキホーミング関係なくなっちゃった。
まぁ、そんなこんなで色々やってみたことを備忘録を兼ねてまとめてみます。
環境
- ubuntu 18.04 LTS
- Anaconda 1.7.2
- python 3.7.3
- openCV 3.4.2
- numpy 1.16.2
- matplotlib 3.03
- Jupyter Notebook
前提となる知識
- pythonや各ライブラリの操作方法
- 極座標の数学
テスト用の画像
とりあえず画像処理を噛ませればRGB画像でもできそうだと思ったのでまずはバイナリ画像で。
中が抜けていたりして複雑な図形の縁を取るのに挑戦。
コード
基本的な方針
- 境界を取りたい物体の内部に点を打つ
- その点から外に向かって線を引き、その線上のどこで色が変わるかを調べる。
- その線を360度回転させることで境界を得る。
簡単な画像ではこんな感じ
冒頭のあの画像が結構難しい課題である、ということは理解してもらいたいところ。
テスト用画像の検出結果
点が一つではどこにとっても影が出来て、見えないところができる。
点が複数あれば影の問題は軽減されるはず。
やりすぎたw
まとめ
外側の縁取りはだいたい取れてる。
それでも内部の領域で取れてないところがあって、要改善。でもこれくらいあればペジエ曲線で縁取りするのは難しくないと思う。
今回はランダムに点を打ったので無駄打ちが多すぎたけれど、適切に点を動かして最小の点の数で縁を取りきるのも面白そう。強化学習とか使ってできないかな。次回以降の課題とします。