Maskieren eines RGB-Bildes mit Binärmaske

Ich habe ein RGB-Bild (M x N x 3-Matrix) in MATLAB, das ich eingelesen habe. Ich habe auch eine Binärmaske (M x N-Matrix) für das Bild, die für einen interessierenden Bereich einfach 0 und für einen anderen Bereich 1 ist.

Ich versuche herauszufinden, wie man das RGB-Bild mit dieser Binärmaske maskiert. Ich habe versucht, die Datentypen zu ändern (entweder mit double oder uint8, um festzustellen, ob sich die Ergebnisse ändern, aber manchmal nicht oder ich erhalte einen Fehler), und ich habe versucht, verschiedene Funktionen wie conv2, immultiply, imfilter und so weiter zu verwenden .

Derzeit versuche ich, die Maske einzeln (in der Größe M x N) auf jeden R-, G- und B-Kanal des Originalbilds anzuwenden. Überall dort, wo die Maske 0 ist, möchte ich im Originalbild genau 0 machen, wohingegen die Maske 1 ist. Ich möchte sie einfach in Ruhe lassen.

Keine der oben genannten Funktionen schien bisher zu funktionieren. Die Methode, von der ich weiß, dass sie funktionieren wird, ist, wenn ich all dies nur durchlaufen und eine for-Schleife durchlaufen habe. Das wäre schrecklich, da MATLAB diese Bildfunktionen hat, aber ich kann sie scheinbar nicht zum Laufen bringen.

Manchmal kommt es vor, dass imfilter oder immultiply (je nachdem, wie ich mit den Bildern rumspiele) einfach zum Stillstand und MATLAB zum Absturz bringt. Manchmal sind sie schnell zu Ende, aber ich erhalte entweder ein ganz weißes oder ein ganz schwarzes Bild (sowohl durch imshow als auch durch imagesc).

Ich habe überprüft, ob meine Bildkanäle in der Größe mit der Maske übereinstimmen, und ich habe die Werte sowohl im Bild als auch in der Maske überprüft und sie sind korrekt. Ich kann die eigentliche Maskierungsoperation einfach nicht zum Laufen bringen.

Irgendwelche Ideen bitte? Vielleicht fehlt mir etwas in den MATLAB-Regeln?

Hier ist ein aktueller Versuch:

% 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);

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

BEARBEITEN

Fand heraus, dass die folgenden Arbeiten:

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage