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

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

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

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

Python

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

解決済

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

gonzoshira
gonzoshira

総合スコア0

OpenCV

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

Python

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

1回答

0評価

1クリップ

15閲覧

投稿2019/01/21 02:05

編集2022/01/12 10:58

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

python

#!/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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

tiitoi
tiitoi

2019/01/21 04:16 編集

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

2019/01/21 05:01

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

2019/01/21 05:16

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

2019/01/21 05:44

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

2019/01/21 06:07

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

2019/01/21 10:48

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenCV

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

Python

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