Я использую факел с некоторыми алгоритмами семантической сегментации для создания бинарной маски сегментированных изображений. Затем я хотел бы обрезать изображения на основе этой маски. Чтобы быть ясным, мне нужно обрезать его на пиксель. Это похоже на простую проблему, но единственное решение, которое я могу вызвать, состоит в том, чтобы либо инвертировать функцию draw mask
, как и в Coco API, либо перебирать каждый пиксель в массиве и совместно маскировать пиксель на черный, если он не нужен. Я чувствую, что есть лучший способ сделать это. Библиотеки в Lua, Python, Go или C++ будут работать для меня. Есть идеи?Как обрезать изображение на основе двоичной маски
ответ
Я реализовал это в 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 изображений, расположенные внутри бинарной маски вы определили.
Вы можете использовать функцию 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
с вашим собственным
К сожалению, мне нужно решение для каждого пикселя – patrickbarker
Для тех, кто еще работает в этом. Мне посчастливилось преобразовать тензор бинарной маски факела в тип Double
, а затем просто умножить его, используя функцию факела cmul
против каждого из каналов RGB. В принципе, поскольку двоичная маска имеет 1
вместо сегментированного пикселя, тогда значение останется. Если он находится вне сегментации, он имеет 0
, который при умножении на каналы производит черный. Ответ Саранша также хорош, и он хорошо работает для открытия cv.
Использование OpenCV .copyTo с опцией маски
http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-copyto
- 1. Как обрезать изображение на основе неправильной формы?
- 2. Обрезать изображение с использованием маски
- 3. Обрезать изображение в PHP без маски
- 4. Как обрезать изображение на основе 2d массива
- 5. UIImageView изображения культур на основе UIView маски
- 6. Как обрезать изображение на кадр
- 7. Как обрезать изображение на Java?
- 8. Маска/обрезать изображение
- 9. Как обрезать изображение в php на основе распознавания лица
- 10. Как обрезать изображение на основе темных областей/шума?
- 11. Обрезать изображение на лету
- 12. Как обрезать изображение?
- 13. Как обрезать огромное изображение
- 14. PHP - Как обрезать изображение?
- 15. Как обрезать/обрезать изображение равномерно в ImageMagick?
- 16. Как обрезать это изображение?
- 17. Как обрезать фоновое изображение?
- 18. Как обрезать растровое изображение?
- 19. Как обрезать растровое изображение?
- 20. обрезать изображение на несколько прямоугольников
- 21. Libgdx обрезать изображение на круг
- 22. Обрезать изображение на квадрат - Android
- 23. C# изображение двоичной сериализация
- 24. Как я могу получить местоположение истинных биты двоичной маски
- 25. Обрезать изображение на поверхностиView android
- 26. Обрезать изображение на разных устройствах
- 27. Обрезать изображение на uibezierpath swift
- 28. Как обрезать NSString на основе графической ширины?
- 29. Как обрезать строку на основе размера PHP
- 30. CGImageGetColorSpace и изображение маски
использование findContours или извлечь все точки маски (вручную) и использовать функцию minBoundingRect. Затем используйте субимаж, чтобы получить обрезанное изображение. – Micka