2016-11-26 3 views
1

일부 의미있는 세그멘테이션 알고리즘과 함께 토치를 사용하여 분할 된 이미지의 바이너리 마스크를 생성합니다. 그 마스크를 기반으로 이미지를 자르고 싶습니다. 분명히하려면 픽셀 단위로 잘라야합니다. 그것은 간단한 문제처럼 보일 수 있지만 유일한 해결책은 Coco API에서와 같이 draw mask 함수를 반전하거나 배열의 각 픽셀을 반복하고 마스크가 필요없는 경우 검정색으로 설정하는 것입니다. 이렇게하는 더 좋은 방법이있는 것처럼 느껴집니다. Lua, Python, Go 또는 C++의 라이브러리가 저에게 효과적입니다. 어떤 아이디어?바이너리 마스크를 기반으로 이미지 자르기 방법

+0

사용 findContours 또는 (수동) 모든 마스크 포인트를 추출하고 minBoundingRect 기능을 사용합니다. 그런 다음 자른 이미지를 얻으려면 하위 이미지를 사용하십시오. – Micka

답변

3

입력 된 이미지와 마스크를 매트 오브젝트로 사용할 수 있다고 가정하고 파이썬에서 구현했습니다. 감안할 때 그 SRC1은 이미지와 src1_mask은 이진 마스크입니다 :

src1_mask=cv2.cvtColor(src1_mask,cv2.COLOR_GRAY2BGR)#change mask to a 3 channel image 
mask_out=cv2.subtract(src1_mask,src1) 
mask_out=cv2.subtract(src1_mask,mask_out) 

지금 mask_out 정의한 바이너리 마스크 안에있는 이미지 SRC1의 일부가 포함되어 있습니다.

-1

opencv의 boundingRect 기능을 사용하여 원하는 직사각형을 검색 할 수 있으며 이미지를 해당 직사각형으로자를 수 있습니다. 파이썬 구현은 다음과 같이 보일 것입니다 :

import numpy as np 
import cv2 

mask = np.zeros([600,600], dtype=np.uint8) 
mask[200:500,200:500] = 255     # set some values to 255 to represent an actual mask 
rect = cv2.boundingRect(mask)    # function that computes the rectangle of interest 
print(rect) 

img = np.ones([600,600, 3], dtype=np.uint8) # arbitrary image 
cropped_img = img[rect[0]:(rect[0]+rect[2]), rect[1]:(rect[1]+rect[3])] # crop the image to the desired rectangle 

대체 mask에게 img를 자신의

+0

불행히도 픽셀 당 자르기 솔루션이 필요합니다. – patrickbarker

2

와이에 실행 다른 사람을 위해. 토치 바이너리 마스크 텐서를 Double 유형으로 변환 한 다음 행렬의 cmul 함수를 사용하여 RGB 채널 각각에 대해 간단히 곱하면됩니다. 기본적으로 바이너리 마스크는 세그먼트 화 된 픽셀 대신에 1을 가지므로 값은 그대로 유지됩니다. 분할 영역 외부에있는 경우 0이 있으며 채널을 가로 지르면 검정색이됩니다. Saransh의 대답은 또한 좋으며 개방 된 cv에서도 잘 작동합니다. 마스크 옵션

관련 문제