我在 MATLAB 中读入了一个 RGB 图像(M x N x 3 矩阵)。我还有一个图像的二进制掩码(M x N 矩阵),对于某些感兴趣的区域来说它只是 0,而其他地方都是 1。
我正在尝试找出如何使用该二进制掩码来掩蔽 RGB 图像。我尝试过更改数据类型(使用 double 或 uint8 来查看结果是否改变,但有时它们不会改变,或者我收到错误)并且我尝试过使用各种函数,例如 conv2、immultiply、imfilter 等。
我目前所做的就是尝试将遮罩单独应用到原始图像的每个 R、G 和 B 通道(因为它的大小为 M x N)。任何掩码为 0 的地方,我都希望在原始图像中恰好为 0,而任何掩码为 1 的地方我只想不管。
到目前为止,上述功能似乎都不起作用。显然,我知道可行的方法是,如果我只是完成并执行所有这些操作,但这将是可怕的,因为 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);
=================
EDIT
发现以下工作有效:
im_new = im_old .* repmat(mask, [1,1,3]); % if both image and mask are uint8
imshow(im_new);