2016-11-26 3 views
1

Я использую факел с некоторыми алгоритмами семантической сегментации для создания бинарной маски сегментированных изображений. Затем я хотел бы обрезать изображения на основе этой маски. Чтобы быть ясным, мне нужно обрезать его на пиксель. Это похоже на простую проблему, но единственное решение, которое я могу вызвать, состоит в том, чтобы либо инвертировать функцию draw mask, как и в Coco API, либо перебирать каждый пиксель в массиве и совместно маскировать пиксель на черный, если он не нужен. Я чувствую, что есть лучший способ сделать это. Библиотеки в Lua, Python, Go или C++ будут работать для меня. Есть идеи?Как обрезать изображение на основе двоичной маски

+0

использование findContours или извлечь все точки маски (вручную) и использовать функцию minBoundingRect. Затем используйте субимаж, чтобы получить обрезанное изображение. – Micka

ответ

3

Я реализовал это в Python, предполагая, что у вас есть входное изображение и маска, доступные в качестве объектов Mat. Учитывая, что 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

Вы можете использовать функцию boundingRect из opencv, чтобы получить интересующий прямоугольник, и вы можете обрезать изображение на этот прямоугольник. Реализация питона будет выглядеть примерно так:

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, который при умножении на каналы производит черный. Ответ Саранша также хорош, и он хорошо работает для открытия cv.

Смежные вопросы