2013-09-14 9 views
0

У меня есть изображение 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); 
+1

Я рад, что он работает. Однако преобразования типов действительно не нужны. – umlum

+0

Согласен. Исправлено это снова, так как im_old запускается как uint8, а двоичная маска - uint8. – Duane

ответ

5

Вы неправильно используете imfilter(). Imfilter используется для операций линейного фильтра, а не для маскировки или порогового значения. Лучше сделайте так:

z = image;   % image() is also a function. 
        % Overwriting this name should be avoided 

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

% Create 3 channel mask 
mask_three_chan = repmat(bw, [1, 1, 3]); 

% Apply Mask 
z(~mask_three_chan) = 0; 

% Display 
imshow(z); 
+0

Это, как ни странно, просто оставило изображение то же самое. – Duane

+0

Не так хорошо использовать 'image' как имя переменной. Есть функция с тем же именем, чтобы рано или поздно могли возникнуть проблемы. – umlum

+0

Прошу прощения, я не могу понять, как работает комментирование. Я предполагаю, что нет форматирования кода, и я не могу разместить его нигде, поскольку я не могу ответить на свой вопрос в настоящее время, ха. Что касается имени переменной, я согласен, я изменю его. – Duane