我在读入的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);
答案 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);