2016-04-08 22 views
3

私は二つの輪郭を持つ画像を持っています。一つの輪郭は常に他の輪郭の内側にあります。私は2つの等高線の間の距離を90の異なる角度(4度毎の距離)で求めたい。それをどうやってやるの?ここで異なる角度で、2つの同心円の輪郭の間の距離を見つける方法は?

は例の画像です:

enter image description here

ありがとうございました!

+0

見栄えのパッケージを見て、この答えを持っています:http://stackoverflow.com/questions/36314240/how-to-draw-a-line-from-the-centroid- 36412705#36412705 – tfv

+0

両方の等高線の境界の座標を整然と仮定していませんか?私はしないので。私は実際にこれを尋ねる前にその答えに言及しました。私は基本的に、ある輪郭の周囲から別の輪郭の周囲までの距離を、異なる角度に対して測定したいと考えています。 –

+0

)1.内側の輪郭を取り、重心を計算します。 2.)各角度に対して、線を作成します。 3.)各行について、他の例に示すように両方の輪郭との交差点を計算します。私は何かを見逃しましたか? – tfv

答えて

1

次のコードでは、私はちょうど垂直線の例を与えて、残りは線を回転させることによって得ることができます。結果はこのようになりますが、描画する代わりに距離計算に座標を使用することができます。

enter image description here

import shapely.geometry as shapgeo 
import numpy as np 
import cv2 


img = cv2.imread('image.jpg', 0) 
ret, img =cv2.threshold(img, 128, 255, cv2.THRESH_BINARY) 

#Fit the ellipses 
_, contours0, hierarchy = cv2.findContours(img.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
outer_ellipse = [cv2.approxPolyDP(contours0[0], 0.1, True)] 
inner_ellipse = [cv2.approxPolyDP(contours0[2], 0.1, True)] 

h, w = img.shape[:2] 
vis = np.zeros((h, w, 3), np.uint8) 
cv2.drawContours(vis, outer_ellipse, -1, (255,0,0), 1) 
cv2.drawContours(vis, inner_ellipse, -1, (0,0,255), 1) 

##Extract contour of ellipses 
cnt_outer = np.vstack(outer_ellipse).squeeze() 
cnt_inner = np.vstack(inner_ellipse).squeeze() 

#Determine centroid 
M = cv2.moments(cnt_inner) 
cx = int(M['m10']/M['m00']) 
cy = int(M['m01']/M['m00']) 
print cx, cy 

#Draw full segment lines 
cv2.line(vis,(cx,0),(cx,w),(150,0,0),1) 

# Calculate intersections using Shapely 
# http://toblerity.org/shapely/manual.html 
PolygonEllipse_outer= shapgeo.asLineString(cnt_outer) 
PolygonEllipse_inner= shapgeo.asLineString(cnt_inner) 
PolygonVerticalLine=shapgeo.LineString([(cx,0),(cx,w)]) 


insecouter= np.array(PolygonEllipse_outer.intersection(PolygonVerticalLine)).astype(np.int) 
insecinner= np.array(PolygonEllipse_inner.intersection(PolygonVerticalLine)).astype(np.int) 
cv2.line(vis,(insecouter[0,0], insecinner[1,1]),(insecouter[1,0], insecouter[1,1]),(0,255,0),2) 
cv2.line(vis,(insecouter[0,0], insecinner[0,1]),(insecouter[1,0], insecouter[0,1]),(0,255,0),2) 

cv2.imshow('contours', vis) 

0xFF & cv2.waitKey() 
cv2.destroyAllWindows() 
関連する問題