2012-03-29 31 views
5

Tôi muốn chuyển đổi trong mảng 2d Python/hình ảnh thành cực, xử lý rồi, và sau đó chuyển đổi chúng trở lại Descartes. Sau đây là kết quả từ ImajeJ Polar Transformer plugin (sử dụng trên các vòng tròn đồng tâm của mã mẫu):fast Descartes to Polar to Cartesian trong Python

enter image description here

Số lượng và làm mờ của hình ảnh là khá lớn vì vậy tôi đã kiểm tra xem OpenCV có nhanh và cách đơn giản để làm điều này.

Tôi đã đọc về cv. CartToPolarPolarToCart nhưng tôi không sử dụng được. Tôi hiểu rõ hơn về số LogPolar trong đó đầu vào và đầu ra là các mảng và nơi bạn có thể đặt trung tâm, nội suy và nghịch đảo (ví dụ: CV_WARP_INVERSE_MAP). Có cách nào để sử dụng CartToPolar/PolarToCart theo cách tương tự?

import numpy as np 
    import cv 

    #sample 2D array that featues concentric circles 
    circlesArr = np.ndarray((512,512),dtype=np.float32) 
    for i in range(10,600,10): cv.Circle(circlesArr,(256,256),i-10,np.random.randint(60,500),thickness=4) 

    #logpolar 
    lp = np.ndarray((512,512),dtype=np.float32) 
    cv.LogPolar(circlesArr,lp,(256,256),100,cv.CV_WARP_FILL_OUTLIERS) 

    #logpolar Inverse 
    lpinv = np.ndarray((512,512),dtype=np.float32) 
    cv.LogPolar(lp,lpinv,(256,256),100, cv.CV_WARP_INVERSE_MAP + cv.CV_WARP_FILL_OUTLIERS) 

    #display images 
    from scipy.misc import toimage 
    toimage(lp, mode="L").show() 
    toimage(lpinv, mode="L").show() 

Đây là quy trình làm việc chụp cắt lớp (CT) nơi các đồ tạo tác có thể lọc ra dễ dàng hơn nếu chúng xuất hiện dưới dạng dòng.

Trả lời

2

mã nguồn CV đề cập đến LinearPolar. nó dường như không được ghi lại, nhưng có vẻ tương tự như LogPolar. bạn đã thử nó chưa

+0

Cảm ơn bạn rất nhiều! Thật vậy 'LinearPolar' làm những gì nó nói. Thật không may bằng cách sử dụng 'import cv', nó không có sẵn, nhưng tôi đã thử' from opencv import cv' và sau đó là 'cv.cvLinearPolar' và hoạt động. Ngày tiếp theo tôi sẽ thử hiệu suất của nó trong các tập dữ liệu lớn. Cảm ơn bạn! – Papado

+0

tuyệt. tôi tự hỏi tại sao nó không nhìn thấy được? Tôi sẽ thử nộp báo cáo lỗi. –

+0

http://code.opencv.org/issues/1729 –

2

Dưới đây là một ví dụ về bản ghi cực biến đổi thực hiện sử dụng scipy:

https://github.com/stefanv/supreme/blob/master/supreme/transform/transform.py#L51

Cho rằng đây chỉ là một sự chuyển đổi phối hợp, nó phải là dễ dàng hơn để thích ứng với vấn đề của bạn so với phiên bản OpenCV.

+0

Thưa Stefan, cảm ơn rất nhiều vì phản hồi của bạn. Tôi sẽ kiểm tra và đánh giá triển khai của bạn vào những ngày tiếp theo. Btw, tôi đã kết thúc trình duyệt Supreme và có vẻ rất thú vị. Bạn đã xuất bản bất kỳ bài viết về nó? – Papado

+0

@Papado Tôi chưa bao giờ thấy bình luận của bạn, nhưng có - có một bài báo về arXiv và một luận án. Bằng cách này, biến đổi cực log có thể được thực hiện trên đỉnh của scikit-image trong khoảng 5 dòng mã, sử dụng '' skimage.transform.warp''. –

3

Phiên bản mới nhất của opencv hỗ trợ chức năng cv2.linearPolar. Đây có thể là giải pháp khác không liên quan đến việc sử dụng opencv:

def polar2cart(r, theta, center): 

    x = r * np.cos(theta) + center[0] 
    y = r * np.sin(theta) + center[1] 
    return x, y 

def img2polar(img, center, final_radius, initial_radius = None, phase_width = 3000): 

    if initial_radius is None: 
     initial_radius = 0 

    theta , R = np.meshgrid(np.linspace(0, 2*np.pi, phase_width), 
          np.arange(initial_radius, final_radius)) 

    Xcart, Ycart = polar2cart(R, theta, center) 

    Xcart = Xcart.astype(int) 
    Ycart = Ycart.astype(int) 

    if img.ndim ==3: 
     polar_img = img[Ycart,Xcart,:] 
     polar_img = np.reshape(polar_img,(final_radius-initial_radius,phase_width,3)) 
    else: 
     polar_img = img[Ycart,Xcart] 
     polar_img = np.reshape(polar_img,(final_radius-initial_radius,phase_width)) 

    return polar_img 
+0

Hi Alessandro- Tôi đã cố gắng để giải quyết vấn đề này theo cách này quá, và tôi đã viết mã tương tự, mặc dù tôi đã sử dụng một vòng lặp thay vì meshgrid (tôi chưa bao giờ thấy rằng trước đó); bạn có biết điều này hoạt động tốt như thế nào không? Tôi đã thực hiện theo thứ tự 1s cho một hình ảnh VGA - quá dài. – cjm2671

+0

OK, tôi đã thử nghiệm mã của bạn và nó rất nhanh so với giải pháp lặp đi lặp lại của tôi - cộng với tôi đã học được điều gì đó mới mẻ- cảm ơn bạn rất nhiều! – cjm2671