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

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

新規登録して質問してみよう
ただいま回答率
85.37%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3671閲覧

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

gonzoshira

総合スコア21

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/01/21 02:05

編集2019/01/28 09:49

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

python

1 2#!/usr/bin/env python 3#coding: utf-8 4 5import csv,os,cv2,math,re 6import numpy as np 7import matplotlib.pyplot as plt 8from matplotlib import pyplot 9from operator import itemgetter 10from dolfin import * 11from mshr import * 12from pylab import show,triplot 13 14#読み込み,グレー設定 15img = cv2.imread('/home/ubuntu/0116maps/map.pgm') 16img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 17 18#smoothing 19img_preprocessed = cv2.GaussianBlur(img_gray, (5, 5), 50) 20img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 21img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 22img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 23img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 24img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 25img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 26img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 27img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 28img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 29img_preprocessed = cv2.GaussianBlur(img_preprocessed, (5, 5), 50) 30 31#閾値処理,輪郭検索 32_, white_binary = cv2.threshold(img_preprocessed, 220, 254, cv2.THRESH_BINARY) 33white_contours, _ = cv2.findContours(white_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 34 35#imageのコピー 36white_and_contours = np.copy(img) 37 38#最大輪郭値取得 39min_white_area = 60 40large_contours = [ cnt for cnt in white_contours if cv2.contourArea(cnt) > min_white_area ] 41 42#外形の座標取得,最大値最小値取得 43large_contours = np.array(large_contours) 44large_contours_min = large_contours.min(axis = 1) 45large_contours_max = large_contours.max(axis = 1) 46 47#csv削除,書き込み 48os.remove("/home/ubuntu/map_data/pixel_output.csv") 49with open("/home/ubuntu/map_data/pixel_output.csv", 'a') as f: 50 writer = csv.writer(f) 51 writer.writerows(large_contours) 52 53#pixel値の[]削除、,付け 54os.remove("/home/ubuntu/map_data/pixel_surround.csv") 55with open("/home/ubuntu/map_data/pixel_output.csv", 'rb') as f: 56 reader = csv.reader(f) 57 for row in reader: 58 i = ' '.join(row) 59 i = i.replace(' ',',') 60 i = i.replace('],[','') 61 i = i.replace('[','') 62 i = i.replace(']','\n') 63 f = open("/home/ubuntu/map_data/pixel_surround.csv", 'a') 64 f.write(i) 65 f.close() 66 67os.remove("/home/ubuntu/map_data/minmaxoutput.csv") 68with open("/home/ubuntu/map_data/minmaxoutput.csv", 'a') as f: 69 writer = csv.writer(f) 70 writer.writerows(large_contours_min) 71 writer.writerows(large_contours_max) 72 73os.remove("/home/ubuntu/map_data/minmax_coordinate.csv") 74with open("/home/ubuntu/map_data/minmaxoutput.csv", 'rb') as f: 75 reader = csv.reader(f) 76 for row in reader: 77 i = ' '.join(row) 78 i = i.replace('[','') 79 i = i.replace(']',',') 80 i = i.replace(' ',',') 81 f = open("/home/ubuntu/map_data/minmax_coordinate.csv", 'a') 82 f.write(i) 83 f.close() 84 85#map値読み取りやすく変換 86os.remove("/home/ubuntu/map_data/map_value.csv") 87with open("/home/ubuntu/0116maps/map.yaml", 'rb') as f: 88 reader = csv.reader(f) 89 for words in reader: 90 i = ' '.join(words) 91 match = re.search(r': ', i) 92 if match: 93 i = i[match.end():] 94 i = i.strip('[]') 95 i = i.replace(' ',',') 96 f = open("/home/ubuntu/map_data/map_value.csv", 'a') 97 f.write(i + ",") 98 f.close() 99 100#格子分割準備 101with open("/home/ubuntu/map_data/pixel_surround.csv", 'rb') as f: 102 reader = csv.reader(f) 103 count = 0 104 for pixel in reader: 105 count+=1 106 107j = count-1 108k = 0 109poin = range(j) 110domain_vertices = [] 111 112with open("/home/ubuntu/map_data/pixel_surround.csv", 'rb') as f: 113 reader = csv.reader(f) 114 for pix in reader: 115 if k<j: 116 poin[k] = [Point(int(pix[0]),int(pix[1]))] 117 k+=1 118 119for m in reversed(range(j)): 120 domain_vertices += poin[m] 121 122#格子分割 123domain = Polygon(domain_vertices) 124mesh = generate_mesh(domain,0.1) 125coords = mesh.coordinates() 126 127os.remove("/home/ubuntu/map_data/coords.csv") 128with open("/home/ubuntu/map_data/coords.csv", 'a') as f: 129 writer = csv.writer(f) 130 writer.writerows(coords) 131i 132#メッシュ領域plot 133triplot(coords[:,0], coords[:,1], triangles=mesh.cells()) 134plt.imshow(white_and_contours) 135plt.show()

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/01/21 04:16 編集

ソースコードも載せていただけますか? コードがないと、どう変えればいいのか回答できないです。
gonzoshira

2019/01/21 05:01

すいません.添付しました!
tiitoi

2019/01/21 05:16

mshr は使ったことがないので、自分は回答できないです。すいません。
gonzoshira

2019/01/21 05:44

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

2019/01/21 10:48

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

回答1

0

ベストアンサー

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

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

Python

1import numpy as np 2import matplotlib.pyplot as plt 3import triangle as tr 4 5#box = tr.get_data('box') # サンプルデータ、穴の開いた四角形の読込 6 7# 独自に与えるデータ。最低限以下があればよいようだ。 8box = {'vertices': np.array([ 9 [0.5, 0.5], [0., 3.],[3. , 0. ],[3. , 3. ], 10 [1. , 1. ],[1. , 2. ],[2. , 1. ],[2. , 2. ]]), 11 'segments': np.array([[0, 1],[4, 6],[6, 7],[7, 5],[5, 4]]), 12 'holes': np.array([[1.5, 1.5]]) 13} 14 15print(box) 16 17# 分割結果は主に'triangles'に格納されるようだ 18t = tr.triangulate(box, 'pc') 19#t = tr.triangulate(box, 'pcqa0.1') # より細かく 20print(t) 21 22tr.compare(plt, box, t) # 比較描画 23plt.savefig('ret.png')

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

投稿2019/01/21 08:52

編集2019/01/21 09:10
can110

総合スコア38339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gonzoshira

2019/01/21 10:48

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問