使用二进制蒙版遮罩 RGB 图像



我在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 具有这些图像功能,但我似乎无法让它们工作。

有时,不过滤或不可乘(取决于我如何处理图像)只会使 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);

====

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

编辑

发现以下工作:

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

你在那里滥用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);

相关内容

  • 没有找到相关文章

最新更新