2012-06-17 12 views
6

私は少し問題があるなど、私は画像の輪郭を取るとき、私はこの数字を取得します輪郭を抽出することができますが、パスを抽出するとすぐに、曲線上に2つの不連続な領域があるため、画像を横切るこれらの奇妙な割線が残されます。それはそこに不連続ラインを切断する方法があるかである場合、私は疑問に思う私のパスコード抽出は はどのように私はmatplotlab、scipyのダウンロードに不連続曲線を接続して行う、または

import matplotlib.pyplot as plt 
import numpy as np 

def contourPath(img, width, height): 
    x   = np.arange(0,width) 
    y   = np.arange(height,0,-1) 
    X, Y  = np.meshgrid(x,y) 
    plot  = plt.contour(X,Y,img, [0]) 
    pathList = plot.collections[0].get_paths() 
    x, y  = [], [] 
    for i in range(0, len(pathList)): 
     iterPath = pathList[i].iter_segments() 
     for point in iterPath: 
      pt = np.rint(point[0]) 
      x.append(pt[0]) 
      y.append(pt[1]) 
    X   = np.hstack(x) 
    Y   = np.hstack(y) 
    return np.dstack((X,Y))[0] 

間違ってここに私が推測するuser545424 のためにお時間を

、ありがとうございました。 Matplotlib輪郭関数は、この小さな事象を引き起こす原因となった画像上に2つの不連続な点があるため、適切に機能しています。私はそれらの割線がscypiによって原因であることを学ぶが、それはライブラリが輪郭点

と対話する方法についての別の問題を提起まあ、私はパスを見つけることによって、問題を隠蔽することが可能であると考えていると

それを補間する。しかし、私は旅行のsalemansの問題は私のコンピュータ上でいいではないので、私はパスをrefindingを避けるために好きです。

ご意見はありますか?

enter image description here

+0

を持っている場合、私は疑問に思う

あなたが画像を投稿することができますか? – user545424

+1

あなたの編集から、それでも問題があるかどうかはわかりません。そして、これは網膜ですか? – heltonbiker

+0

私は知っていますが、パスをリファインすることは、パスオブジェクトの目的を破ります。まあ、私は思った通りに投稿したかもしれない。極座標に変換すると、ユーザーはargsort()を使ってインデックスを取得し、画像を補間する方が簡単です。 – user1462442

答えて

3

私は自分の質問に答えるのですね。それらの不思議な分断は、リストの終わりを覆い隠すことによって引き起こされる。デフォルトの動作、私はscipyが位置に関係なく2つの順次ポイントを接続すると信じています。頂点は、この画像の輪郭を厳密にとっており、曲線を取り囲んでいたため、正しく機能しています。上段の半円の中央に割線が接続されている理由。それは最後のパスが終了する場所です。

私は極座標に変換すると推測しますが、パスはシンプルですが正確には最適ではありませんが、まあまあです。他の誰かがよりよい解決策

def cart2polar(x,y, origin=None, size=np.array([200,200])): 
     ny, nx= size[0], size[1] 
     print size.shape 
     if origin is None: 
      origin_x, origin_y = nx//2, ny//2 
     else: 
      origin_x, origin_y = origin[0], origin[1] 
     x -= origin_x 
     y -= origin_y 
     r = np.sqrt(x**2 + y**2) 
     theta = np.arctan2(y, x) 
     return r, theta 

    def main(): 
     index = np.argsort(theta) 
     r, theta = r[index[:]], theta[index[:]] 
     f = interpolate.interp1d(theta,r) 
     theta = np.linspace(round(theta.min()+.00005,),theta.max(), 200) 
     r = f(theta) 
     x,y = polar2cart(r, theta) 

    def polar2cart(r, theta, origin=None, size=np.array([200,200])): 
     ny, nx= size[0], size[1] 
     if origin is None: 
      origin_x, origin_y = nx//2, ny//2 
     else: 
      origin_x, origin_y = origin[0], origin[1] 
     x += origin_x 
     y += origin_y 

     return x, y 
関連する問題