2012-06-17 24 views
6

Tôi có một vấn đề nhỏ, khi tôi lấy đường viền của một hình ảnh, tôi nhận được con số này:Làm thế nào để kết nối các đường cong discontinous trong matplotlab, scipy, hoặc vv

Như bạn có thể xem tôi có thể trích xuất đường bao, nhưng ngay sau khi tôi trích xuất đường dẫn, nó sẽ để lại những bí mật lạ này sẽ vượt qua hình ảnh vì có 2 khu vực không liên tục trên đường cong. Tôi tự hỏi nếu có một cách để ngắt kết nối dòng không liên tục hoặc là nó con đường của tôi giải nén code đang sai

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] 

Cảm ơn bạn đã dành thời gian

cho user545424 Ở đây tôi đoán. Chức năng đường viền Matplotlib hoạt động bình thường vì có hai điểm không liên tục trên hình ảnh khiến cho sự kiện nhỏ này xảy ra.

Tôi biết rằng những dòng cát tuyến là nguyên nhân gây ra bởi scypi, nhưng nó làm tăng một vấn đề khác về cách các thư viện tương tác với các điểm đường viền

Oh tốt, tôi tin rằng nó có thể che dấu vấn đề bằng cách tìm các đường dẫn và nội suy nó. Nhưng, tôi muốn tránh nhắc nhở con đường, vì việc đi du lịch vấn đề về salemans không tốt trên máy tính của tôi.

Bạn có bất cứ đề xuất nào không?

enter image description here

+0

Bạn có thể gửi hình ảnh? – user545424

+1

Từ chỉnh sửa của bạn, nó không rõ ràng nếu bạn vẫn có vấn đề hay không. Và, nhân tiện, đây có phải là võng mạc không? – heltonbiker

+0

Tôi biết, nhưng việc liên kết đường dẫn sẽ đánh bại mục đích của một đối tượng đường dẫn. Ồ, tôi có thể đăng như đã giải quyết, tôi đoán vậy. Chuyển đổi thành cực, người dùng argsort() để lấy chỉ mục và nội suy hình ảnh đơn giản hơn. – user1462442

Trả lời

3

Tôi đoán tôi đang trả lời câu hỏi của riêng mình. Những người bất an kỳ lạ này là nguyên nhân gây ra bởi những kẻ lừa đảo đang tìm kiếm các đầu của danh sách. Hành vi mặc định, tôi tin là scipy sẽ kết nối 2 điểm tuần tự bất kể vị trí. Các đỉnh đang hoạt động tốt, bởi vì nó đã thực hiện đúng đường viền của hình ảnh này và nó đã bao quanh đường cong. Lý do tại sao các secant được kết nối với giữa bán vòng tròn hàng đầu. Đó là vị trí mà con đường cuối cùng kết thúc.

Tôi đoán chuyển đổi thành cực và khúc cua đường dẫn đơn giản nhưng không chính xác về tối ưu, nhưng tốt thôi.

Tôi tự hỏi nếu ai đó có một giải pháp tốt hơn

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 
Các vấn đề liên quan