Thuật toán nhanh nhất để chuyển đổi khoảng cách


21

Tôi đang tìm kiếm thuật toán có sẵn nhanh nhất để chuyển đổi khoảng cách.

Theo trang web này http://homepages.inf.ed.ac.uk/rbf/HIPR2/distance.htmlm , nó mô tả:

Biến đổi khoảng cách có thể được tính toán hiệu quả hơn nhiều bằng cách sử dụng các thuật toán thông minh chỉ trong hai lần vượt qua (ví dụ Rosenfeld và Pfaltz 1968).

Tìm kiếm xung quanh, tôi tìm thấy: "Rosenfeld, A và Pfaltz, J L. 1968. Các hàm khoảng cách trên ảnh kỹ thuật số. Nhận dạng mẫu, 1, 33-61."

Nhưng tôi tin rằng chúng ta nên có một thuật toán tốt hơn và nhanh hơn so với thuật toán năm 1968? Trên thực tế, tôi không thể tìm thấy nguồn từ năm 1968, vì vậy bất kỳ trợ giúp nào đều được đánh giá cao.


Xin lỗi vì đã lấy lại chủ đề này, nhưng tôi cũng đang cố gắng thực hiện GDT, nhưng sử dụng Python. def of_column (dataInput): output = zeros (dataInput.shape) n = len (dataInput) k = 0 v = zeros ((n,)) z = zeros ((n + 1,)) v [0] = 0 z [0] = -inf z [1] = + inf s = 0 cho q trong phạm vi (1, n): while True: s = (((dataInput [q] + q * q) - (dataInput [v [k ]] + v [k] * v [k])) / (2.0 * q - 2.0 * v [k])) nếu s <= z [k]: k - = 1 khác: break k + = 1 v [ k] = qz [k] = sz [k + 1] = + inf k = 0 cho q trong phạm vi (n): while z [k + 1] <q: k + = 1 đầu ra [q] = ((q - v [k]) * (q - v [k]) + dataInput [v [k]]) đầu ra trở lại Tuy nhiên khi
Offeri

Hãy hỏi một câu hỏi mới. Đừng đăng câu hỏi dưới dạng câu trả lời.
MBaz

Chào mừng bạn đến với Xử lý tín hiệu SE. Bạn có thể đặt câu hỏi bằng cách sử dụng "Đặt câu hỏi" ở góc trên bên phải.
jojek

Câu trả lời:


14

Pedro F. Felzenzwalb và Daniel P. Huttenlocher đã công bố việc thực hiện của họ cho việc biến đổi khoảng cách . Bạn không thể sử dụng nó cho hình ảnh thể tích, nhưng có lẽ bạn có thể mở rộng nó để hỗ trợ dữ liệu 3d. Tôi chỉ sử dụng nó như một hộp đen.


Bạn có tình cờ biết nếu điều này được thực hiện trong OpenCV không?
Matt M.

Có, đối với các giá trị nhất định của maskSizedistanceType. Xem: opencv.wvelgarage.com/documentation/cpp/ từ
bjoernz

Có bất kỳ triển khai nào cho hình ảnh thể tích (ví dụ, hình ảnh chiều sâu kinect) cho đến bây giờ?
zhangxaochen

9

Bài viết này thảo luận về tất cả các biến đổi khoảng cách chính xác hiện đại:

"Biến đổi khoảng cách 2D Euclide: một khảo sát so sánh", Khảo sát tính toán ACM, Tập 40, Số 1, Tháng 2 năm 2008 http://www.lems.brown.edu/~rfabbri/

Bài viết trích dẫn kỹ thuật từ Meijster, et. al. như mục đích chung nhanh nhất, biến đổi chính xác. Kỹ thuật này được trình bày chi tiết tại đây:

"Một thuật toán chung để tính toán biến đổi khoảng cách theo thời gian tuyến tính", A. Meijster, JBTM Roerdink và WH Hesselink. http://fab.cba.mit.edu/groupes/S62.12/docs/Meijster_distance.pdf

Thuật toán Meijster được sử dụng trong thư viện hiệu ứng nguồn mở của tôi: https://github.com/vinniefalco/LayerEffects

Tôi hi vọng điêu nay se giup được ai đo.


Sẽ rất hữu ích khi biết nơi nào trong thư viện của bạn, chúng tôi có thể tìm thấy mã cụ thể.
akaltar

6

Dưới đây là mã C # cho phép biến đổi khoảng cách euclide bình phương 1D theo bài báo của Felundredzwald & Huttenlocher's :

private static void DistanceTransform(double[] dataInput, ref double[] dataOutput)
{
    int n = dataInput.Length;

    int k = 0;
    int[] v = new int[n];
    double[] z = new double[n + 1];

    v[0] = 0;
    z[0] = Double.NegativeInfinity;
    z[1] = Double.PositiveInfinity;

    double s;

    for (int q = 1; q < n; q++)
    {
        while (true)
        {
            s = (((dataInput[q] + q * q) - (dataInput[v[k]] + v[k] * v[k])) / (2.0 * q - 2.0 * v[k]));

            if (s <= z[k])
            {
                k--;
            }
            else
            {
                break;
            }
        }

        k++;

        v[k] = q;
        z[k] = s;
        z[k + 1] = Double.PositiveInfinity;
    }

    k = 0;

    for (int q = 0; q < n; q++)
    {
        while (z[k + 1] < q)
        {
            k++;
        }

        dataOutput[q] = ((q - v[k]) * (q - v[k]) + dataInput[v[k]]);
    }
}

Điều này có thể dễ dàng được sử dụng cho hình ảnh nhị phân và thang độ xám bằng cách áp dụng nó đầu tiên trên các cột hình ảnh và sau đó là hàng (hoặc ngược lại, tất nhiên).

Việc chuyển đổi thực sự rất nhanh.

Dưới đây là hình ảnh nguồn và đầu ra:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Các pixel đen có giá trị 0 và màu trắng có một số giá trị lớn (phải lớn hơn khoảng cách bình phương lớn nhất có thể có trong ảnh nhưng không phải là vô cực) để biến đổi trả về khoảng cách từ các pixel đen và các pixel trắng được sử dụng.

Để có được biến đổi khoảng cách euclide thực sự, chỉ cần lấy căn bậc hai của mỗi pixel từ hình ảnh đầu ra.


Hấp dẫn. Sử dụng phổ biến của biến đổi khoảng cách, Libor là gì?
Spacey

1
Tôi nghĩ rằng việc sử dụng phổ biến là trong việc tìm đường dẫn, phân đoạn, đo lường hình học (trung tâm khối lượng) và hiệu ứng (hiệu ứng vát). Tôi cần biến đổi khoảng cách để ghép ảnh toàn cảnh - để tìm mặt nạ trộn tối ưu hình học. Điều này liên quan đến biến đổi khoảng cách chạy trên mỗi hình ảnh, và sau đó tính toán mặt nạ trộn từ các trọng số.
Libor

1
Biến đổi khoảng cách có thể được sử dụng trong các hình ảnh [cạnh] phù hợp, một kỹ thuật là "khớp vát" ( umiacs.umd.edu/~mingyliu/ con / liu_cvpr2010.pdf ). DT cũng có thể được sử dụng để tìm trục trung gian (khung xương) và để thực hiện các nhiệm vụ khác như Libor đã đề cập.
Xem lại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.