Mascarando uma imagem RGB com máscara binária

Eu tenho uma imagem RGB (M x N x 3 matriz) em MATLAB que eu li. Eu também tenho uma máscara binária (M x N matriz) para a imagem, que é simplesmente 0 para alguma região de interesse e 1 em qualquer outro lugar.

Eu estou tentando descobrir como mascarar a imagem RGB com essa máscara binária. Eu tentei mudar tipos de dados ao redor (trabalhando com double ou uint8 para ver se os resultados mudam, mas às vezes eles não ou eu recebo um erro) e eu tentei usar várias funções como conv2, immultiply, imfilter e assim por diante .

O que eu faço atualmente é tentar aplicar a máscara individualmente (como é o tamanho M x N) a cada canal R, G e B da imagem original. Em qualquer lugar que a máscara é 0, desejo fazer exatamente 0 na imagem original, enquanto em qualquer lugar a máscara é 1 eu só quero sair sozinho.

Nenhuma dessas funções acima parece ter funcionado até agora. Obviamente, o método que eu sei que irá funcionar é se eu acabei de passar e fiz um loop por tudo isso, mas isso seria terrível, já que o MATLAB tem essas funções de imagem, mas não consigo fazê-las funcionar.

Às vezes, imfilter ou immultiply (dependendo de como eu estou brincando com as imagens) só vai parar e derrubar o MATLAB completamente. Às vezes, eles terminam rapidamente, mas eu obtenho uma imagem toda branca ou uma imagem totalmente preta (por meio de imshow AND imagesc).

Verifiquei se meus canais de imagem correspondem ao tamanho da máscara e verifiquei os valores na imagem e na máscara e eles estão corretos. Eu simplesmente não consigo fazer com que a operação de mascaramento funcione.

Alguma idéia por favor? Talvez eu esteja perdendo alguma coisa nas regras do MATLAB?

Aqui está uma tentativa atual:

% NOTE: The code may not be "elegant" but I\'ll worry about optimization later.
%
% Setup image and size
image = imread(im);
[numrows, numcols, temp] = size(image); % not used currently

% Request user polygon for ROI
bw = roipoly(image);

% Set up the mask -- it is indeed all 0's and 1's
t = double(imcomplement(bw));

% "Mask" the image
z = double(image);    % Double to match up with t as a double
z(:, :, 1) = imfilter(z(:, :, 1), t);
z(:, :, 2) = imfilter(z(:, :, 2), t);
z(:, :, 3) = imfilter(z(:, :, 3), t);
imshow(z); figure; imagesc(z);

=================

EDITAR

Descobri que os seguintes trabalhos:

im_new = im_old .* repmat(mask, [1,1,3]);   % if both image and mask are uint8
imshow(im_new);

questionAnswers(1)

yourAnswerToTheQuestion