นี่ไม่ใช่ทางออกที่ดีที่สุด แต่เป็นทางออก ฉันต้องการเรียนรู้เทคนิคที่ดีกว่า:
หากพวกเขาจะไม่หมุนหรือปรับขนาดคุณสามารถใช้ความสัมพันธ์ข้ามภาพง่าย ๆ จะมีจุดสูงสุดที่สว่างไสวทุกที่ที่ภาพเล็กเกิดขึ้นในภาพขนาดใหญ่
คุณสามารถเพิ่มความเร็วข้ามสหสัมพันธ์โดยใช้วิธี FFT แต่ถ้าคุณเพิ่งจับคู่รูปภาพต้นฉบับขนาดเล็กที่มีรูปภาพเป้าหมายขนาดใหญ่วิธีการทวีคูณแบบทวีคูณและเพิ่มแรงนั้นบางครั้งก็เร็วกว่า
ที่มา:
เป้าหมาย:
ข้ามความสัมพันธ์:
จุดสว่างสองจุดคือตำแหน่งที่ตรงกัน
แต่คุณทำมีพารามิเตอร์หมุนในภาพตัวอย่างของคุณเพื่อที่จะไม่ทำงานด้วยตัวเอง หากอนุญาตให้มีการหมุนเท่านั้นและไม่ปรับขนาดก็ยังสามารถใช้ความสัมพันธ์ข้ามได้ แต่คุณต้องข้ามสหสัมพันธ์หมุนแหล่งที่มาเชื่อมโยงข้ามกับภาพเป้าหมายทั้งหมดหมุนอีกครั้ง ฯลฯ สำหรับ การหมุนทั้งหมด
โปรดทราบว่าการทำเช่นนี้จะไม่สามารถค้นหารูปภาพได้ หากภาพต้นฉบับเป็นสัญญาณรบกวนแบบสุ่มและเป้าหมายเป็นสัญญาณรบกวนแบบสุ่มคุณจะไม่พบมันเว้นแต่คุณจะค้นหาในมุมที่ถูกต้อง สำหรับสถานการณ์ปกติมันอาจจะพบ แต่มันขึ้นอยู่กับคุณสมบัติของภาพและมุมที่คุณค้นหา
หน้านี้แสดงตัวอย่างของวิธีการทำ แต่ไม่ได้ให้อัลกอริทึม
ออฟเซ็ตใด ๆ ที่ผลรวมอยู่เหนือขีด จำกัด บางตัวเป็นการแข่งขัน คุณสามารถคำนวณความดีของการจับคู่โดยเชื่อมโยงรูปภาพต้นฉบับกับตัวเองและหารผลรวมทั้งหมดของคุณด้วยหมายเลขนี้ การจับคู่ที่สมบูรณ์แบบจะเป็น 1.0
แม้ว่าจะมีการคำนวณที่หนักมากและอาจมีวิธีที่ดีกว่าสำหรับการจับคู่รูปแบบของจุด (ซึ่งฉันต้องการทราบ)
ตัวอย่าง Python อย่างรวดเร็วโดยใช้วิธีสีเทาและ FFT:
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 พิกเซล
- bitwise-AND พิกเซลที่ทับซ้อนกันทั้งหมด
- รวม 1s ทั้งหมด
- ...
การกำหนดภาพสีเทาเป็นไบนารีใหม่แล้วทำเช่นนี้อาจดีพอ
แต้มเมฆ
หากแหล่งที่มาและเป้าหมายเป็นรูปแบบของจุดทั้งสองวิธีที่เร็วกว่าคือการหาจุดกึ่งกลางของแต่ละจุด (cross-correlate หนึ่งครั้งด้วยจุดที่รู้จักแล้วค้นหาจุดสูงสุด) และเก็บไว้เป็นชุดของจุดจากนั้นจับคู่แหล่งที่มา เพื่อกำหนดเป้าหมายโดยการหมุนแปลและค้นหาข้อผิดพลาดกำลังสองน้อยที่สุดระหว่างจุดที่ใกล้ที่สุดในสองชุด