Преобразование областей ограничивающей рамки в маски и сохранение их в виде файлов PNG

#python #opencv #image-processing #bounding-box

#python #opencv #обработка изображений #bounding-box

Вопрос:

У меня есть набор изображений с их значениями ограничивающей рамки, как показано ниже:

 image_names class   xmin    xmax    ymin    ymax
image1.png  1       260     361     45      184
  

Я хочу преобразовать эти значения ограничивающей рамки в маску, имеющую размеры ограничивающей рамки и заполненную белыми пикселями, и сохранить маски для каждого изображения в формате «image1_mask.png» и так далее. Есть ли у нас предопределенные функции для этого?

Комментарии:

1. Просто нарисуйте заполненный белым прямоугольник на черном фоновом изображении из двух диагонально противоположных углов (xmin, ymin) и (xmax, ymax). См . docs.opencv.org/4.1.1/d6/d6e /. … Черный фон см. в Numpy np.zeros() или np.zeros_like(). numpy.org/doc/stable/reference/generated/numpy.zeros_like.html

Ответ №1:

Сначала создайте пустое изображение того же размера, что и image1.png :

 import cv2
image = cv2.imread('image1.png', -1)
mask = image.copy()
mask[:] = 0
  

Затем используйте cv2.rectangle , чтобы нарисовать белый прямоугольник в пределах интересующих границ. К счастью, он принимает минимальные и максимальные горизонтальные и вертикальные координаты, которые определяют верхнюю левую и нижнюю правую границы прямоугольника.

 num_channels = 1 if len(mask.shape) == 2 else mask.shape[2]
cv2.rectangle(mask, (xmin, ymin), (xmax, ymax), color=(255,) * num_channels)
  

mask будет содержать белый прямоугольник в интересующей области. Обратите внимание, что в cv2.rectangle вызове я адаптировал это в зависимости от того, является ли входное изображение оттенками серого или цветным, поэтому вам не придется беспокоиться о преобразовании цвета в оттенки серого или наоборот.

Комментарии:

1. cv2.rectangle(.., thickness=-1) должно быть добавлено в случае, если прямоугольник должен быть заполнен

Ответ №2:

Простой подход

 import cv2
import numpy as np

img = cv2.imread('image1.png') # read image
mask = np.zeros((img.shape[0],img.shape[1]),dtype=np.uint8) # initialize mask
mask[ymin:ymax,xmin:xmax] = 255 # fill with white pixels
cv2.imwrite('image1_mask.png',mask) # save mask