LoginSignup
2
3

More than 3 years have passed since last update.

pythonで画像の縁取りする その1

Last updated at Posted at 2019-11-09

やりたい事ときっかけ

  • 機械学習のデータセットづくりに輪郭を取る機会が多いけれどそれをなるべく自動化したい。
  • 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や各ライブラリの操作方法
  • 極座標の数学

テスト用の画像

test.png

とりあえず画像処理を噛ませればRGB画像でもできそうだと思ったのでまずはバイナリ画像で。
中が抜けていたりして複雑な図形の縁を取るのに挑戦。

コード

Github Jupyter Notebook

基本的な方針

  1. 境界を取りたい物体の内部に点を打つ
  2. その点から外に向かって線を引き、その線上のどこで色が変わるかを調べる。
  3. その線を360度回転させることで境界を得る。

簡単な画像ではこんな感じ

↓検出対象
test01.png
検出結果
test01検出結果01.png
だいたい取れてる。

ただし、点の位置によっては線の影になってこんな感じになる。
test01検出結果02.png

冒頭のあの画像が結構難しい課題である、ということは理解してもらいたいところ。

テスト用画像の検出結果

test検出結果01.png
test検出結果02.png
test検出結果03.png
test検出結果04.png
test検出結果05.png

点が一つではどこにとっても影が出来て、見えないところができる。

点が複数あれば影の問題は軽減されるはず。

test検出結果06.png

やりすぎたw

まとめ

外側の縁取りはだいたい取れてる。
それでも内部の領域で取れてないところがあって、要改善。でもこれくらいあればペジエ曲線で縁取りするのは難しくないと思う。

今回はランダムに点を打ったので無駄打ちが多すぎたけれど、適切に点を動かして最小の点の数で縁を取りきるのも面白そう。強化学習とか使ってできないかな。次回以降の課題とします。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3