Mesafe Dönüşümü için En Hızlı Algoritma


21

Mesafe dönüşümü için mümkün olan en hızlı algoritmayı arıyorum.

Bu siteye göre http://homepages.inf.ed.ac.uk/rbf/HIPR2/distance.htm :

Uzaklık dönüşümü sadece iki geçişte akıllı algoritmalar kullanılarak çok daha verimli bir şekilde hesaplanabilir (örn. Rosenfeld ve Pfaltz 1968).

Etrafta dolaşırken buldum: "Rosenfeld, A ve Pfaltz, J L. 1968. Dijital Resimlerdeki Mesafe Fonksiyonları. Örüntü Tanıma, 1, 33-61."

Ama 1968’de olduğundan daha hızlı ve daha iyi bir algoritmaya sahip olmamız gerektiğine inanıyorum. Aslında, 1968'deki kaynağı bulamadım, bu nedenle herhangi bir yardımın takdir edilmesi gerekiyor.


Bu konuyu tekrar açtığım için üzgünüm ama GDT'yi de uygulamaya çalışıyorum ama Python kullanıyorum. defol_column (dataInput): output = sıfır (dataInput.shape) n = len (dataInput) k = 0 v = sıfır ((n,)) z = sıfır ((n + 1,)) v [0] = 0 z [0] = -inf z [1] = + inf (=, n) aralığında q = 0: iken True: s = ((((dataInput [q] + q * q) - (dataInput [v [k] ]] + v [k] * v [k])) / (2.0 * q - 2.0 * v [k])) eğer s <= z [k]: k - = 1 başkası: k + = 1 v [ k] = qz [k] = sz [k + 1] = + inf k = 0 (n) aralığında q için: z [k + 1] <q: k + = 1 çıkış [q] = ((q - T [k]) * (q - T [k]) + DataINput [T [k]]) dönüş çıkış Ancak zaman offeri
mkli90

Lütfen yeni bir soru sorun. Soruları cevap olarak göndermeyin.
MBaz

Signal Processing SE'ye Hoşgeldiniz. Sağ üst köşedeki "Soru Sor" u kullanarak bir soru sorabilirsiniz.
jojek

Yanıtlar:


14

Pedro F. Felzenszwalb ve Daniel P. Huttenlocher mesafe dönüşümü için uygulamalarını yayınladı . Hacimsel görüntüler için kullanamazsınız, ancak belki de 3d verileri desteklemek için genişletebilirsiniz. Sadece bir kara kutu olarak kullandım.


Bunun OpenCV'de uygulanıp uygulanmadığını biliyor musunuz?
Matt M.

Evet, belli değerleri için maskSizeve distanceType. Bakınız: opencv.willowgarage.com/documentation/cpp/…
bjoernz

bugüne kadar hacimsel görüntüler (örneğin kinect derinlik görüntüsü) için herhangi bir uygulama var mı?
zhangxaochen

9

Bu makale, modern tam mesafe dönüşümlerinin tümünü tartışmaktadır:

"2D Öklid uzaklık dönüşümleri: karşılaştırmalı bir anket", ACM Hesaplama Anketleri, Cilt 40, Sayı 1, Şub 2008 http://www.lems.brown.edu/~rfabbri/stuff/fabbri-EDT-survey-ACMCSurvFeb2008.pdf

Bu makale Meijster, vd. ark. en hızlı genel amaç olarak, tam dönüşüm. Bu teknik burada ayrıntılı olarak verilmiştir:

"Doğrusal Zaman İçinde Mesafe Dönüşümlerini Hesaplamak İçin Genel Bir Algoritma", A. Meijster, JBTM Roerdink ve WH Hesselink. http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf

Meijster algoritması açık kaynaklı efektler kütüphanemde kullanılıyor: https://github.com/vinniefalco/LayerEffects

Umarım bu birine yardımcı olur.


Kütüphanenizde belirli bir kodu nerede bulabileceğimizi bilmek faydalı olacaktır.
akaltar

6

Felzenszwald & Huttenlocher'ın kağıdına göre 1D kare öklid mesafe dönüşümü için bir C # kodu :

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]]);
    }
}

Bu, ikili ve gri tonlamalı görüntüler için önce resim sütunlarına ve sonra satırlara (veya tam tersi) uygulanarak kolayca kullanılabilir.

Dönüşüm gerçekten çok hızlı.

İşte kaynak ve çıktı görüntüleri:

görüntü tanımını buraya girin

görüntü tanımını buraya girin

Siyah pikseller 0 değerine sahiptir ve beyazlar büyük bir değere sahiptir (görüntülerdeki mümkün olan en büyük kare mesafeden daha büyük olmalıdır ancak sonsuz değildir), böylece dönüşüm siyah piksellere olan mesafeyi döndürür ve beyaz olanlar dışlanır.

Gerçek öklid mesafe dönüşümü elde etmek için, çıktı görüntüsünden her pikselin bir karekökü alın.


İlginç. Mesafe dönüşümünün ortak kullanımı nedir Libor?
Spacey

1
Bence yaygın kullanım yolları, segmentasyonu, geometrik ölçümleri (kütle merkezi) ve etkileri (eğim efekti) bulmaktır. Panoramik görüntü dikişi için mesafe dönüştürmeye ihtiyacım vardı - geometrik olarak en uygun karışım maskesini bulmak için. Bu, her görüntü üzerinde koşma mesafesi dönüşümü ve ardından ağırlık karıştırma maskelemesinin hesaplanmasını içerir.
Libor,

1
Uzaklık dönüşümü, [kenar] görüntülerin eşleştirilmesinde kullanılabilir, bir teknik " oluk eşleştirme" dir ( umiacs.umd.edu/~mingyliu/papers/liu_cvpr2010.pdf ). DT ayrıca medial ekseni (iskelet) bulmak ve belirtilen Libor gibi diğer görevleri yapmak için de kullanılabilir.
12:43
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.