使用二进制掩码屏蔽RGB图像

时间:2013-09-14 20:38:46

标签: image matlab image-processing masking image-masking

我在读入的MATLAB中有一个RGB图像(M x N x 3矩阵)。我还有一个图像的二进制掩码(M x N矩阵),对于某些感兴趣的区域,它只有0和1在其他地方。

我正在试图弄清楚如何使用该二进制掩码屏蔽RGB图像。我已经尝试改变数据类型(使用double或uint8来查看结果是否有变化,但有时它们没有或我得到错误)并且我尝试使用各种函数,如conv2,immultiply,imfilter等等

我目前正在尝试将掩模单独应用(因为它的大小为M x N)到原始图像的每个R,G和B通道。在掩码为0的任何地方,我希望在原始图像中准确地为0,而在掩模为1的任何地方,我只想单独留下。

到目前为止,上述任何一项功能似乎都没有奏效。显然,我所知道的方法是有效的,如果我刚刚完成所有这一切的for循环,但由于MATLAB具有这些图像功能,这将是非常糟糕的,但我似乎无法让它们工作。

有时imfilter或immultiply(取决于我如何搞乱图像)将完全停止并崩溃MATLAB。有时候他们会快速完成,但我要么得到全白图像,要么得到全黑图像(通过imshow和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);

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

修改

发现以下作品:

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

1 个答案:

答案 0 :(得分: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);