Проблема применения бинарной маски к изображению RGB с numpy - PullRequest
2 голосов
/ 18 октября 2019

Я пытаюсь применить бинарную маску к изображению RGB с numpy

Я нашел это https://stackoverflow.com/a/26843467/4628384, но у меня пока нет прав на добавление комментария. Во всяком случае, я сталкиваюсь с проблемой;Любая помощь очень ценится.

def masktoRGB(self,image,image_mask):

        # create mask with same dimensions as image
        mask = np.zeros_like(image)
        # copy your image_mask to all dimensions (i.e. colors) of your image
        for i in range(3):
            mask[:,:,i] = image_mask.copy()

        # apply the mask to your image

        # tried to swap axes, not a solution 
        #image = image.swapaxes(0,1)
        #this gives the error:
        masked_image = image[mask]

        print(mask.shape)
        print(image.shape)
        print(image_mask.shape)



        return masked_image

это дает мне:

IndexError: индекс 213 выходит за пределы для оси 0 с размером 212

вывод на печать:

(188, 212, 3) (188, 212, 3) (188, 212)

image и image_mask - это одно и то же изображение, за исключением того, что первое - RGB, а второе - режим L

1 Ответ

3 голосов
/ 19 октября 2019

Попробуйте использовать широковещание и умножение:

image * image_mask[..., None]

Я предполагаю, что типом image_mask является bool, который отображается на числа 0 и 1. Поэтому при парном умножении изображения и маски установит маскированные значения на ноль.

Подобный эффект может быть достигнут с помощью np.where () или & operator.

Проблема в том, что формы image и image_mask несовместимы. Numpy сначала добавит дополнительные размеры в начало фигуры, пока оба тензора не будут иметь одинаковую форму. Таким образом, image_mask преобразуется из (188, 212) в (1,188, 212). Эта новая форма не совместима с формой изображения (188, 212, 3).

Хитрость заключается в том, чтобы изменить форму image_mask с помощью необычной индексации. Вы можете использовать None в качестве индекса, чтобы добавить фиктивное измерение размера 1 в конце фигуры. Операция image_mask [..., None] изменит ее с (188, 212) на (188, 212,1).

Правила вещания говорят о том, что измерения размера 1 расширяются путем повторения всех значений по измерению вещания. ,Таким образом, numoy автоматически изменит тензир с (188, 212,1) на (188, 212,3). Операция выполняется очень быстро, потому что копия не создается.

Теперь можно умножить тизеры, чтобы получить желаемый результат.

...