อัลกอริทึมที่เร็วที่สุดสำหรับการแปลงระยะทาง


21

ฉันกำลังมองหาอัลกอริทึมที่เร็วที่สุดสำหรับการแปลงระยะทาง

ตามเว็บไซต์นี้http://homepages.inf.ed.ac.uk/rbf/HIPR2/distance.htmเว็บไซต์นี้อธิบาย:

การแปลงระยะทางสามารถคำนวณได้อย่างมีประสิทธิภาพมากขึ้นโดยใช้อัลกอรึทึมที่ชาญฉลาดเพียงแค่สองรอบเท่านั้น (เช่น Rosenfeld และ Pfaltz 1968)

ฉันพบรอบ ๆ : "Rosenfeld, A และ Pfaltz, J L. 1968. ฟังก์ชั่นระยะทางกับภาพดิจิตอลการจดจำรูปแบบ, 1, 33-61"

แต่ฉันเชื่อว่าเราควรมีอัลกอริธึมที่ดีกว่าและเร็วกว่าในปี 1968 หรือไม่? ในความเป็นจริงฉันไม่สามารถหาแหล่งที่มาจากปี 1968 ดังนั้นความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก


ขออภัยที่ทำให้เธรดนี้กลับมาทำงานอีกครั้ง แต่ฉันกำลังพยายามใช้ GDT ด้วยเช่นกัน แต่ใช้ Python def of_column (dataInput): output = ศูนย์ (dataInput.shape) n = len (dataInput) k = 0 v = ศูนย์ ((n,)) z = ศูนย์ ((n + 1,)) v [0] = 0 z [0] = -inf z [1] = + inf s = 0 สำหรับ q ในช่วง (1, n): ขณะที่ True: s = (((dataInput [q] + q * q)) - (dataInput [v [k ]] + v [k] * v [k])) / (2.0 * q - 2.0 * v [k]))) ถ้า s <= z [k]: k - = 1 อื่น: break k + = 1 v [ k] = qz [k] = sz [k + 1] = + inf k = 0 สำหรับ q ในช่วง (n): ขณะที่ z [k + 1] <q: k + = 1 เอาต์พุต [q] = ((q - v [k]) * (q - v [k]) + dataInput [v [k]]) ส่งคืนผลตอบแทนอย่างไรก็ตามเมื่อ offeri
mkli90

กรุณาถามคำถามใหม่ อย่าโพสต์คำถามเป็นคำตอบ
MBaz

ยินดีต้อนรับสู่การประมวลผลสัญญาณ SE คุณสามารถถามคำถามโดยใช้ "ถามคำถาม" ที่มุมขวาบน
jojek

คำตอบ:


14

เปโดรเอฟ Felzenszwalb และแดเนียลพี Huttenlocher มีการเผยแพร่การดำเนินงานของพวกเขาสำหรับระยะเปลี่ยน คุณไม่สามารถใช้มันสำหรับภาพที่มีปริมาตร แต่บางทีคุณสามารถขยายเพื่อรองรับข้อมูล 3d ได้ ฉันใช้มันเป็นกล่องดำเท่านั้น


คุณทราบหรือไม่ว่ามีการใช้งานใน OpenCV หรือไม่
แมตต์เอ็ม

ใช่ค่าบางและmaskSize distanceTypeดู: opencv.willowgarage.com/documentation/cpp/…
bjoernz

มีการใช้งานสำหรับภาพที่มีปริมาตร (เช่นภาพความลึก kinect) จนถึงปัจจุบันหรือไม่?
zhangxaochen

9

บทความนี้กล่าวถึงการแปลงระยะทางที่แน่นอนที่ทันสมัยทั้งหมด:

"การแปลงระยะทางแบบยุคลิดแบบ 2D: แบบสำรวจเปรียบเทียบ", แบบสำรวจการคำนวณด้วยคอมพิวเตอร์ ACM, เล่มที่ 40, ฉบับที่ 1, กุมภาพันธ์ 2008 http://www.lems.brown.edu/~rfabbri/stuff/fabbri-EDT-survey-ACMCSurvFeb2008.pdf

กระดาษอ้างอิงเทคนิคจาก Meijster และ อัล เป็นวัตถุประสงค์ทั่วไปที่เร็วที่สุด เทคนิคนี้มีรายละเอียดที่นี่:

"อัลกอริทึมทั่วไปสำหรับการแปลงระยะทางคอมพิวเตอร์ในเวลาเชิงเส้น", A. Meijster, JBTM Roerdink และ WH Hesselink http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf

อัลกอริทึม Meijster ใช้ในไลบรารีเอฟเฟ็กต์โอเพนซอร์สของฉัน: https://github.com/vinniefalco/LayerEffects

ฉันหวังว่านี่จะช่วยให้ใครบางคน


มันจะมีประโยชน์ที่จะทราบว่าในห้องสมุดของคุณเราสามารถหารหัสเฉพาะ
akaltar

6

นี่คือรหัส C # สำหรับ 1D ยืดระยะทางยุคลิดเปลี่ยนไปตามกระดาษ Felzenszwald & Huttenlocher ของ :

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

สามารถใช้สิ่งนี้ได้อย่างง่ายดายสำหรับภาพไบนารีและโทนสีเทาโดยนำไปใช้ก่อนในคอลัมน์ภาพแล้วแถว (หรือในทางกลับกันแน่นอน)

การแปลงร่างเร็วมากจริงๆ

นี่คือภาพต้นฉบับและภาพออก:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

พิกเซลสีดำมีค่า 0 และสีขาวมีค่าขนาดใหญ่บางส่วน (จะต้องมีขนาดใหญ่กว่าระยะทางยกกำลังสองที่ใหญ่ที่สุดเท่าที่จะเป็นไปได้ในภาพ แต่ไม่ใช่อินฟินิตี้) เพื่อให้การแปลงเปลี่ยน

เพื่อให้ได้การแปลงระยะทางแบบยุคลิดอย่างแท้จริงเพียงนำสแควร์รูทของแต่ละพิกเซลออกจากภาพที่ส่งออก


น่าสนใจ Libor ใช้การแปลงระยะทางกันอย่างไร?
Spacey

1
ฉันคิดว่าการใช้งานทั่วไปอยู่ในการค้นหาเส้นทางการแบ่งส่วนการวัดเชิงเรขาคณิต (ศูนย์กลางของมวล) และเอฟเฟกต์ ฉันต้องการการแปลงระยะทางสำหรับการเย็บภาพพาโนรามา - เพื่อหามาสก์ผสมที่เหมาะสมในเชิงเรขาคณิต สิ่งนี้เกี่ยวข้องกับการแปลงระยะทางในแต่ละภาพแล้วคำนวณมาสก์ผสมจากน้ำหนัก
Libor

1
การแปลงระยะทางสามารถนำมาใช้ในการจับคู่ภาพ [ขอบ] เทคนิคหนึ่งคือ "จับคู่มุมลบคม " ( umiacs.umd.edu/~mingyliu/papers/liu_cvpr2010.pdf ) DT สามารถใช้ในการค้นหาแกนกลาง (โครงกระดูก) และเพื่อทำงานอื่น ๆ เช่น Libor ที่กล่าวถึง
Rethunk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.