У меня есть изображение RGB (матрица M x N x 3) в MATLAB, в котором я читаю. У меня также есть бинарная маска (матрица M x N) для изображения, которая просто равна 0 для некоторого региона интереса и 1 везде.Маскирование изображения RGB с бинарной маской
Я пытаюсь выяснить, как замаскировать изображение RGB с помощью этой двоичной маски. Я попытался изменить типы данных вокруг (работая с double или uint8, чтобы увидеть, изменились ли результаты, но иногда они не возникают или я получаю сообщение об ошибке), и я попытался использовать различные функции, такие как conv2, immultiply, imfilter и т. Д. ,
В настоящее время я пытаюсь применить маску индивидуально (как размер M x N) к каждому каналу R, G и B исходного изображения. В любом случае, когда маска равна 0, я хочу сделать ровно 0 в исходном изображении, а где-то в маске 1, я просто хочу оставить в покое.
Ни одна из вышеперечисленных функций пока не работает. Очевидно, что метод, который я знаю, будет работать, если бы я просто прошел через все это, но это было бы ужасно, поскольку MATLAB имеет эти функции изображения, но я не могу заставить их работать.
Иногда imfilter или immultiply (в зависимости от того, как я возился с изображениями) просто остановится и полностью скроется MATLAB. Иногда они заканчиваются быстро, но я либо получаю белое изображение, либо все-черное изображение (через imshow AND imagesc).
Я проверил, чтобы мои каналы изображения совпадали с маской, и я проверил значения как по изображению, так и по маске, и они верны. Я просто не могу заставить операцию маскировки работать.
Любые идеи, пожалуйста? Может, мне что-то не хватает в правилах MATLAB?
Вот нынешняя попытка:
% 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);
=================
EDIT
Найдено, что следующие работы :
im_new = im_old .* repmat(mask, [1,1,3]); % if both image and mask are uint8
imshow(im_new);
Я рад, что он работает. Однако преобразования типов действительно не нужны. – umlum
Согласен. Исправлено это снова, так как im_old запускается как uint8, а двоичная маска - uint8. – Duane