皆様の助けもあり画像から複数輪郭抽出を行うまでになりました.白の領域においてドロネー分割をおこないたいのですが,
どなたか解決できる方いらっしゃいましたら.よろしくお願いします.
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()
ソースコードも載せていただけますか?
コードがないと、どう変えればいいのか回答できないです。
すいません.添付しました!
mshr は使ったことがないので、自分は回答できないです。すいません。
私もこのソースコードを頂いたばかりでして...
質問なのですが,mshrとdolfinとはなんあのでしょうか?
有限要素法の領域分割に使うライブラリのようです。
使ったことがないので、私も詳しいことはわかりません。
https://people.sc.fsu.edu/~jburkardt/py_src/dolfin/dolfin.html
その頂いたコードを作成した人に聞くのがいいかもしれません。
いろいろご指導いただきありがとうござます
回答1件
あなたの回答
tips
プレビュー