포인트 패턴 인식


46

두 개의 서로 다른 크기의 점 집합 (간단 성을 위해 2D)이 두 개의 서로 다른 크기의 사각형 안에 분산되어 있으면 다음과 같은 문제가 있습니다.

1- 큰 것을 통해 작은 것을 발견하는 방법?
2- 다음 그림과 같이 발생 순위를 매기는 방법에 대한 아이디어가 있습니까?

다음은 질문에 대한 간단한 데모와 원하는 해결책입니다. 여기에 이미지 설명을 입력하십시오


업데이트 1 :
다음 그림은 조사중인 문제에 대한 좀 더 현실적인 견해를 보여줍니다. 여기에 이미지 설명을 입력하십시오

주석과 관련하여 다음 속성이 적용됩니다.

  • 포인트의 정확한 위치를 사용할 수 있습니다
  • 정확한 크기의 포인트를 사용할 수 있습니다
    • 크기는 0 일 수 있습니다 (~ 1) = 포인트 만
  • 모든 점은 흰색 바탕에 검은 색입니다
  • 그레이 스케일 / 앤티 앨리어싱 효과가 없습니다

다음은 endolith약간의 작은 변화로 제시 된 방법의 구현입니다 (회전이 작고 빠르기 때문에 소스 대신 대상을 회전했습니다). 나는 이전에 그것에 대해 생각하고 있었기 때문에 'endolith'의 대답을 받아 들였습니다. RANSAC 소개 지금까지 경험이 없습니다. 또한 RANSAC를 구현하려면 많은 코드가 필요합니다. 여기에 이미지 설명을 입력하십시오


1
그러한 점을 일치시키는 솔루션이나 더 복잡한 그림을 찾고 있습니까? 사진에 몇 개의 점이있을 수 있습니까?

네, 매우 중요합니다. 알려진 크기의 점일 경우이를 최적화 할 수 있습니다. 당신이 통제하는 수탁자 마커라면, 그것을 최적화 할 수 있습니다. 이것을 사용하는 것에 대해 더 구체적으로하십시오.
endolith

내가 작업하고있는 문제의 경우, 더 작은 크기의 포인트 세트 (예 : <100)를 찾는 포인트 세트 (각 수백 포인트)가 있습니다. 위의 데모는 매우 간단하고 명확하지만 실제 문제는 복잡해 보입니다. 또한 원치 않는 점수를 기준으로 순위가 매겨진 경기를 찾는 데 관심이 있습니다.
개발자

1
검은 색과 흰색 점만 있습니까? 카메라 / 스캐너 / 다른 것에서 가져 왔습니까? 이진 값은 계산을 훨씬 빠르게 할 수 있습니다.
endolith

점의 중심을 찾거나 점의 위치를 ​​아는 큰 그림에서 미니어처를 찾는 데 문제가 있습니까?

답변:


17

이것은 최선의 해결책은 아니지만 그건 솔루션입니다. 더 나은 기술을 배우고 싶습니다.

회전하거나 크기를 조정하지 않을 경우 이미지의 간단한 상호 상관을 사용할 수 있습니다. 큰 이미지에서 작은 이미지가 발생할 때마다 밝은 피크가 나타납니다.

FFT 방법을 사용하여 상호 상관의 속도를 높일 수 있지만 작은 소스 이미지를 큰 대상 이미지와 일치시키는 경우 무차별 강제 곱셈 및 추가 방법이 더 빠를 수도 있습니다.

출처:

여기에 이미지 설명을 입력하십시오

목표:

여기에 이미지 설명을 입력하십시오

상호 상관 :

여기에 이미지 설명을 입력하십시오

두 개의 밝은 점은 일치하는 위치입니다.

그러나 당신은 어떻게 그 자체로 작동하지 않습니다, 그래서 당신의 예제 이미지 회전 매개 변수가 있습니다. 스케일링이 아닌 회전 만 허용되는 경우에도 상호 상관을 사용할 수 있지만 상호 상관, 소스 회전, 전체 대상 이미지와 상호 상관, 다시 회전 등을 수행해야합니다. 모든 회전.

이것은 반드시 이미지를 찾을 필요는 없습니다. 소스 이미지가 랜덤 노이즈이고 대상이 랜덤 노이즈 인 경우 정확히 직각으로 검색하지 않으면 이미지를 찾을 수 없습니다. 일반적인 상황에서는 아마도 찾을 수 있지만 이미지 속성과 검색 각도에 따라 다릅니다.

이 페이지 는 수행 방법의 예를 보여 주지만 알고리즘은 제공하지 않습니다.

합계가 임계 값을 초과하는 오프셋은 일치합니다. 소스 이미지를 자신과 연관시키고 모든 합계를이 숫자로 나누어서 일치의 양호도를 계산할 수 있습니다. 완벽하게 일치하는 것은 1.0입니다.

이것은 계산적으로 매우 무거울 것입니다. 그리고 도트 패턴을 일치시키는 더 좋은 방법이있을 것입니다 (알고 싶습니다).

회색조 및 FFT 방법을 사용하는 빠른 Python 예제 :

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 픽셀 씩 이동
    • 비트 AND 모든 겹치는 픽셀
    • 모든 1의 합계
  • ...

그레이 스케일 이미지를 이진으로 임계 값으로 만든 다음이 작업을 수행하면 충분합니다.

포인트 클라우드

소스와 대상이 모두 도트 패턴 인 경우 더 빠른 방법은 각 도트의 중심을 찾고 (알려진 도트와 한 번 상호 연관시킨 후 피크를 찾음) 포인트 세트로 저장 한 다음 소스를 일치시키는 것입니다. 두 세트에서 가장 가까운 점 사이에서 최소 제곱 오차를 회전, 변환 및 찾아서 대상으로 지정합니다.


1
맞습니다. 조사중인 문제에 대해서는 스케일링이 없지만 회전이 발생할 수 있습니다. 링크와 답변에 감사드립니다.
개발자

@Developer : 음, 그러면 효과가있을 것입니다.하지만 더 좋은 방법이있을 것입니다. 이진 이미지이면 상호 상관이 훨씬 빠릅니다. (바이너리 신호의 FFT와 같은 것이 있습니까?) 회전은 임의입니까? 1도 또는 5 도씩 증가하는 등 좋은 결과를 제공하는 일련의 회전 값을 실험해야합니다.
endolith

1
예, 이진 문제입니다. 또한 어딘가에서 진폭이 다른 긴 신호에서 변조 된 짧은 신호를 찾는 방법이 있다는 것을 기억합니다. 복잡성에 관계없이 선택 지점을 발생의 시작점으로 표시하는 것이 매우 효과적이라는 것을 기억합니다. 문제가 2D이므로 비슷한 개념을 사용하는 방법이 명확하지 않습니다. 이것은 2D에 적용되는 회전으로 인해 복잡합니다.
개발자

1
예, 회전의 자유를 추가 할 때는 불가능합니다. 이것이 RANSAC와 같은 방법이 개발 된 이유입니다. DSP 상자 밖에서 생각하는 것이 도움이된다고 생각합니다.
매트 M.

@MattM .: 작동합니다. 속도가 느립니다. :)
endolith

22

컴퓨터 비전 관점에서 : 기본 문제는 대상 포인트 세트와 대형 세트의 포인트 서브 세트 간의 호모 그래피 를 추정하는 것 입니다. 귀하의 경우 회전 만하면 아핀 호모 그래피가됩니다. RANSAC 방법을 조사해야합니다 . 많은 특이 치가있는 세트에서 일치하는 항목을 찾도록 설계되었습니다. 따라서 두 가지 중요한 키워드 인 호모 그래피RANSAC이 있습니다.

OpenCV는 이러한 솔루션을 계산하기위한 도구를 제공하지만 MATLAB을 사용할 수도 있습니다. 다음은 OpenCV를 사용한 RANSAC 예제 입니다. 그리고 또 다른 완전한 구현 .

일반적인 응용 프로그램은 그림에서 책 표지를 찾는 것입니다. 책 표지 사진과 테이블에 책 사진이 있습니다. 이 방법은 템플릿 일치를 수행하는 것이 아니라 각 이미지에서 두드러진 모서리를 찾아 해당 포인트 세트를 비교하는 것입니다. 문제는이 프로세스의 후반부처럼 보입니다. 큰 클라우드에서 설정 한 지점을 찾는 것입니다. RANSAC는이를 강력하게 수행하도록 설계되었습니다.

여기에 이미지 설명을 입력하십시오

데이터가 매우 깨끗하기 때문에 상호 상관 방법이 효과적 일 수 있습니다. 문제는 회전에 다른 자유도를 추가하면 방법이 매우 느려진다는 것입니다.


질문에 좀 더 자세한 내용을 추가했습니다. 나는 당신의 링크를 깊게 점검 할 것입니다. 그러나 빠른 인상은 그들이 다른 개념이라는 것입니다!
개발자

1
실제로 RANSAC / 호모 그래피 문제인 것 같습니다 :)
Matt M.

잘. 그것은 새로운 개념이었습니다. 최대한 빨리 시도하겠습니다. 내가 어려움에 직면하면, 위대하고지지하는 지역 사회 구성원들과 당신과 나눌 것입니다.
개발자

간단한 Q : RANSAC / 호모 그래피 방법을 3D 포인트 클라우드에 적용 할 수 있습니까?
개발자

이것은 유효한 솔루션이 아닙니다. 불행히도 질문에는 강도 정보가 포함되어 있지 않으므로 간단한 설명자 체계가 작동하지 않습니다. 문제는 그것보다 다소 기하학적입니다.
Tolga Birdal

3

패턴이 희소 이진 인 경우 이미지 대신 좌표 벡터의 간단한 공분산을 수행 할 수 있습니다. 하위 창에서 왼쪽으로 정렬 된 점의 좌표를 취하고 모든 좌표에서 벡터를 만들고 왼쪽에서 정렬 된 패턴의 점으로 구성된 벡터와의 공분산을 계산합니다. 가중치를 사용할 수도 있습니다. 그런 다음 큰 창에서 일부 그리드 (및 회전 각도의 그리드)에서 최대 공분산을 찾기 위해 가장 가까운 이웃에 대한 무차별 대입을 만듭니다. 검색을 통해 대략적인 좌표를 찾은 후 가중치를 최소화 한 최소 제곱 법으로 조정할 수 있습니다.

PS Idea는 이미지로 작업하는 대신 0이 아닌 픽셀의 좌표로 작업 할 수 있습니다. 가장 가까운 이웃 검색. 좌표와 썩음 각도의 일부 단계 인 그리드를 사용하여 병진 및 회전의 모든 검색 공간을 철저히 검색해야합니다. 각 좌표 / 각에 대해 해당 각도로 회전 된 좌표를 가진 중심이있는 창에서 픽셀의 서브 세트를 가져 와서 해당 좌표 (중심을 중심으로)를 취해 원하는 패턴의 픽셀 좌표와 비교합니다. 두 세트 포인트 모두에서 동일한 방식으로 정렬되었는지 확인해야합니다. 최소 차이 (최대 공분산)로 좌표를 찾습니다. 대략적인 일치 후에 일부 최적화 방법과 정확하게 일치하는 것을 찾을 수 있습니다. 그보다 더 간단하게 릴레이 할 수 없습니다.


1
당신의 아이디어에 대한 더 많은 설명이 담긴 예를 들어 주시겠습니까? 귀하의 답변의 현재 버전은 나에게 혼란 스럽습니다.
개발자

3

Generalized Hough Transform 제품군 의 아무도 언급 한 방법이없는 이유가 매우 놀랍습니다 . 그들은이 특정한 문제를 직접적으로 해결합니다.

여기 내가 제안하는 것이 있습니다.

  1. 템플릿을 가져 와서 템플릿 의 가장자리를 인덱싱하여 R 테이블을 만듭니다 . 내가 선택한 가장자리는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

  1. 일반화 된 Hough 변환 의 기본 OpenCV 구현을 사용하여 다음을 확보하십시오. 여기에 이미지 설명을 입력하십시오

일치하는 위치가 표시되어 있습니다. 이 방법은 이미지 강도가 필요하지 않기 때문에 가장자리가 단일 지점으로 축소 되더라도 동일한 방법이 여전히 작동합니다.

또한 Hough 구성표의 경우 회전 처리가 매우 자연 스럽습니다. 실제로 2D의 경우 누산기에 추가 된 차원 일뿐입니다. 만약 당신이 그것을 정말로 효율적으로 만드는 세부 사항에 들어가고 싶을 때 울리히는 그의 논문 에서 많은 트릭을 설명한다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.