Bu en iyi çözüm değil, ama bir çözüm. Daha iyi teknikler öğrenmek isterdim:
Dönmeyecekler veya ölçeklenmeyeceklerse, görüntülerin basit çapraz korelasyonunu kullanabilirsiniz. Büyük görüntüde küçük görüntünün gerçekleştiği yerde parlak bir tepe olacaktır.
FFT yöntemini kullanarak çapraz korelasyonu hızlandırabilirsiniz, ancak küçük bir kaynak görüntüyü büyük bir hedef görüntüyle eşleştiriyorsanız, kaba kuvvet çarpma ve ekleme yöntemi bazen (genellikle değil) daha hızlı olur.
Kaynak:
Hedef:
Çapraz korelasyon:
İki parlak nokta, eşleşen konumlardır.
Ama bunu o kendisi tarafından çalışma olmaz, böylece Örnek resimdeki bir rotasyon parametresi var. Yalnızca dönmeye izin veriliyorsa ve ölçeklenmiyorsa, yine de çapraz korelasyon kullanmak mümkündür, ancak çapraz korelasyon kurmanız, kaynağı döndürmeniz, tüm hedef görüntü ile çapraz ilişkilendirmeniz, tekrar döndürmeniz vb. Tüm rotasyonlar
Bunun mutlaka görüntüyü bulamayacağını unutmayın. Kaynak görüntü rastgele gürültü ve hedef rastgele gürültü ise, tam olarak doğru açıda aramadığınız sürece bulamazsınız. Normal durumlar için muhtemelen onu bulacak, ancak resim özelliklerine ve aradığınız açılara bağlı.
Bu sayfa nasıl yapılacağına dair bir örnek gösterir, ancak algoritmayı vermez.
Toplamın bir miktar eşiğin üstünde olduğu herhangi bir denge bir eşleşmedir. Kaynak görüntünün kendisiyle ilişkilendirerek ve tüm miktarlarınızı bu sayıya bölerek eşleşmenin iyi olduğunu hesaplayabilirsiniz. Mükemmel bir eşleşme 1.0 olacaktır.
Yine de, bu hesaplama oldukça ağır olacak ve nokta kalıplarını eşleştirmek için daha iyi yöntemler var (bilmek istiyorum).
Gri tonlamalı ve FFT yöntemiyle Hızlı Python örneği:
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 renkli bitmapler
1 renkli bitmapler için bu çok daha hızlı olurdu. Çapraz korelasyon:
- Kaynak resmi hedef resmin üzerine yerleştirin
- Kaynak görüntüyü 1 piksele taşı
- Bitsel-AND tüm çakışan pikseller
- 1'leri topla
- ...
Gri tonlamalı bir görüntünün binary'e eşiklenmesi ve ardından bunu yapmak yeterince iyi olabilir.
Nokta bulutu
Kaynak ve hedef her iki nokta paterni ise, daha hızlı bir yöntem, her noktanın merkezlerini bulmak (bir kez bilinen bir noktayla çapraz korelasyon yapmak ve sonra zirveleri bulmak) ve bunları bir nokta kümesi olarak saklamak, sonra kaynağı eşleştirmek olacaktır. İki setteki en yakın noktalar arasındaki en küçük kareler hatasını döndürerek, çevirerek ve bularak hedeflemektir.