Nhận dạng mẫu điểm


46

Có hai kích thước khác nhau của các tập hợp điểm (2D để đơn giản) phân tán trong hai ô vuông kích thước khác nhau, câu hỏi là:

1- làm thế nào để tìm thấy bất kỳ sự xuất hiện của cái nhỏ thông qua cái lớn?
2- Có ý tưởng nào về cách xếp hạng các lần xuất hiện như trong hình sau không?

Dưới đây là một minh chứng đơn giản cho câu hỏi và một giải pháp mong muốn: nhập mô tả hình ảnh ở đây


Cập nhật 1:
Hình dưới đây cho thấy cái nhìn thực tế hơn một chút về vấn đề đang được điều tra. nhập mô tả hình ảnh ở đây

Về các ý kiến ​​áp dụng các thuộc tính sau:

  • vị trí chính xác của điểm có sẵn
  • kích thước chính xác của điểm có sẵn
    • kích thước có thể bằng 0 (~ 1) = chỉ một điểm
  • tất cả các điểm là màu đen trên nền trắng
  • không có hiệu ứng khử răng cưa / thang xám

Dưới đây là cách triển khai của tôi về phương pháp được trình bày bằng endolithmột số thay đổi nhỏ (tôi đã xoay mục tiêu thay vì nguồn vì nó nhỏ hơn và quay nhanh hơn). Tôi đã chấp nhận câu trả lời của endolith bởi vì tôi đã suy nghĩ về điều đó trước đây. Về RANSAC tôi không có kinh nghiệm cho đến nay. Hơn nữa, việc thực hiện RANSAC đòi hỏi rất nhiều mã. nhập mô tả hình ảnh ở đây


1
Bạn đang tìm kiếm một giải pháp để phù hợp với các chấm như vậy, hoặc cho các hình ảnh phức tạp hơn? Có bao nhiêu chấm có thể có trong hình ảnh?

Vâng, điều đó rất quan trọng. Nếu đó chỉ là những chấm có kích thước đã biết, bạn có thể tối ưu hóa cho điều đó. Nếu đó là các dấu hiệu ủy thác mà bạn có quyền kiểm soát, bạn có thể tối ưu hóa cho điều đó. Hãy cụ thể hơn về những gì bạn đang sử dụng này cho.
endolith

Đối với vấn đề mà tôi đang giải quyết, có các tập hợp điểm (mỗi vài trăm điểm) trong đó một tập hợp điểm kích thước nhỏ hơn (giả sử <100) đang được tìm kiếm. Trình diễn ở trên rất đơn giản và rõ ràng, tuy nhiên vấn đề thực sự có vẻ phức tạp. Ngoài ra còn có một mối quan tâm để tìm các trận đấu được xếp hạng dựa trên các điểm không mong muốn tồn tại trong số đó.
Nhà phát triển

1
Sẽ chỉ có những chấm đen trắng? Bạn có nhận được chúng từ một máy ảnh / máy quét / cái gì khác không? Giá trị nhị phân có thể làm cho việc tính toán nhanh hơn nhiều.
endolith

Bạn có gặp vấn đề với việc tìm trung tâm của các chấm, hoặc chỉ với việc tìm thu nhỏ trong bức tranh lớn biết vị trí của các chấm?

Câu trả lời:


17

Đây không phải là giải pháp tốt nhất, nhưng nó là một giải pháp. Tôi muốn tìm hiểu các kỹ thuật tốt hơn:

Nếu chúng không được xoay hoặc thu nhỏ, bạn có thể sử dụng một mối tương quan chéo đơn giản của hình ảnh. Sẽ có một đỉnh sáng bất cứ nơi nào hình ảnh nhỏ xuất hiện trong hình ảnh lớn.

Bạn có thể tăng tốc độ tương quan chéo bằng cách sử dụng phương pháp FFT, nhưng nếu bạn chỉ khớp một hình ảnh nguồn nhỏ với một hình ảnh mục tiêu lớn, thì phương pháp nhân và thêm của brute-force đôi khi (thường không) nhanh hơn.

Nguồn:

nhập mô tả hình ảnh ở đây

Mục tiêu:

nhập mô tả hình ảnh ở đây

Tương quan chéo:

nhập mô tả hình ảnh ở đây

Hai điểm sáng là vị trí phù hợp.

Nhưng bạn làm có một tham số xoay theo hình ảnh ví dụ của bạn, do đó sẽ không làm việc của chính nó. Nếu chỉ cho phép xoay và không chia tỷ lệ, thì vẫn có thể sử dụng tương quan chéo, nhưng bạn cần tương quan chéo, xoay nguồn, tương quan chéo với toàn bộ ảnh đích, xoay lại, v.v. tất cả các vòng quay.

Lưu ý rằng điều này sẽ không nhất thiết phải tìm thấy hình ảnh. Nếu hình ảnh nguồn là nhiễu ngẫu nhiên và mục tiêu là nhiễu ngẫu nhiên, bạn sẽ không tìm thấy nó trừ khi bạn tìm kiếm ở góc chính xác. Đối với các tình huống thông thường, nó có thể sẽ tìm thấy nó, nhưng nó phụ thuộc vào thuộc tính hình ảnh và các góc bạn tìm kiếm.

Trang này hiển thị một ví dụ về cách nó sẽ được thực hiện, nhưng không đưa ra thuật toán.

Bất kỳ giá trị bù nào có tổng nằm trên ngưỡng nào đó đều khớp. Bạn có thể tính toán mức độ tốt của trận đấu bằng cách tương quan hình ảnh nguồn với chính nó và chia tất cả số tiền của bạn cho số này. Một trận đấu hoàn hảo sẽ là 1.0.

Tuy nhiên, điều này sẽ rất nặng về tính toán, và có lẽ có các phương pháp tốt hơn để kết hợp các mẫu chấm (mà tôi muốn biết).

Ví dụ Python nhanh sử dụng phương pháp thang độ xám và 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

Ảnh bitmap 1 màu

Đối với bitmap 1 màu, tuy nhiên, điều này sẽ nhanh hơn nhiều. Tương quan chéo trở thành:

  • Đặt hình ảnh nguồn trên hình ảnh mục tiêu
  • Di chuyển hình ảnh nguồn 1 pixel
    • bitwise-VÀ tất cả các pixel chồng lấp
    • tổng tất cả 1
  • ...

Đập một hình ảnh thang độ xám thành nhị phân và sau đó làm điều này có thể là đủ tốt.

Đám mây điểm

Nếu nguồn và đích là cả hai mẫu chấm, phương pháp nhanh hơn sẽ là tìm tâm của mỗi dấu chấm (tương quan chéo một lần với dấu chấm đã biết và sau đó tìm các đỉnh) và lưu trữ chúng dưới dạng tập hợp điểm, sau đó khớp nguồn để nhắm mục tiêu bằng cách xoay, dịch và tìm lỗi bình phương nhỏ nhất giữa các điểm gần nhất trong hai bộ.


1
Điều đó đúng, đối với vấn đề đang được điều tra, không có sự thay đổi tỷ lệ nhưng việc xoay vòng có thể xảy ra. Cảm ơn các liên kết và câu trả lời.
Nhà phát triển

@ Nhà phát triển: Vâng, điều này sẽ hoạt động sau đó, nhưng có lẽ có một cách tốt hơn. Nếu đó chỉ là một hình ảnh nhị phân thì sự tương quan chéo sẽ nhanh hơn nhiều. (Có một thứ như FFT cho tín hiệu nhị phân không?) Là phép quay tùy ý? Bạn sẽ phải thử nghiệm với một tập hợp các giá trị luân chuyển cung cấp cho kết quả tốt, như incrementing bởi 1 độ, hoặc 5 độ vv
endolith

1
Vâng, đó là một vấn đề nhị phân. Tôi cũng nhớ từ đâu đó có một phương pháp như vậy để tìm một tín hiệu ngắn hơn được điều chế trên tín hiệu dài hơn với biên độ khác nhau. Tôi nhớ bất kể sự phức tạp, nó đã hoạt động rất tốt cho thấy các điểm chọn là điểm bắt đầu của các lần xuất hiện. Vì vấn đề là ở dạng 2D nên tôi không biết cách sử dụng khái niệm tương tự. Điều này cũng phức tạp do xoay được áp dụng trong 2D.
Nhà phát triển

1
Vâng, điều này trở nên không khả thi khi thêm tự do xoay vòng. Đây là lý do tại sao các phương pháp như RANSAC được phát triển. Tôi nghĩ nó giúp suy nghĩ bên ngoài hộp DSP về cái này.
Matt M.

@MattM.: Nó hoạt động, nó chỉ chậm. :)
endolith

22

Từ góc độ thị giác máy tính: vấn đề cơ bản là ước tính một điểm tương đồng giữa tập hợp điểm mục tiêu của bạn và tập hợp các điểm trong tập lớn. Trong trường hợp của bạn, chỉ với xoay vòng, nó sẽ là một homography affine. Bạn nên xem xét phương pháp RANSAC . Nó được thiết kế để tìm một trận đấu trong một tập hợp có nhiều ngoại lệ. Vì vậy, bạn được trang bị hai từ khóa quan trọng là homographyRANSAC .

OpenCV cung cấp các công cụ để tính toán các giải pháp này, nhưng bạn cũng có thể sử dụng MATLAB. Dưới đây là một ví dụ RANSAC sử dụng OpenCV . Và thực hiện đầy đủ khác .

Một ứng dụng điển hình có thể là tìm bìa sách trong một bức tranh. Bạn có một hình ảnh của bìa sách, và một hình ảnh của cuốn sách trên bàn. Cách tiếp cận không phải là khớp mẫu, mà là tìm các góc nổi bật trong mỗi ảnh và so sánh các tập hợp điểm đó. Vấn đề của bạn trông giống như nửa sau của quá trình này - tìm điểm được đặt trong một đám mây lớn. RANSAC được thiết kế để làm điều này một cách mạnh mẽ.

nhập mô tả hình ảnh ở đây

Tôi đoán các phương pháp tương quan chéo cũng có thể làm việc cho bạn vì dữ liệu rất sạch sẽ. Vấn đề là, bạn thêm một mức độ tự do khác với xoay vòng, và phương pháp trở nên rất chậm.


Tôi đã thêm một chút chi tiết trong câu hỏi. Tôi sẽ kiểm tra sâu các liên kết của bạn tuy nhiên một ấn tượng nhanh là chúng là các khái niệm khác nhau!
Nhà phát triển

1
Có vẻ như đó thực sự là một vấn đề RansAC / homography :)
Matt M.

Tốt. Đó là một khái niệm mới với tôi. Tôi sẽ thử nó càng sớm càng tốt. Nếu tôi gặp khó khăn, tôi sẽ chia sẻ với bạn, những thành viên cộng đồng tuyệt vời và hỗ trợ.
Nhà phát triển

Hỏi đơn giản: Có thể / khả thi khi áp dụng phương pháp RANSAC / homography cho đám mây điểm 3D không?
Nhà phát triển

Đây không phải là một giải pháp hợp lệ. Thật không may, câu hỏi không chứa thông tin cường độ và do đó các sơ đồ mô tả đơn giản sẽ không hoạt động. Vấn đề là khá hình học hơn thế.
Birdga Tolga

3

Nếu mô hình là nhị phân thưa thớt, bạn có thể thực hiện hiệp phương sai đơn giản của vectơ tọa độ thay vì hình ảnh. Lấy tọa độ của các điểm trong cửa sổ phụ được sắp xếp bên trái, tạo một vectơ từ tất cả các tọa độ và tính hiệp phương sai với vectơ được làm bằng tọa độ của các điểm của mẫu được sắp xếp bên trái. Bạn cũng có thể sử dụng trọng lượng. Sau đó, tạo ra lực lượng hàng xóm gần nhất tìm kiếm hiệp phương sai tối đa trên một số lưới trong cửa sổ lớn (và cả lưới theo các góc quay). Sau khi tìm tọa độ gần đúng với tìm kiếm, bạn có thể tinh chỉnh chúng bằng phương pháp bình phương tối thiểu.

PS Idea là, thay vì làm việc với hình ảnh, bạn có thể làm việc với tọa độ các pixel khác không. Tìm kiếm hàng xóm gần nhất. Bạn nên thực hiện tìm kiếm toàn diện tất cả không gian tìm kiếm, cả dịch và xoay bằng cách sử dụng một số lưới, đó là một số bước trong tọa độ và góc quay. Đối với mỗi tọa độ / góc, bạn lấy tập hợp pixel trong cửa sổ với tâm với tọa độ đó được xoay theo góc đó, lấy tọa độ của chúng (liên quan đến trung tâm) và so sánh chúng với tọa độ pixel của mẫu bạn tìm kiếm. Bạn nên đảm bảo rằng trong cả hai bộ điểm được sắp xếp theo cùng một cách. Bạn tìm tọa độ với chênh lệch tối thiểu (hiệp phương sai tối đa). Sau trận đấu khó khăn đó, bạn có thể tìm thấy kết quả khớp chính xác với một số phương pháp tối ưu hóa. Xin lỗi tôi không thể chuyển tiếp nó đơn giản hơn thế.


1
Bạn có thể cho chúng tôi một ví dụ với nhiều lời giải thích về ý tưởng của bạn? Phiên bản hiện tại của câu trả lời của bạn là khó hiểu với tôi.
Nhà phát triển

3

Tôi rất ngạc nhiên tại sao không ai đề cập đến các phương pháp của gia đình General Hough Transform . Họ trực tiếp giải quyết vấn đề đặc biệt này.

Đây là những gì tôi đề xuất:

  1. Lấy mẫu và tạo bảng R , lập chỉ mục các cạnh của mẫu. Các cạnh tôi chọn là như sau:

nhập mô tả hình ảnh ở đây

  1. Sử dụng triển khai OpenCV mặc định của biến đổi Hough tổng quát để thu được: nhập mô tả hình ảnh ở đây

nơi các vị trí phù hợp được đánh dấu. Phương thức tương tự vẫn sẽ hoạt động ngay cả khi các cạnh giảm xuống một điểm, bởi vì phương thức này không bắt buộc cường độ hình ảnh.

Hơn nữa, xử lý các phép quay là rất tự nhiên đối với các sơ đồ Hough. Trong thực tế, đối với trường hợp 2D, nó chỉ là một thứ nguyên được thêm vào trong bộ tích lũy. Trong trường hợp bạn muốn đi sâu vào chi tiết làm cho nó thực sự hiệu quả, M. Ulrich giải thích rất nhiều mánh khóe trong bài báo của mình .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.