일부 의미있는 세그멘테이션 알고리즘과 함께 토치를 사용하여 분할 된 이미지의 바이너리 마스크를 생성합니다. 그 마스크를 기반으로 이미지를 자르고 싶습니다. 분명히하려면 픽셀 단위로 잘라야합니다. 그것은 간단한 문제처럼 보일 수 있지만 유일한 해결책은 Coco API에서와 같이 draw mask
함수를 반전하거나 배열의 각 픽셀을 반복하고 마스크가 필요없는 경우 검정색으로 설정하는 것입니다. 이렇게하는 더 좋은 방법이있는 것처럼 느껴집니다. Lua, Python, Go 또는 C++의 라이브러리가 저에게 효과적입니다. 어떤 아이디어?바이너리 마스크를 기반으로 이미지 자르기 방법
답변
입력 된 이미지와 마스크를 매트 오브젝트로 사용할 수 있다고 가정하고 파이썬에서 구현했습니다. 감안할 때 그 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의 일부가 포함되어 있습니다.
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
를 자신의
불행히도 픽셀 당 자르기 솔루션이 필요합니다. – patrickbarker
와이에 실행 다른 사람을 위해. 토치 바이너리 마스크 텐서를 Double
유형으로 변환 한 다음 행렬의 cmul
함수를 사용하여 RGB 채널 각각에 대해 간단히 곱하면됩니다. 기본적으로 바이너리 마스크는 세그먼트 화 된 픽셀 대신에 1
을 가지므로 값은 그대로 유지됩니다. 분할 영역 외부에있는 경우 0
이 있으며 채널을 가로 지르면 검정색이됩니다. Saransh의 대답은 또한 좋으며 개방 된 cv에서도 잘 작동합니다. 마스크 옵션
사용 OpenCV의 .copyTo
http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-copyto
사용 findContours 또는 (수동) 모든 마스크 포인트를 추출하고 minBoundingRect 기능을 사용합니다. 그런 다음 자른 이미지를 얻으려면 하위 이미지를 사용하십시오. – Micka