6

少し問題があります。画像の輪郭を取得すると、次の図が表示されます。

ご覧のとおり、輪郭を抽出できますが、パスを抽出するとすぐに、曲線上に 2 つの不連続な領域があるため、画像を横切るこれらの奇妙な割線が残ります。不連続な行を切断する方法があるのだろうか、それともコードを抽出するパスが間違っているのでしょうか

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 の場合 ここで推測します。この小さなイベントが発生する原因となった画像に 2 つの不連続なスポットがあるため、Matplotlib の輪郭関数は適切に機能しています。

これらの割線は scypi が原因であることがわかりましたが、ライブラリが輪郭点とどのように相互作用するかについて別の問題が発生します

まあ、パスを見つけて補間することで問題を隠すことができると思います。しかし、巡回セールスマンの問題は私のコンピューターではうまくいかないので、パスを再検索することは避けたいと思っています。

何か提案はありますか?

ここに画像の説明を入力

4

1 に答える 1

3

私は自分の質問に答えていると思います。これらの奇妙な割線は、リストの両端を scipy 接続することによって発生します。デフォルトの動作は、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
于 2012-06-23T20:29:42.440 に答える