質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.33%

python openCVを用いたドロネー分割

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 991

gonzoshira

score 17

皆様の助けもあり画像から複数輪郭抽出を行うまでになりました.白の領域においてドロネー分割をおこないたいのですが,
どなたか解決できる方いらっしゃいましたら.よろしくお願いします.
python2.7,openCV4.0です.

#!/usr/bin/env python
#coding: utf-8

import csv,os,cv2,math,re
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import pyplot
from operator import itemgetter
from dolfin import *
from mshr import *
from pylab import show,triplot

#読み込み,グレー設定
img = cv2.imread('/home/ubuntu/0116maps/map.pgm')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#smoothing
img_preprocessed = cv2.GaussianBlur(img_gray, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)
img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50)

#閾値処理,輪郭検索
_, white_binary = cv2.threshold(img_preprocessed, 220, 254, cv2.THRESH_BINARY)
white_contours, _ = cv2.findContours(white_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

#imageのコピー
white_and_contours = np.copy(img)

#最大輪郭値取得
min_white_area = 60
large_contours = [ cnt for cnt in white_contours if cv2.contourArea(cnt) > min_white_area ]

#外形の座標取得,最大値最小値取得
large_contours = np.array(large_contours)
large_contours_min = large_contours.min(axis = 1)
large_contours_max = large_contours.max(axis = 1)

#csv削除,書き込み
os.remove("/home/ubuntu/map_data/pixel_output.csv")
with open("/home/ubuntu/map_data/pixel_output.csv", 'a') as f:
    writer = csv.writer(f)
    writer.writerows(large_contours)

#pixel値の[]削除、,付け
os.remove("/home/ubuntu/map_data/pixel_surround.csv")
with open("/home/ubuntu/map_data/pixel_output.csv", 'rb') as f:
   reader = csv.reader(f)
   for row in reader:
       i = ' '.join(row)
       i = i.replace(' ',',')
       i = i.replace('],[','')
       i = i.replace('[','')
       i = i.replace(']','\n')
       f = open("/home/ubuntu/map_data/pixel_surround.csv", 'a')
       f.write(i)
       f.close()

os.remove("/home/ubuntu/map_data/minmaxoutput.csv")
with open("/home/ubuntu/map_data/minmaxoutput.csv", 'a') as f:
    writer = csv.writer(f)
    writer.writerows(large_contours_min)
    writer.writerows(large_contours_max)

os.remove("/home/ubuntu/map_data/minmax_coordinate.csv")
with open("/home/ubuntu/map_data/minmaxoutput.csv", 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
      i = ' '.join(row)
      i = i.replace('[','')
      i = i.replace(']',',')
      i = i.replace(' ',',')
      f = open("/home/ubuntu/map_data/minmax_coordinate.csv", 'a')
      f.write(i)
      f.close()

#map値読み取りやすく変換
os.remove("/home/ubuntu/map_data/map_value.csv")
with open("/home/ubuntu/0116maps/map.yaml", 'rb') as f:
  reader = csv.reader(f)
  for words in reader:
     i = ' '.join(words)
     match = re.search(r': ', i)
     if match:
        i = i[match.end():]
    i = i.strip('[]')
    i = i.replace('  ',',')
    f = open("/home/ubuntu/map_data/map_value.csv", 'a')
    f.write(i + ",")
    f.close()

#格子分割準備
with open("/home/ubuntu/map_data/pixel_surround.csv", 'rb') as f:
   reader = csv.reader(f)
   count = 0
   for pixel in reader:
      count+=1

j = count-1
k = 0
poin = range(j)
domain_vertices = []

with open("/home/ubuntu/map_data/pixel_surround.csv", 'rb') as f:
   reader = csv.reader(f)
   for pix in reader:
     if k<j:
        poin[k] = [Point(int(pix[0]),int(pix[1]))]
        k+=1

for m in reversed(range(j)):
        domain_vertices += poin[m]

#格子分割
domain = Polygon(domain_vertices)
mesh = generate_mesh(domain,0.1)
coords = mesh.coordinates()

os.remove("/home/ubuntu/map_data/coords.csv")
with open("/home/ubuntu/map_data/coords.csv", 'a') as f:
    writer = csv.writer(f)
    writer.writerows(coords)
i
#メッシュ領域plot
triplot(coords[:,0], coords[:,1], triangles=mesh.cells())
plt.imshow(white_and_contours)
plt.show()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • gonzoshira

    2019/01/21 14:44

    私もこのソースコードを頂いたばかりでして...
    質問なのですが,mshrとdolfinとはなんあのでしょうか?

    キャンセル

  • tiitoi

    2019/01/21 15:07

    有限要素法の領域分割に使うライブラリのようです。
    使ったことがないので、私も詳しいことはわかりません。
    https://people.sc.fsu.edu/~jburkardt/py_src/dolfin/dolfin.html
    その頂いたコードを作成した人に聞くのがいいかもしれません。

    キャンセル

  • gonzoshira

    2019/01/21 19:48

    いろいろご指導いただきありがとうござます

    キャンセル

回答 1

checkベストアンサー

+3

以下、直接の回答ではありません。参考まで。

Triangleというライブラリを見つけました。
入出力データ形式がちょっとよく分かりませんが、比較的簡単に「」を除外して分割できるようです。
使い方や分割イメージはExamplesdataを見ると何となく分かるかと思います。

import numpy as np
import matplotlib.pyplot as plt
import triangle as tr

#box = tr.get_data('box') # サンプルデータ、穴の開いた四角形の読込

# 独自に与えるデータ。最低限以下があればよいようだ。
box = {'vertices': np.array([
    [0.5, 0.5], [0., 3.],[3. , 0. ],[3. , 3. ],
    [1. , 1. ],[1. , 2. ],[2. , 1. ],[2. , 2. ]]),
 'segments': np.array([[0, 1],[4, 6],[6, 7],[7, 5],[5, 4]]),
 'holes': np.array([[1.5, 1.5]])
}

print(box)

# 分割結果は主に'triangles'に格納されるようだ
t = tr.triangulate(box, 'pc')
#t = tr.triangulate(box, 'pcqa0.1') # より細かく
print(t)

tr.compare(plt, box, t) # 比較描画
plt.savefig('ret.png')


イメージ説明
イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/21 19:48

    貴重な情報ありがとうございます!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る