यह सबसे अच्छा समाधान नहीं है, लेकिन यह एक समाधान है। मैं बेहतर तकनीक सीखना चाहता हूँ:
यदि वे घुमाया या छोटा नहीं किया जा रहा था, तो आप छवियों का एक सरल क्रॉस-सहसंबंध उपयोग कर सकते हैं। जहां भी बड़ी छवि में छोटी छवि होती है, वहां एक उज्ज्वल चोटी होगी।
आप 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 योग
- ...
एक ग्रेस्केल छवि को बाइनरी में थ्रेसहोल्ड करना और फिर ऐसा करना काफी अच्छा हो सकता है।
पॉइंट क्लाउड
यदि स्रोत और लक्ष्य दोनों डॉट्स के पैटर्न हैं, तो एक तेज़ विधि प्रत्येक बिंदु के केंद्र को खोजने के लिए होगी (एक ज्ञात बिंदु के साथ एक बार क्रॉस-सहसंबंधी और फिर चोटियों को ढूंढें) और उन्हें बिंदुओं के एक सेट के रूप में संग्रहीत करें, फिर स्रोत का मिलान करें दो सेटों में निकटतम बिंदुओं के बीच कम से कम चौकोर त्रुटि को घुमाकर, अनुवाद करके, और लक्षित करके लक्षित करें।