การจดจำรูปแบบจุด


46

การมีขนาดของชุดคะแนนที่แตกต่างกันสองมิติ (2D เพื่อความง่าย) จะกระจายไปภายในสี่เหลี่ยมขนาดต่างกันสองคำถามคือ:

1- วิธีการหาการเกิดขึ้นของเล็ก ๆ ผ่านใหญ่ได้อย่างไร
2- ความคิดใด ๆ เกี่ยวกับวิธีการจัดอันดับเหตุการณ์ที่แสดงในรูปต่อไปนี้?

ต่อไปนี้เป็นการสาธิตคำถามอย่างง่ายและวิธีแก้ปัญหาที่ต้องการ: ป้อนคำอธิบายรูปภาพที่นี่


อัปเดต 1:
รูปต่อไปนี้แสดงมุมมองที่สมจริงยิ่งขึ้นเกี่ยวกับปัญหาที่กำลังตรวจสอบ ป้อนคำอธิบายรูปภาพที่นี่

เกี่ยวกับความคิดเห็นคุณสมบัติต่อไปนี้ใช้:

  • ตำแหน่งที่แน่นอนของจุดที่มีอยู่
  • ขนาดที่แน่นอนของจุดที่มีอยู่
    • ขนาดสามารถเป็นศูนย์ (~ 1) = เพียงจุดเดียว
  • จุดทั้งหมดเป็นสีดำบนพื้นหลังสีขาว
  • ไม่มีเอฟเฟกต์สีเทา / การลดรอยหยัก

นี่คือการใช้งานวิธีการที่นำเสนอโดยendolithมีการเปลี่ยนแปลงเล็กน้อย (ฉันหมุนเป้าหมายแทนแหล่งที่มาเนื่องจากมีขนาดเล็กและหมุนเร็วขึ้น) ฉันยอมรับคำตอบของ endolith เพราะฉันคิดถึงเรื่องนั้นมาก่อน เกี่ยวกับ RANSAC ฉันไม่เคยมีประสบการณ์มาก่อน นอกจากนี้การใช้งานของ RANSAC ต้องการรหัสจำนวนมาก ป้อนคำอธิบายรูปภาพที่นี่


1
คุณกำลังมองหาวิธีการจับคู่จุดดังกล่าวหรือภาพที่ซับซ้อนมากขึ้น? ในรูปภาพมีจุดกี่จุด?

ใช่นั่นเป็นสิ่งที่สำคัญมาก หากเป็นเพียงขนาดที่ทราบคุณสามารถปรับให้เหมาะสมสำหรับสิ่งนั้น หากเป็นเครื่องหมายความไว้วางใจที่คุณสามารถควบคุมได้คุณสามารถปรับให้เหมาะสม มีความเฉพาะเจาะจงมากขึ้นเกี่ยวกับสิ่งที่คุณใช้สิ่งนี้
endolith

สำหรับปัญหาที่ฉันกำลังทำอยู่ก็มีชุดของจุด (แต่ละร้อยคะแนน) ซึ่งมีขนาดเล็กกว่าอีกหนึ่งจุด (พูดว่า <100) การสาธิตด้านบนนั้นเรียบง่ายและชัดเจนอย่างไรก็ตามปัญหาจริงดูซับซ้อน นอกจากนี้ยังมีความสนใจในการค้นหาการจับคู่การจัดอันดับตามคะแนนที่ไม่พึงประสงค์ที่มีอยู่ในหมู่พวกเขา
นักพัฒนา

1
จะมีจุดสีดำและสีขาวหรือไม่ คุณได้มาจากกล้อง / สแกนเนอร์ / อย่างอื่นหรือไม่? ค่าไบนารีสามารถทำการคำนวณได้เร็วขึ้นมาก
endolith

คุณมีปัญหากับการค้นหาจุดศูนย์กลางของจุดหรือเพียงแค่การหาขนาดเล็กในภาพใหญ่รู้ตำแหน่งของจุด?

คำตอบ:


17

นี่ไม่ใช่ทางออกที่ดีที่สุด แต่เป็นทางออก ฉันต้องการเรียนรู้เทคนิคที่ดีกว่า:

หากพวกเขาจะไม่หมุนหรือปรับขนาดคุณสามารถใช้ความสัมพันธ์ข้ามภาพง่าย ๆ จะมีจุดสูงสุดที่สว่างไสวทุกที่ที่ภาพเล็กเกิดขึ้นในภาพขนาดใหญ่

คุณสามารถเพิ่มความเร็วข้ามสหสัมพันธ์โดยใช้วิธี 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 หนึ่งครั้งด้วยจุดที่รู้จักแล้วค้นหาจุดสูงสุด) และเก็บไว้เป็นชุดของจุดจากนั้นจับคู่แหล่งที่มา เพื่อกำหนดเป้าหมายโดยการหมุนแปลและค้นหาข้อผิดพลาดกำลังสองน้อยที่สุดระหว่างจุดที่ใกล้ที่สุดในสองชุด


1
ถูกต้องสำหรับปัญหาที่ตรวจสอบไม่มีการปรับขนาด แต่การหมุนสามารถเกิดขึ้นได้ ขอบคุณสำหรับลิงค์และคำตอบ
นักพัฒนา

@Developer: เอาละนี่จะใช้งานได้ แต่ก็น่าจะเป็นวิธีที่ดีกว่า ถ้ามันเป็นแค่ภาพคู่ความสัมพันธ์ข้ามจะเร็วขึ้นมาก (มีสิ่งเช่น FFT สำหรับสัญญาณไบนารีหรือไม่) การหมุนตามอำเภอใจหรือไม่? คุณต้องทดลองกับชุดของค่าการหมุนที่ให้ผลลัพธ์ที่ดีเช่นการเพิ่มขึ้น 1 องศาหรือ 5 องศาเป็นต้น
endolith

1
ใช่มันเป็นปัญหาไบนารี ฉันยังจำได้จากที่ไหนสักแห่งที่มีวิธีการดังกล่าวในการค้นหาสัญญาณที่สั้นกว่าที่มอดูเลตบนสัญญาณที่ยาวขึ้นด้วยแอมพลิจูดที่แตกต่างกัน ฉันจำได้ว่าความซับซ้อนนั้นทำงานได้ดีมากโดยแสดงจุดรับเป็นจุดเริ่มต้นของเหตุการณ์ เนื่องจากปัญหาอยู่ในแบบ 2D มันไม่ชัดเจนสำหรับฉันที่จะใช้แนวคิดที่คล้ายกัน นอกจากนี้ยังมีความซับซ้อนเนื่องจากการหมุนซึ่งใช้ใน 2D
นักพัฒนา

1
ใช่สิ่งนี้ไม่สามารถทำได้เมื่อเพิ่มอิสระในการหมุน นี่คือเหตุผลที่วิธีการเช่น RANSAC ได้รับการพัฒนา ฉันคิดว่ามันช่วยให้คิดนอกกรอบ DSP ของอันนี้
Matt M.

@ Mattatt: มันใช้งานได้มันช้ามาก :)
endolith

22

จากมุมมองของคอมพิวเตอร์วิสัยทัศน์: ปัญหาพื้นฐานคือการประมาณค่าhomographyระหว่างชุดจุดเป้าหมายของคุณกับเซตย่อยของคะแนนในชุดขนาดใหญ่ ในกรณีของคุณด้วยการหมุนเท่านั้นมันจะเป็นการเลียนแบบการเลียนแบบ คุณควรดูวิธีการRANSAC มันถูกออกแบบมาเพื่อค้นหาการแข่งขันในชุดที่มีค่าผิดปกติจำนวนมาก ดังนั้นคุณจะมีอาวุธสองคำสำคัญhomographyและRANSAC

OpenCV เสนอเครื่องมือสำหรับการคำนวณโซลูชันเหล่านี้ แต่คุณสามารถใช้ MATLAB ได้ นี่คือตัวอย่าง RANSAC ใช้ OpenCV และอื่น ๆใช้งานที่สมบูรณ์

แอปพลิเคชั่นทั่วไปอาจจะหาปกหนังสือในภาพ คุณมีภาพปกหนังสือและภาพถ่ายของหนังสือบนโต๊ะ วิธีนี้ไม่ได้ทำการจับคู่แม่แบบ แต่เพื่อค้นหามุมที่เด่นในแต่ละภาพและเปรียบเทียบชุดจุดเหล่านั้น ปัญหาของคุณดูเหมือนว่าในช่วงครึ่งหลังของกระบวนการนี้ - การค้นหาจุดที่ตั้งไว้ในคลาวด์ขนาดใหญ่ RANSAC ถูกออกแบบมาเพื่อทำสิ่งนี้อย่างสมบูรณ์

ป้อนคำอธิบายรูปภาพที่นี่

ฉันเดาว่าวิธีการสหสัมพันธ์สามารถทำงานให้คุณได้เนื่องจากข้อมูลสะอาด ปัญหาคือคุณเพิ่มระดับความอิสระอีกระดับหนึ่งด้วยการหมุนและวิธีการจะช้ามาก


ฉันเพิ่มรายละเอียดเพิ่มเติมในคำถาม ฉันจะตรวจสอบลิงก์ของคุณอย่างลึกซึ้ง แต่ความประทับใจอย่างรวดเร็วคือพวกเขามีแนวคิดแตกต่างกัน!
นักพัฒนา

1
ดูเหมือนว่ามันย่อมเป็นปัญหา RANSAC / homography :)
แมตต์เอ็ม

ดี. มันเป็นแนวคิดใหม่สำหรับฉัน ฉันจะลองโดยเร็วที่สุด หากฉันเผชิญกับความยากลำบากฉันจะแบ่งปันกับคุณสมาชิกชุมชนที่ยอดเยี่ยมและให้การสนับสนุน
นักพัฒนา

ง่าย Q: เป็นไปได้ / เป็นไปได้ที่จะใช้วิธี RANSAC / homography กับ 3D point cloud หรือไม่?
นักพัฒนา

นี่ไม่ใช่ทางออกที่ถูกต้อง คำถามน่าเสียดายที่ไม่มีข้อมูลความเข้มดังนั้นโครงร่างตัวอธิบายอย่างง่ายจะไม่ทำงาน ปัญหาค่อนข้างเชิงเรขาคณิตมากกว่านั้น
Tolga Birdal

3

หากรูปแบบเป็นแบบเบาบางคุณสามารถทำค่าความแปรปรวนร่วมแบบเวกเตอร์แทนภาพได้ ใช้พิกัดของจุดในหน้าต่างย่อยที่เรียงจากซ้ายไปทำเวกเตอร์จากพิกัดทั้งหมดและคำนวณความแปรปรวนร่วมกับเวกเตอร์ที่ทำจากพิกัดของจุดของรูปแบบที่เรียงจากซ้ายไป คุณยังสามารถใช้น้ำหนักได้อีกด้วย หลังจากนั้นบังคับให้เดรัจฉานกำลังค้นหาเพื่อนบ้านที่ใกล้เคียงที่สุดเพื่อหาค่าความแปรปรวนร่วมสูงสุดในบางกริดในหน้าต่างขนาดใหญ่ หลังจากค้นหาพิกัดโดยประมาณด้วยการค้นหาคุณสามารถปรับแต่งพวกเขาด้วยวิธีกำลังสองน้อยที่สุด

PS Idea คือแทนที่จะทำงานกับรูปภาพคุณสามารถทำงานกับพิกัดของพิกเซลที่ไม่เป็นศูนย์ได้ การค้นหาเพื่อนบ้านใกล้เคียงที่พบบ่อย คุณควรทำการค้นหาพื้นที่ทั้งหมดอย่างละเอียดถี่ถ้วนทั้งการแปลและการหมุนโดยใช้กริดซึ่งเป็นขั้นตอนในการประสานงานและมุมการหมุน สำหรับแต่ละพิกัด / มุมที่คุณใช้เซ็ตย่อยของพิกเซลในหน้าต่างโดยมีกึ่งกลางที่พิกัดนั้นหมุนไปที่มุมนั้นให้ใช้พิกัด (สัมพันธ์กับกึ่งกลาง) และเปรียบเทียบกับพิกัดของพิกเซลของรูปแบบที่คุณต้องการ คุณควรตรวจสอบให้แน่ใจว่าในทั้งสองชุดคะแนนเรียงในลักษณะเดียวกัน คุณค้นหาพิกัดที่มีความแตกต่างน้อยที่สุด (ความแปรปรวนสูงสุด) หลังจากการจับคู่แบบคร่าวๆนั้นคุณสามารถค้นหาการจับคู่ที่แม่นยำด้วยวิธีการเพิ่มประสิทธิภาพบางอย่าง ขออภัยฉันไม่สามารถถ่ายทอดได้ง่ายกว่านั้น


1
คุณจะให้ตัวอย่างแก่เราพร้อมคำอธิบายเพิ่มเติมเกี่ยวกับความคิดของคุณหรือไม่ คำตอบของคุณในเวอร์ชันปัจจุบันทำให้ฉันสับสน
นักพัฒนา

3

ฉันประหลาดใจมากว่าทำไมไม่มีใครพูดถึงวิธีการในตระกูลGeneralized Hough Transform พวกเขาแก้ปัญหาเฉพาะนี้โดยตรง

นี่คือสิ่งที่ฉันเสนอ:

  1. นำเทมเพลตและสร้างตาราง Rสร้างดัชนีขอบของเทมเพลต ขอบที่ฉันเลือกมีดังต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

  1. ใช้การเริ่มต้นใช้งาน OpenCV ของการแปลง Hough ทั่วไปเพื่อรับ: ป้อนคำอธิบายรูปภาพที่นี่

ที่มีการทำเครื่องหมายตำแหน่งที่ตรงกัน วิธีการเดียวกันนี้ยังคงใช้งานได้แม้ว่าขอบจะลดลงถึงจุดเดียวเนื่องจากวิธีการนี้ไม่จำเป็นต้องใช้ความเข้มของภาพ

นอกจากนี้การจัดการการหมุนยังเป็นเรื่องธรรมดาสำหรับ Hough schemes ในความเป็นจริงสำหรับกรณี 2 มิติมันเป็นเพียงมิติเพิ่มเติมในแอคคคูเลเตอร์ ในกรณีที่คุณต้องการจะไปในรายละเอียดของการทำว่ามันมีประสิทธิภาพจริงๆเอ็มอูลอธิบายมากเทคนิคในกระดาษของเขา


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.