बिंदु पैटर्न मान्यता


46

दो अलग-अलग आकार के भीतर बिखरे बिंदुओं (सरलता के लिए 2 डी) के दो अलग-अलग आकार होने से प्रश्न यह है कि:

1- बड़े के माध्यम से छोटे के किसी भी घटना को खोजने के लिए कैसे?
2- निम्नलिखित आंकड़ों पर दिखाए गए अनुसार घटनाओं को कैसे रैंक किया जाए, इस पर कोई विचार?

यहाँ प्रश्न का एक सरल प्रदर्शन और एक वांछित समाधान है: यहाँ छवि विवरण दर्ज करें


अद्यतन 1:
निम्नलिखित आंकड़ा समस्या की थोड़ी अधिक यथार्थवादी दृश्य दिखाता है जिसकी जांच की जा रही है। यहाँ छवि विवरण दर्ज करें

टिप्पणियों के संबंध में निम्नलिखित गुण लागू होते हैं:

  • अंकों का सटीक स्थान उपलब्ध है
  • बिंदुओं के सटीक आकार उपलब्ध हैं
    • आकार शून्य हो सकता है (~ 1) = केवल एक बिंदु
  • सभी बिंदु एक सफेद पृष्ठभूमि पर काले हैं
  • कोई ग्रे-स्केल / एंटी-अलियासिंग प्रभाव नहीं है

यहाँ endolithकुछ छोटे परिवर्तनों के साथ प्रस्तुत विधि का मेरा कार्यान्वयन है (मैं स्रोत के बजाय घुमाया गया लक्ष्य क्योंकि यह रोटेशन में छोटा और तेज़ है)। मैंने एंडोलिथ के उत्तर को स्वीकार कर लिया क्योंकि मैं उस बारे में सोच रहा था। RANSAC के बारे में मुझे अब तक कोई अनुभव नहीं है। इसके अलावा RANSAC के कार्यान्वयन के लिए बहुत सारे कोड की आवश्यकता होती है। यहाँ छवि विवरण दर्ज करें


1
क्या आप ऐसे डॉट्स, या अधिक जटिल चित्रों के मिलान के लिए एक समाधान की तलाश कर रहे हैं? चित्रों में कितने बिंदु हो सकते हैं?

हाँ, यह बहुत महत्वपूर्ण है। यदि यह केवल ज्ञात आकार के डॉट्स हैं, तो आप इसके लिए अनुकूलन कर सकते हैं। यदि यह आपके द्वारा नियंत्रित किए जाने वाले काल्पनिक चिह्न हैं, तो आप इसके लिए अनुकूलित कर सकते हैं। इस बारे में अधिक विशिष्ट रहें कि आप इसके लिए क्या उपयोग कर रहे हैं।
एंडोलिथ

जिस समस्या के लिए मैं इस पर काम कर रहा हूं उसके लिए बिंदुओं के सेट (प्रत्येक कई सौ अंक) हैं, जिसमें आकार बिंदु में एक और छोटा (सेट <100) कहा जा रहा है। ऊपर प्रदर्शन इतना सरल और स्पष्ट है, हालांकि वास्तविक समस्या जटिल दिखती है। उनके बीच मौजूद अवांछित बिंदुओं पर आधारित मैचों को खोजने के लिए भी एक रुचि है।
डेवलपर

1
क्या सिर्फ काले और सफेद डॉट्स होंगे? क्या आप उन्हें एक कैमरा / स्कैनर / कुछ और से प्राप्त कर रहे हैं? बाइनरी मान गणना को बहुत तेज़ बना सकते हैं।
एंडोलिथ

क्या आपको डॉट्स के केंद्रों को खोजने में समस्या है, या बस डॉट्स के पदों को जानने के लिए बड़ी तस्वीर में लघुता को खोजने के साथ समस्या है?

जवाबों:


17

यह सबसे अच्छा समाधान नहीं है, लेकिन यह एक समाधान है। मैं बेहतर तकनीक सीखना चाहता हूँ:

यदि वे घुमाया या छोटा नहीं किया जा रहा था, तो आप छवियों का एक सरल क्रॉस-सहसंबंध उपयोग कर सकते हैं। जहां भी बड़ी छवि में छोटी छवि होती है, वहां एक उज्ज्वल चोटी होगी।

आप FFT विधि का उपयोग करके क्रॉस-सहसंबंध को गति दे सकते हैं, लेकिन यदि आप एक बड़े लक्ष्य छवि के साथ एक छोटे स्रोत की छवि का मिलान कर रहे हैं, तो brute-force गुणा-और-जोड़ विधि कभी-कभी (आमतौर पर नहीं) तेजी से होती है।

स्रोत:

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

लक्ष्य:

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

पार सहसंबंध:

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

दो चमकीले स्थान वे स्थान हैं जो मेल खाते हैं।

लेकिन आपके पास अपनी उदाहरण छवि में एक रोटेशन पैरामीटर है, जिससे वह स्वयं काम नहीं करेगा। यदि केवल घुमाव की अनुमति है, और स्केलिंग नहीं है, तो क्रॉस-सहसंबंध का उपयोग करना अभी भी संभव है, लेकिन आपको क्रॉस-सहसंबंधी होने की आवश्यकता है, स्रोत को घुमाएं, इसे संपूर्ण लक्ष्य छवि के साथ क्रॉस-सहसंबंधित करें, इसे फिर से घुमाएं, आदि के लिए। सभी रोटेशन।

ध्यान दें कि यह आवश्यक रूप से कभी भी छवि नहीं ढूंढेगा। यदि स्रोत छवि यादृच्छिक शोर है, और लक्ष्य यादृच्छिक शोर है, तो आप इसे तब तक नहीं पाएंगे जब तक आप बिल्कुल सही कोण पर खोज नहीं करते। सामान्य स्थितियों के लिए, यह संभवतः इसे ढूंढ लेगा, लेकिन यह छवि गुणों और आपके द्वारा खोजे जाने वाले कोणों पर निर्भर करता है।

यह पृष्ठ एक उदाहरण दिखाता है कि यह कैसे किया जाएगा, लेकिन एल्गोरिथ्म नहीं देता है।

किसी भी ऑफसेट जहां राशि कुछ सीमा से ऊपर है एक मैच है। आप स्रोत की छवि को स्वयं से संबद्ध करके और इस संख्या द्वारा अपने सभी योगों को विभाजित करके मैच की अच्छाई की गणना कर सकते हैं। एक परिपूर्ण मैच 1.0 होगा।

यह बहुत कम्प्यूटेशनल रूप से भारी होगा, हालांकि, और डॉट्स के पैटर्न के मिलान के लिए बेहतर तरीके हैं (जो मैं जानना चाहूंगा)।

ग्रेस्केल और एफएफटी विधि का उपयोग करके त्वरित पायथन उदाहरण:

from __future__ import division
from pylab import *
import Image
import ImageOps

source_file = 'dots source.png'
target_file = 'dots target.png'

# Load file as grayscale with white dots
target = asarray(ImageOps.invert(Image.open(target_file).convert('L')))

close('all')
figure()
imshow(target)
gray()
show()

source_Image = ImageOps.invert(Image.open(source_file).convert('L'))

for angle in (0, 180):
    source = asarray(source_Image.rotate(angle, expand = True))
    best_match = max(fftconvolve(source[::-1,::-1], source).flat)

    # Cross-correlation using FFT
    d = fftconvolve(source[::-1,::-1], target, mode='same')

    figure()
    imshow(source)


    # This only finds a single peak.  Use something that finds multiple peaks instead:
    peak_x, peak_y = unravel_index(argmax(d),shape(d))

    figure()    
    plot(peak_y, peak_x,'ro')
    imshow(d)

    # Keep track of all these matches:
    print angle, peak_x, peak_y, d[peak_x,peak_y] / best_match

1-रंग बिटमैप

1-रंग के बिटमैप्स के लिए, यह बहुत तेज़ होगा, हालाँकि। क्रॉस-सहसंबंध बन जाता है:

  • लक्ष्य छवि पर स्रोत छवि रखें
  • 1 पिक्सेल द्वारा स्रोत छवि को स्थानांतरित करें
    • बिटवाइज़-और सभी अतिव्यापी पिक्सेल
    • सभी 1s योग
  • ...

एक ग्रेस्केल छवि को बाइनरी में थ्रेसहोल्ड करना और फिर ऐसा करना काफी अच्छा हो सकता है।

पॉइंट क्लाउड

यदि स्रोत और लक्ष्य दोनों डॉट्स के पैटर्न हैं, तो एक तेज़ विधि प्रत्येक बिंदु के केंद्र को खोजने के लिए होगी (एक ज्ञात बिंदु के साथ एक बार क्रॉस-सहसंबंधी और फिर चोटियों को ढूंढें) और उन्हें बिंदुओं के एक सेट के रूप में संग्रहीत करें, फिर स्रोत का मिलान करें दो सेटों में निकटतम बिंदुओं के बीच कम से कम चौकोर त्रुटि को घुमाकर, अनुवाद करके, और लक्षित करके लक्षित करें।


1
यह सही है, समस्या की जांच के लिए स्केलिंग नहीं है, लेकिन रोटेशन हो सकता है। लिंक और उत्तर के लिए धन्यवाद।
डेवलपर

@ डेवलपर: ठीक है, यह तब काम करेगा, लेकिन शायद एक बेहतर तरीका है। यदि यह सिर्फ एक द्विआधारी छवि है तो क्रॉस-सहसंबंध हालांकि बहुत तेज़ होगा। (क्या बाइनरी सिग्नल के लिए एफएफटी के रूप में ऐसी कोई चीज है?) क्या रोटेशन मनमाना है? आपको रोटेशन मान के एक सेट के साथ प्रयोग करना होगा जो अच्छे परिणाम देता है, जैसे कि 1 डिग्री या 5 डिग्री की वृद्धि, आदि
एंडोलिथ

1
हाँ यह एक द्विआधारी समस्या है। मुझे कहीं से यह भी याद है कि विभिन्न आयामों के साथ लंबे सिग्नल पर संशोधित छोटे सिग्नल को खोजने के लिए इस तरह की एक विधि थी। मुझे याद है कि जटिलता की परवाह किए बिना यह बहुत अच्छी तरह से काम कर रहा था कि घटनाओं के शुरुआती बिंदुओं के रूप में पिक पॉइंट दिखाए। चूंकि समस्या 2 डी में है इसलिए मेरे लिए यह स्पष्ट नहीं है कि समान अवधारणा का उपयोग कैसे करें। यह रोटेशन के कारण भी जटिल है जो 2 डी में लागू होता है।
डेवलपर

1
हाँ, रोटेशन की स्वतंत्रता को जोड़ने पर यह अक्षम्य हो जाता है। यही कारण है कि RANSAC जैसी विधियों का विकास किया गया था। मुझे लगता है कि इस पर डीएसपी बॉक्स के बाहर सोचने में मदद मिलती है।
मैट एम।

@MattM: यह काम करता है, यह धीमा है। :)
end

22

कंप्यूटर दृष्टि के नजरिए से: मूल समस्या आपके लक्ष्य बिंदु सेट और बड़े सेट में बिंदुओं के सबसेट के बीच एक होमोग्राफी का अनुमान लगा रही है । आपके मामले में, केवल रोटेशन के साथ, यह एक समृद्ध होमोग्राफी होगी। आपको RANSAC पद्धति पर ध्यान देना चाहिए । यह कई आउटलेर्स के साथ सेट में मैच खोजने के लिए बनाया गया है। तो, आप दो महत्वपूर्ण कीवर्ड, होमोग्राफी और RANSAC से लैस हैं

OpenCV इन समाधानों की गणना के लिए उपकरण प्रदान करता है, लेकिन आप MATLAB का उपयोग भी कर सकते हैं। यहाँ OpenCV का उपयोग कर एक RANSAC उदाहरण है । और एक और पूरा कार्यान्वयन

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

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

मुझे लगता है कि क्रॉस-सहसंबंध विधियां आपके लिए भी काम कर सकती हैं क्योंकि डेटा बहुत साफ है। समस्या यह है, आप रोटेशन के साथ स्वतंत्रता की एक और डिग्री जोड़ते हैं, और विधि बहुत धीमी हो जाती है।


मैंने प्रश्न में थोड़ा और विवरण जोड़ दिया। मैं आपके लिंक की गहराई से जाँच करूँगा लेकिन एक त्वरित धारणा यह थी कि वे विभिन्न अवधारणाएँ हैं!
डेवलपर

1
ऐसा लगता है कि यह वास्तव में एक RANSAC / होमोग्राफी समस्या है :)
मैट एम।

कुंआ। यह मेरे लिए एक नई अवधारणा थी। मैं इसे जल्द से जल्द आजमाऊंगा। अगर मुझे कठिनाइयों का सामना करना पड़ा तो मैं आपके साथ, महान और सहायक समुदाय के सदस्यों के साथ साझा करूंगा।
डेवलपर

सरल प्रश्न: क्या RANSAC / होमोग्राफी पद्धति को 3D पॉइंट क्लाउड पर लागू करना संभव / संभव है?
डेवलपर 10

यह एक वैध समाधान नहीं है। दुर्भाग्य से प्रश्न में गहन जानकारी नहीं है और इसलिए सरल विवरणक योजनाएं काम नहीं करेंगी। समस्या इसके बजाय अधिक ज्यामितीय है।
टोलगा बर्डल

3

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

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


1
क्या आप हमें अपने विचार की अधिक व्याख्या के साथ एक उदाहरण देंगे? आपके उत्तर का वर्तमान संस्करण मुझे भ्रमित कर रहा है।
डेवलपर

3

मैं बहुत हैरान हूं कि सामान्यीकृत हाफ ट्रांसफॉर्म परिवार के किसी भी तरीके का उल्लेख क्यों नहीं किया गया । वे सीधे इस विशेष समस्या को हल करते हैं।

यहाँ मैं क्या प्रस्ताव है:

  1. टेम्पलेट लें और टेम्पलेट के किनारों को अनुक्रमित करते हुए, आर-टेबल बनाएं । मेरे द्वारा चुने गए किनारे निम्नलिखित हैं:

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

  1. प्राप्त करने के लिए सामान्यीकृत पर्याप्त परिवर्तन के डिफ़ॉल्ट ओपनसीवी कार्यान्वयन का उपयोग करें : यहाँ छवि विवरण दर्ज करें

जहाँ मिलान स्थान चिह्नित हैं। एक ही विधि अभी भी कार्यात्मक होगी, भले ही किनारों को एक बिंदु तक कम किया जाए, क्योंकि विधि को छवि तीव्रता की आवश्यकता नहीं है।

इसके अलावा, हाफ योजनाओं के लिए रोटेशन को संभालना बहुत स्वाभाविक है। वास्तव में, 2 डी मामले के लिए, यह संचायक में सिर्फ एक जोड़ा आयाम है। मामले में आप इसे वास्तव में कुशल बनाने के विवरण में जाना चाहते हैं। एम। उलरिच अपने पेपर में बहुत सारी चालें बताते हैं ।


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