Image 用二值遮罩遮罩RGB图像

Image 用二值遮罩遮罩RGB图像,image,matlab,image-processing,masking,image-masking,Image,Matlab,Image Processing,Masking,Image Masking,我有一个RGB图像(M x N x 3矩阵)在MATLAB中,我读了进去。我还有一个用于图像的二进制掩码(M x N矩阵),对于某些感兴趣的区域,它只是0,而对于其他区域,它是1 我想知道如何用二值遮罩来遮罩RGB图像。我尝试过改变周围的数据类型(使用double或uint8查看结果是否改变,但有时它们不会改变,否则我会出错),并尝试使用各种函数,如conv2、immultiply、imfilter等等 我目前所做的是尝试将遮罩分别应用于原始图像的每个R、G和B通道(大小为M x N)。无论遮罩

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

我想知道如何用二值遮罩来遮罩RGB图像。我尝试过改变周围的数据类型(使用double或uint8查看结果是否改变,但有时它们不会改变,否则我会出错),并尝试使用各种函数,如conv2、immultiply、imfilter等等

我目前所做的是尝试将遮罩分别应用于原始图像的每个R、G和B通道(大小为M x N)。无论遮罩在哪里为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);

您在那里误用了
imfilter()
。Imfilter用于线性滤波操作,而不是掩蔽或阈值。最好这样做:

z=image;%image()也是一个函数。
%应避免覆盖此名称
%为ROI请求用户多边形
bw=roipoly(z);
%创建3通道掩码
mask_three_chan=repmat(bw[1,1,3]);
%涂口罩
z(~mask_三_chan)=0;
%展示
imshow(z);

您在那里误用了
imfilter()
。Imfilter用于线性滤波操作,而不是掩蔽或阈值。最好这样做:

z=image;%image()也是一个函数。
%应避免覆盖此名称
%为ROI请求用户多边形
bw=roipoly(z);
%创建3通道掩码
mask_three_chan=repmat(bw[1,1,3]);
%涂口罩
z(~mask_三_chan)=0;
%展示
imshow(z);

有趣的是,它使图像保持完全相同。使用
image
作为变量名不太好。有一个同名函数,所以迟早可能会引起麻烦。对不起,我在摸索,因为我不太明白注释是如何工作的。我猜没有代码格式,我不能把它放在任何地方,因为我现在不能回答我自己的问题,哈。至于变量名,我同意,我会更改它。是的,所以人们希望将所有讨论保持在最低限度。这就是评论如此有限的原因。有趣的是,这使得图像完全相同。使用
image
作为变量名不是很好。有一个同名函数,所以迟早可能会引起麻烦。对不起,我在摸索,因为我不太明白注释是如何工作的。我猜没有代码格式,我不能把它放在任何地方,因为我现在不能回答我自己的问题,哈。至于变量名,我同意,我会更改它。是的,所以人们希望将所有讨论保持在最低限度。这就是评论如此有限的原因。我很高兴它能起作用。不过,实际上并不需要进行类型转换。再次修复了这个问题,因为im_old从uint8开始,二进制掩码也是uint8。我很高兴它能工作。不过,实际上并不需要进行类型转换。再次修复了这个问题,因为im_old从uint8开始,二进制掩码也是uint8。