Matlab基于逻辑阵列将像素转为黑色

时间:2016-04-14 12:53:10

标签: image matlab image-processing

我创建了一个双重图像的逻辑数组,基于像素是绿色的('components' => [ 'cache' => [ 'class' => 'yii\caching\MemCache', ], 'fileCache' => [ 'class' => 'yii\caching\FileCache', ] ] )有没有办法让我使用它和repmat以便将图像中的所有像素都填满绿色要求黑色

2 个答案:

答案 0 :(得分:1)

您可以使用repmat执行此操作,但您应该使用bsxfun执行此操作。两者的想法是相同的,只是将每个像素的值乘以掩码中其对应像素的逻辑而不是。这将使值保持不变或使其为零:

img3 = bsxfun(@times, ~image_mark_green, img2)

答案 1 :(得分:1)

为了完整起见,使用repmat只需在第三维中复制img_mask_green,然后进行逐元素乘法:

img3 = img2 .* repmat(cast(~image_mark_green, class(img2)), [1 1 size(img2,3)]);

cast调用是必需的,因为img2很可能是无符号整数类型,而image_mark_green将是logical。执行转换以确保image_mark_greenimg2的类型相同,因为在此特定方案中执行逐元素乘法之前需要这样做。

但是,bsxfun更加优雅,您不必知道要在每个维度中复制多少元素,以便元素操作能够正常工作。

如果您愿意,您也可以避免使用repmat,并且可以单独拆分通道,使用该单个2D蒙版索引到每个通道,并将绿色到黑色的元素设置为一起,然后将所有元素合并在一起。此方法要求内存将每个通道临时存储在单独的变量中:

r = img2(:,:,1);
g = img2(:,:,2);
b = img2(:,:,3);
r(image_mask_green) = 0;
g(image_mask_green) = 0;
b(image_mask_green) = 0;
img3 = cat(3, r, g, b);

cat在所需维度中连接兼容大小的矩阵。在这种情况下,我们将第三维中的红色,绿色和蓝色通道连接起来,以创建用于显示和写入文件的RGB图像。