2017-09-17 1 views
0

저는 OpenCV와 Python을 사용하여 이미지 작업을 수행해 왔습니다. 저는 관심있는 윤곽을 분리 할 수있었습니다. 이제 두 개의 이미지, 하나의 NDVI 이미지 및 하나의 일반 이미지가 있습니다. 마스크 두 개를 병합하고 싶습니다. 따라서 마스크의 픽셀 위치가 0이면 이미지 1의 픽셀을 사용해야하고 마스크의 픽셀 위치가 1이면 이미지 2의 픽셀을 사용해야합니다. 이를 바탕으로 두 장의 사진을 병합하고 싶습니다.OpenCV와 마스크를 사용하여 이미지 병합

모든 의견을 부탁드립니다 :)!

+0

'Mat :: copyTo' 메서드를 사용하십시오. 그러나 두 이미지가 동일한 크기 여야하거나 ROI 마법을 써야합니다. – zindarod

+0

아마도이 질문을 확인하십시오. https://stackoverflow.com/questions/41572887/equivalent-of-copyto-in-python-opencv-bindings – zeFrenchy

답변

1

이것은 매우 쉽게 numpy indexing by mask입니다.

여기에는 여러 가지 방법이 있습니다. 예를 들어 두 개의 플로트 이미지가 있습니다. 그런 다음 부울 마스크를 만듭니다 (이 경우 무작위 부동 이미지를 찍은 다음 약 절반의 픽셀이 포함되며 절반은 제외됩니다).

>>> import numpy as np 
>>> img1 = np.random.rand(100,100,3) 
>>> img2 = np.random.rand(100,100,3) 
>>> mask = np.random.rand(100,100)>.5 
>>> comb_img = img2.copy() 
>>> comb_img[mask] = img1[mask] 

그래서 mask는 모든 점에서 분명하기 : 그런 결합 된 이미지에는 마스크 True 당신이 다른 이미지의 값을 삽입 할 위치에 관계없이 다음 동일 이미지 중 하나에 설정하고 있습니다 True 인 경우이 comb_imgimg1의 값을 가지며 그렇지 않은 경우 값은 img2입니다.

더 명확한 두 이미지를 결합 할 수있는 또 다른 방법은 결합 된 이미지를 먼저 빈 이미지로 만든 다음 마스크 지점에 하나의 이미지를 삽입하고 반전 된 마스크 지점에 다른 이미지를 삽입하는 것입니다. 부울 numpy 배열 ~에 대한

>>> comb_img = np.zeros_like(img1) 
>>> comb_img[mask] = img1[mask] 
>>> comb_img[~mask] = img2[~mask] 

그리고 넣다 당신이 그것을 보지 못했다는, 그것을 반전 : 물론

>>> ~np.array([True, False, True]) 
array([False, True, False], dtype=bool) 

마스크는 숫자 일 수 있고, 당신은 그냥 사용할 수 있습니다 mask==0mask>0을 사용하여 인덱싱을위한 논리 배열을 만듭니다.

관련 문제