स्केल और रोटेशन अपरिवर्तनीय टेम्पलेट मिलान


12

मैं पैमाने और रोटेशन के लिए एक विधि की तलाश कर रहा हूं, जो कि अपरिवर्तनीय टेम्पलेट मिलान है। मैंने पहले से ही कुछ करने की कोशिश की, लेकिन उन्होंने मेरे उदाहरणों के लिए इतना अच्छा काम नहीं किया या निष्पादित करने के लिए हमेशा के लिए ले लिया। SIFT और SURF फ़ीचर डिटेक्शन पूरी तरह से विफल रहे। मैंने एक लॉग-पोलर टेम्परिंग मिलान फ़ंक्शन को लागू करने का भी प्रयास किया, लेकिन मैं कभी भी समाप्त नहीं हुआ (ठीक से कैसे पता नहीं)।

इन लेखों में (पहला जर्मन में है)

http://cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/Wentker-Vortrag.pdf

http://www.jprr.org/index.php/jprr/article/viewFile/355/148

मैंने उस तरीके के बारे में पढ़ा। ध्रुवीय निर्देशांक के मानचित्रण ने काम किया, लेकिन मुझे नहीं पता कि यह सही है या नहीं। चित्र इस तरह दिखते हैं।

source_log_polar.png http://www.shareimages.com/images/pics/0/0/3/62394-pZSfl5WenZysnpyVnKg-source_log_polar.png

template_log_polar.png

और OpenCV के टेम्पलेट मिलान समारोह के साथ इन 2 छवियों के मिलान के बाद मुझे वह परिणाम मिला

match_log_polar.png

अब मैं नहीं जानता कि कैसे जाना है।

मेरे खाके हमेशा ब्लूप्रिंट और ब्लूप्रिंट के निर्माण में सरल प्रतीक होते हैं। प्रतीक आकार और अभिविन्यास में भिन्न हो सकते हैं।

उदाहरण के लिए मेरा साधारण खाका:

यहाँ छवि विवरण दर्ज करें

और मेरा खाका

यहाँ छवि विवरण दर्ज करें

इस उदाहरण में केवल एक टेम्पलेट है, लेकिन ब्लूप्रिंट में यह सभी घटनाओं, यहां तक ​​कि आकार और / या झुकाव वाले लोगों को ढूंढना चाहिए।

क्या किसी के पास एक दृष्टिकोण है कि मैं इसे कैसे हल कर सकता हूं?

संपादित करें:

एंड्री के दृष्टिकोण के अलावा। रेडियल प्रोफाइल के लिए दूरी कैप्चरिंग एल्गोरिथ्म। (EmguCV का उपयोग करके)

private float[] getRadialProfile( Image<Gray, byte> image, Point center, int resolution )
 {

 var roi = image.ROI;

 if ( !roi.Contains( center ) )
  {
   return null;
  }

 var steps = resolution;
 var degreeSteps = 360 / (double)resolution;
 var data = image.Data;
 var peak = 0.0f;
 var bottom = double.MaxValue;
 var bottomIndex = 0;
 var width = roi.Width;
 var height = roi.Height;
 var minX = roi.X;
 var minY = roi.Y;

 float[] distances = new float[resolution];
 for ( var i = 0; i < steps; i++ )
  {
   var degree = i * degreeSteps;
   var radial = degree * Math.PI / 180.0;
   var dy = Math.Sin( radial );
   var dx = Math.Cos( radial );

   var x = (double)center.X;
   var y = (double)center.Y;

   while ( true )
    {
    x += dx;
    y += dy;
    if ( x >= minX + width || y >= minY + height || x <= minX || y <= minY )
     {
      x = -1;
      y = -1;
      break;
     }
    var pixel = data[(int)y, (int)x, 0];
    if ( pixel == 0 )
     {
      break;
     }
    }

    float distance = 0.0f;
    if ( x != -1 && y != -1 )
    {
      distance = (float)Math.Sqrt( Math.Pow( (center.X - x), 2 ) + Math.Pow( (center.Y - y), 2 ) );
    }

    distances[i] = distance;
    if ( distance > peak )
    {
      peak = distance;
    }
    if ( distance < bottom )
    {
      bottom = distance;
      bottomIndex = i;
    }
   }

    // Scale invariance. Divide by peak
   for ( var i = 0; i < distances.Length; i++ )
   {
     distances[i] /= peak;
   }

    // rotation invariance, shift to lowest value
   for ( var i = 0; i < bottomIndex; i++ )
   {
     distances.ShiftLeft(); // Just rotates the array nothing special
   }

   return distances;
}

dsp.SE में आपका स्वागत है। हम आपकी मदद करने की कोशिश करेंगे, लेकिन अधिक सटीक जानकारी प्रदान करना अच्छा होगा। SIFT और SURF से आपका क्या मतलब है "पूरी तरह से विफल"? उन्होंने क्या पता लगाया / मिलान किया? इसके अलावा, मैं व्यक्तिगत रूप से लॉग-पोलर टेम्परिंग मिलान के बारे में नहीं जानता, लेकिन, अगर आपने कोशिश की, तो वास्तव में समस्या कहां थी?
पेनेलोप

SIFT और SURF फ़ीचर डिटेक्ट्स को टेम्पलेट इमेज में कोई फीचर नहीं मिला। ऐसा लगता है कि टेम्प्लेट में बहुत कम जानकारी है (बस उस छोटी सी धनुष और एक पंक्ति)। लॉग-पोलर मिलान के लिए मुझे एक पेपर मिला, जहां इसका वर्णन किया गया है, लेकिन इसके पीछे सटीक गणित नहीं है। मैं इसे खोज कर जोड़ दूंगा।
अरंड ब्रैस्टस्टीन

ये हम चले: cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/... (जर्मन अनुच्छेद) और यह एक jprr.org/index.php/jprr/article/viewFile/355/148
आन्ट Bieberstein

अरे, यहाँ बहुत से लोग जर्मन नहीं समझ सकते हैं, मुझे लगता है: डी लेकिन, बाकी सब चीजों के लिए: आप टिप्पणी के बजाय सही जगह पर किसी भी नई जानकारी को जोड़ने के लिए खुद की पोस्ट को संपादित कर सकते हैं। और, इसके अलावा, आपने अभी भी यह नहीं कहा कि आपको वास्तव में क्या समस्या थी।
पेनेलोप

3
"जर्मन लेख" के लेखक का अंग्रेजी में लेख है - www-cs.engr.ccny.cuny.edu/~wolberg/pub/icip00.pdf (Google से
साभार

जवाबों:


6

मुझे लगता है कि आप बहुत आसान तरीके से समस्या का समाधान कर सकते हैं। यह देखते हुए कि आप ब्लूप्रिंट के साथ काम कर रहे हैं, आपको बढ़त कनेक्टिविटी, शोर, और कई अन्य चीजों के बारे में चिंता नहीं करनी चाहिए जिन्हें SIFT और SURF ने समायोजित करने के लिए बनाया था। आपका टेम्पलेट विशिष्ट किनारे के आकार के साथ एक खोखला आकार है।

इस प्रकार, मेरी सिफारिश है:

  • परिधि के चारों ओर चलो और टेम्पलेट के केंद्र के चारों ओर किनारों की दूरी का प्रोफ़ाइल ढूंढें। यह टेम्प्लेट की रेडियल प्रोफाइल है। सबसे बड़ी दूरी से विभाजित करें, बड़े पैमाने पर अपरिवर्तनीय बनें। सदिश को घुमाएं ताकि सबसे छोटी दूरी पहले हो, रोटेशन इंवरिएंट हो। (यदि आपके टेम्पलेट में कोई प्रभावी दूरी नहीं है, तो आप चरण 2 को बाद में बदल सकते हैं)

यहाँ छवि विवरण दर्ज करें

  • छवि में बूँदें खोजें। भाग (1) में वर्णित रेडियल प्रोफाइल की गणना करें, और सामान्यीकृत सहसंबंध द्वारा दो वैक्टर की तुलना करें। यदि आपके टेम्पलेट में कोई प्रमुख दूरी नहीं है, तो सहसंबंध सामान्यीकृत क्रॉस-सहसंबंध, और अधिकतम का चयन) हो जाता है। कुछ सीमा से गुजरने वालों को मैच माना जाता है।

यहाँ आपके साथ शुरू करने के लिए कुछ माटलब कोड है - मैंने वह हिस्सा लिखा है जो एक विशिष्ट बूँद के लिए दूरी प्रोफ़ाइल पाता है और इसे टेम्पलेट के आधार पर गणना करता है:

function Doors
    im = imread('http://i.stack.imgur.com/Tf8EV.png');
    im = im(:,:,1);
    template = imread('http://i.stack.imgur.com/PlP4i.png');
    template = template(:,:,1);

    blobs = regionprops(template>0,'Area','Image');
    largestBlob = GetLargestBlob(blobs);
    [prof,edgeImage] = GetBlobRadialProfile(largestBlob);

    figure;
    subplot(1,2,1);plot(prof); title('Radial profile')
    subplot(1,2,2);imshow(edgeImage); title('Template');

end

function [prof,edgeImage] = GetBlobRadialProfile(blob)
    paddedImage = padarray( blob.Image,[8 8]);
    erodedImage = imerode(paddedImage,strel('disk',1));
    edgeImage = xor(erodedImage,paddedImage);

    c = regionprops(paddedImage,'Centroid');
    cx  = c.Centroid(1);
    cy  = c.Centroid(2);

    [y,x] = find(edgeImage);
    rad = (x(:)-cx).^2 + (y(:)-cy).^2;
    [~,minIndex] = min(rad);
    contour = bwtraceboundary(edgeImage, [y(minIndex), x(minIndex)],'N');
    prof = (contour(:,2)-cx).^2 + (contour(:,1)-cy).^2;
    prof = prof./max(prof);
end

function largestBlob = GetLargestBlob(blobs)    
    area = [blobs.Area];
    [~,index] = max(area);
    largestBlob = blobs(index);
end

मुझे लगता है कि यह गैर-बंद आकृतियों के साथ काम नहीं कर रहा है? या मैं सिर्फ इन "छेद" को आकार में छोड़ देता हूं।
अरंडट बॅंस्टीन डे

@AndndBieberstein, हां यह केवल बंद आकृतियों के लिए काम करता है। मुझे लगता है कि इसे बढ़ाने के लिए कुछ तरीका होना चाहिए।
एंड्रे रुबेश्टिन

चूंकि OpenCV में bwtraceboundary फ़ंक्शन शामिल नहीं है, इसलिए मैंने अपना स्वयं का लिखा और छेदों को "स्किप" किया और शून्य से भरा। यहाँ एक छोटा सा उदाहरण है कि अब परिणाम कैसे दिखते हैं। प्रत्येक टेम्पलेट के लिए 5 भूखंड। लाल बिंदु के शुरुआती बिंदु हैं। सैंपल प्लॉट
Arndt Bieberstein

@ArndtBieberstein, बहुत अच्छा! हो सकता है एक बार काम पूरा होने के बाद आप हमारे साथ परिणाम साझा कर सकें।
एंड्रे रुबेश्टिन

ज़रूर, यह कोड अच्छा या अच्छा नहीं है, लेकिन यह काम करता है। मैं इसे अपने प्रश्न के नीचे संलग्न करूँगा। यह C # में लिखा है (मैं EmguCV का उपयोग कर रहा हूँ)
Arndt Bieberstein

3

आईआईटी मद्रास के प्रोफेसर अनुराग मित्तल की एक बात के आधार पर, मैं जो कुछ भी जानता हूं उसका मूल विचार यहां किया जा सकता है।

विचार आकार आधारित वस्तु का पता लगाने का है, लेकिन स्पष्ट रूप से कहीं और भी बढ़ाया जा सकता है।

  1. बर्कले एज डिटेक्टर का उपयोग कर edgels की गणना करें।
  2. कनेक्टेड किनारों को प्राप्त किया। "ग्लोबल ऑब्जेक्ट बाउंड्री डिटेक्शन"।
  3. आकार मिलान Chamfer दूरी या Houstoff दूरी का उपयोग कर।

उसी पर उनका पेपर उपलब्ध है: बहु-मंच कंटूर आधारित ख़राब वस्तुओं का पता लगाना।

दूसरी ओर, मुझे लगता है कि SIFT को कोने की पहचान करने वाले एल्गोरिदम के रूप में काम करना चाहिए जो आपके पास वहां मौजूद टेम्पलेट फीचर पर काम करेगा।

नोट: SIFT पूरी तरह से घूमने वाला नहीं है। यह घूर्णन> 60 डिग्री या इतने पर सामना करने में सक्षम नहीं है। इसलिए कई टेम्पलेट बनाना एक अच्छा विचार है।

लॉग-पोलर आधारित फूरियर-मेलिन ट्रांसफॉर्म्स पर: वे परिवर्तनों के लिए नमूना लेने के तरीके के कारण जानकारी के नुकसान का कारण बनते हैं।


यह विधि वास्तव में आशाजनक लगता है! मैं आपका लिंक नहीं खोल सकता, लेकिन मैंने आपका दृष्टिकोण देखा। मुझे नहीं पता था कि सिफ्ट कि सिफ्ट पूरी तरह से हाथी दांत घूमती नहीं है! बहुत अच्छा जवाब! +1
एरंड ब्रैस्टस्टीन

1
मुझे शायद ही चम्फर डिस्टेंस के बारे में कुछ भी पता चला है और यह कैसे काम करता है, उन लोगों के लिए जो इस लिंक को खोज रहे हैं ।
अरंडट बीबरस्टीन

@ नरेश सिफ्ट प्लेन से बाहर बड़े घुमाव के लिए रोटेशन-इनवेरिएंट नहीं है। एक ही विमान में नहीं।
ए-जैस

1

मैंने इसे बहुत सोचा नहीं है, लेकिन मुझे पूरा यकीन है कि क्लासिक फूरियर डिस्क्रिप्टर्स (एफडी) का उपयोग किए बिना एक मजबूत समाधान बहुत परेशानी के बिना हो सकता है। मुझे लगता है कि आपकी समस्या उसके लिए एक बहुत अच्छा उम्मीदवार हो सकता है। ऐसा मत सोचो कि आपको एज डिटेक्शन बी / सी करने की आवश्यकता है, आपके पास काली रेखा चित्र हैं। जब तक आप किसी भी पिक्सेल को हिट न करें, तब तक रिस्टर स्कैनिंग शुरू करें, फिर निम्नलिखित करें:

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

इसके बारे में सोचें जैसे कि एक डेटाबेस से एफडी की छवि या संगीत पुनर्प्राप्ति का उपयोग करना। उस पर बहुत सारे सफेद कागज।

यह अनुमानित आकार के लिए एफडी का उपयोग करने पर एक अच्छा ट्यूटोरियल है: मुझे संदेह है कि आपको इसकी आवश्यकता होगी, लेकिन आप रोटेशन से निपटने के लिए अपनी छवियों को पहले एक ध्रुवीय समन्वय रूपरेखा में बदल सकते हैं, जैसे कि इस पेपर में प्रस्तावित: आकृति-आधारित छवि पुनर्प्राप्ति का उपयोग करना सामान्य फूरियर विवरणक

देखें कि वे एफडी ऐप्पल परिधि का पता लगाने के लिए कैसे पैरामीटर बनाते हैं? अपने दरवाजे की तरह ही विचार।

BTW, मुझे पूरा यकीन है कि ध्रुवीय निर्देशांक के लिए पूरे योजनाबद्ध को मैप करने से घूर्णी आक्रमण में मदद नहीं मिलेगी- आपको प्रत्येक दरवाजे के केंद्रक के बारे में ऐसा करने की आवश्यकता होगी, जो कि आपकी समस्या के साथ शुरू करना है। यही कारण है कि मुझे लगता है कि आप सिर्फ दरवाजे के उम्मीदवारों को पकड़ना चाहते हैं, और शायद उन लोगों को ध्रुवीय निर्देशांक के साथ मैप करें जो एफडी दरवाजा टेम्पलेट के साथ मेल खाते हैं, जैसे कि ऊपर लिंक किए गए उस पेपर में।

यदि आप इस दृष्टिकोण को आजमाते हैं तो मुझे बताएं।


0

शायद आपको यह मैटलैब कोड मिल जाएगा जिसे मैंने लिखा था: फ्रैक्टल मोज़ाइक

यह एक कलात्मक अनुप्रयोग में "रोबस्ट इमेज पंजीकरण" लॉग-पोलर ट्रांसफॉर्म का उपयोग करके "( पीडीएफ ) को लागू करता है, जो मुझे मिले पारंपरिक तरीकों की तुलना में अधिक मजबूती की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.