Удалить массив numpy False / True из массива numpy - PullRequest
1 голос
/ 05 марта 2020

У меня есть массив изображений

img = [[[63  48  27]
  [ 63  48  27]
  [ 63  48  27]
  ...
  [117  88  70]
  [113  84  66]
  [111  82  64]]

 [[ 64  49  28]
  [ 64  49  28]
  [ 64  49  28]
  ...
  [117  88  70]
  [114  85  67]
  [111  82  64]]

 [[ 65  50  29]
  [ 66  51  30]
  [ 66  51  30]
  ...
  [118  89  71]
  [114  85  67]
  [111  82  64]]...

И еще один массив пикселей, которые я хочу сохранить в этом массиве изображений:

mask = [[[False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]
  ...
  [False False False ... False False False]
  [False False False ... False False False]
  [False False False ... False False False]]]

Я думал, что смогу просто сделать img[mask] но я получаю boolean index did not match indexed array along dimension 0; dimension is 549 but corresponding boolean dimension is 1. Как я могу либо расширить массив масок обратно до нужного измерения, это происходит от преобразования маски детеррон2 в numpy массив mask = outputs['instances'].pred_masks.numpy() (изначально это тензор). Или, и это может быть проще, я думаю, если значение в массиве маски numpy равно False, тогда преобразуйте элемент в массиве изображения в белый / 255.

Я использую функцию:

from matplotlib.image import imread
import scipy.misc


def cropper(org_image_path, mask_array, out_file_name):
    img = imread(org_image_path)
    output = img[mask_array]
    scipy.misc.toimage(output).save(out_file_name)

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Учитывая изображение формы (M, N, 3) и маску формы (1, M, N), вы можете установить элементы False изображения на 255 во всех каналах, используя простое логическое индексирование. В то время как вещание выстраивает индексы справа, индексирование заполняет их слева. Это означает, что для того, чтобы маска соответствовала размерам вашего изображения, вам нужно удалить первую ось. Есть несколько способов сделать это:

mask = mask[0]
mask = mask[0, ...]
mask = mask.squeeze()
mask = np.squeeze(mask)
mask = mask.reshape(mask.shape[1:])
mask = np.reshape(mask, mask.shape[1:])
...

Когда первые два измерения совпадают, вы можете отменить маску и выполнить прямое назначение:

img[~mask] = 255

Это может быть объединены в простой однострочник:

img[~mask[0]] = 255
0 голосов
/ 05 марта 2020

Для тех, кто заинтересовался, комментарий Николаса был полезным ударом (спасибо) - просто изменил массив масок, чтобы он был на той же оси и той же форме. Тогда было просто простое редактирование для изменения значений:

from matplotlib.image import imread
import scipy.misc
from PIL import Image  

def cropper(org_image_path, mask_array, out_file_name):
        img = imread(org_image_path)
        mask_array = np.moveaxis(mask_array, 0, -1)
        mask_array = np.repeat(mask_array, 3, axis=2)
        output = np.where(mask_array==False, 255, img)
        im = Image.fromarray(output)
        im.save(out_file_name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...