2017-02-22 1 views
3

OpenCV와 Python을 사용하여 스티칭 프로그램을 만들고 현재 이미지를 바느질하고 있으며 이제 이들을 결합하려고합니다. 궁극적 인 목표는 그래프를 사용하여 더 잘 꿰매는 것입니다. 그러나 지금은 발견 된 동성을 기반으로 이미지를 겹치기 만합니다.OpenCV는 교차/겹침 영역을 결정합니다.

두 장의 이미지를 바느질 할 때의 현재 결과 사진입니다. enter image description here

내 목표는 중첩의 영역을 결정하고 I (즉 계층의 측면에서 상단의 하나입니다) 오른쪽 상단 이미지에 적용 할 수있는 마스크에 넣어 그래서에 기초를 혼합 할 수 것입니다 블렌더 opencv 또는 다른 알고리즘 중 하나를 사용하여 거리.

여기 내가 찾고있는 것을 시각적으로 보여줍니다. enter image description here

도움을 주시면 감사하겠습니다.

답변

3

둘 다 마스크/이진 이미지를 만들고 논리 AND를 사용하는 것이 어떻습니까?

각 이미지 (이미지 콘텐츠는 모두 1)의 회색 값 복사본을 각각 대상의 새로운 사본 (0으로 초기화 됨)으로 변환 할 수도 있습니다.

그런 다음 모든 대상 이미지를 추가합니다. 0이있는 영역은 덮개가 벗겨져 1이고, 2 to n2 to n 이미지의 대상이됩니다.

이것은 numpy의 방송 도구를 사용할 때 매우 쉽고 효율적입니다. 도움

import cv2 
import numpy as np 

#our target area (the black background) 
dst = np.zeros((100,100),dtype=np.int) 
src1 = dst.copy() 
src2 = dst.copy() 
src1[50:,50:] = 1 #fake of first translated image (row/col 50-end) 
src2[:70,:70] = 1 #fake of second translated image (row/col 0-70) 

overlap = src1+src2 #sum of both *element-wise* 

cv2.imwrite('a.png', src1*255) #opencv likes it's grey images span from 0-255 
cv2.imwrite('b.png', src2*255) #... 
cv2.imwrite('c.png', overlap*127) #here vals 0-2, *127 gives (almost) 255 again 

np.where(overlap==2) #gives you a mask with all pixels that have value 2 

SRC2 (b) (a) enter image description here = 오버랩 (c) enter image description here + SRC1 enter image description here

바란다.

+0

대단히 감사합니다. 나는이 개념을 이해하지만, 하나의 이미지 영역을 어떻게 규범화 하는가? 내 문제는 결과가 레이어/스티치 된 이미지는 여러 이미지가 아닌 단일 이미지입니다. –

+0

죄송합니다. 규범은 잘못된 이름입니다. 모든 픽셀 값을 1로 설정하면 트릭을 수행해야합니다. 나는 지금 내 answert를 확장하고있다 .. – RuDevel

+0

고마워.이 코드는 코드에서 하나의 작은 것을 제외하면 훌륭하게 작동한다. dst = np.zeros ((100,100), dtype = np.int)는 dst = np.zeros ((100,100), np.uint8) 여야합니다. 이 덕분에 정말 도움이되었습니다 –