डिस्टेंस ट्रांस्फ़ॉर्म के लिए सबसे तेज़ एल्गोरिथम


21

मैं दूरी परिवर्तन के लिए सबसे तेज़ उपलब्ध एल्गोरिथम की तलाश कर रहा हूं।

इस साइट के अनुसार http://homepages.inf.ed.ac.uk/rbf/HIPR2/distance.htm , यह वर्णन करता है:

केवल दो पास (जैसे रोसेनफेल्ड और Pfaltz 1968) में चतुर एल्गोरिदम का उपयोग करके दूरी के रूपांतरण की अधिक कुशलता से गणना की जा सकती है।

आसपास खोज करने पर, मैंने पाया: "रोसेनफेल्ड, ए और पफाल्ट्ज़, जे एल 1968। डिजिटल पिक्चर्स पर दूरी कार्यात्मक। पैटर्न मान्यता, 1, 33-61।"

लेकिन मेरा मानना ​​है कि हमारे पास 1968 में पहले से बेहतर और तेज एल्गोरिथम होना चाहिए? वास्तव में, मुझे 1968 से स्रोत नहीं मिला, इसलिए किसी भी मदद की बहुत सराहना की जाती है।


इस थ्रेड को फिर से प्राप्त करने के लिए क्षमा करें, लेकिन मैं जीडीटी को लागू करने की कोशिश कर रहा हूं, लेकिन पायथन का उपयोग कर रहा हूं। def_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 [१] = + inf s = ० के लिए q रेंज में (१, n): जबकि True: s = (((dataInput [q] + q * q) - (dataInput [v [k] ]] + v [k] * v [k]) / / (२.० * q - २.० * v [k])) अगर s <= z [k]: k - = १ और: ब्रेक k + = १ 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]]) हालांकि आउटपुट
लौटाता है

कृपया एक नया प्रश्न पूछें। उत्तर के रूप में प्रश्न पोस्ट न करें।
एमबज

सिग्नल प्रोसेसिंग एसई में आपका स्वागत है। आप शीर्ष दाएं कोने में "प्रश्न पूछें" का उपयोग करके एक प्रश्न पूछ सकते हैं।
jojek

जवाबों:


14

दूरी परिवर्तन के लिए पेड्रो एफ। फेलेंज़ज़्वल्ब और डैनियल पी। हटनलोचर ने उनके कार्यान्वयन को प्रकाशित किया है । आप इसका उपयोग वॉल्यूमेट्रिक छवियों के लिए नहीं कर सकते, लेकिन शायद आप इसे 3D डेटा का समर्थन करने के लिए बढ़ा सकते हैं। मैंने इसे केवल ब्लैक बॉक्स के रूप में इस्तेमाल किया है।


क्या आपको पता है कि क्या यह OpenCV में लागू किया गया है?
मैट एम।

हाँ, निश्चित मूल्यों के लिए maskSizeऔर distanceType। देखें: opencv.willowgarage.com/documentation/cpp/…
bjoernz

क्या अब तक वॉल्यूमेट्रिक इमेज (जैसे, किनेक्ट डेप्थ इमेज) के लिए कोई कार्यान्वयन है?
झंगक्साओचेन

9

यह पत्र सभी आधुनिक सटीक दूरी के परिवर्तनों पर चर्चा करता है:

"2 डी यूक्लिडियन दूरी रूपांतरित करती है: एक तुलनात्मक सर्वेक्षण", एसीएम कम्प्यूटिंग सर्वे, वॉल्यूम 40, अंक 1, फरवरी 2008, http://www.lems.brown.edu/~rfabbri/stuff/fabbriri-EDT-survey-ACMCSurvFeb2008.pdf

पेपर मेइजस्टर, एट से तकनीक का हवाला देता है। अल। सबसे तेज़ सामान्य उद्देश्य के रूप में, सटीक रूपान्तरण। यह तकनीक यहाँ विस्तृत है:

"रैखिक समय में दूरी रूपांतरण को कम करने के लिए एक सामान्य एल्गोरिदम", ए। मीजस्टर, जेबीटीएम रोर्डिंक और डब्ल्यूएच हेसेलिंक। http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf

Meijster एल्गोरिथ्म का उपयोग मेरे खुले स्रोत प्रभाव पुस्तकालय में किया जाता है: https://github.com/vinniefalco/LayerEffects

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।


यह जानना उपयोगी होगा कि आपकी लाइब्रेरी में हम कहाँ विशेष कोड पा सकते हैं।
अकलतरा

6

यहाँ -1 डी के लिए एक सी # कोड चुकता इयूक्लिडियन दूरी के अनुसार बदलना है 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 होता है और सफेद का कुछ बड़ा मूल्य होता है (चित्रों में सबसे बड़ी संभव चौकोर दूरी से बड़ा होता है, लेकिन अनन्तता नहीं) ताकि रूपांतरण काले पिक्सेल से दूरी तय कर ले और सफेद रंग का हो।

सही यूक्लिडियन दूरी परिवर्तन प्राप्त करने के लिए, बस आउटपुट छवि से प्रत्येक पिक्सेल का एक वर्गमूल लें।


दिलचस्प। दूरी परिवर्तन, लिबोर का एक सामान्य उपयोग क्या है?
स्पेसी

1
मुझे लगता है कि आम उपयोग पथ, विभाजन, ज्यामितीय माप (द्रव्यमान का केंद्र) और प्रभाव (बेवल प्रभाव) खोजने में हैं। मुझे पैनोरमिक छवि सिलाई के लिए दूरी परिवर्तन की आवश्यकता थी - एक ज्यामितीय रूप से इष्टतम सम्मिश्रण मुखौटा खोजने के लिए। इसमें प्रत्येक छवि पर रनिंग डिस्टेंस ट्रांसफॉर्मेशन शामिल था, और फिर वेट से ब्लेंडिंग मास्क की गणना की गई।
लिबोर

1
दूरी परिवर्तन का उपयोग मिलान [किनारे] छवियों, एक तकनीक " चम्फर मिलान" ( umiacs.umd.edu/~mingyliu/papers/liu_cvpr2010.pdf ) में किया जा सकता है। डीटी का उपयोग औसत दर्जे की धुरी (कंकाल) को खोजने और अन्य कार्यों जैसे कि लिबोर का उल्लेख करने के लिए भी किया जा सकता है।
रथंक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.