我创建了一个双重图像的逻辑数组,基于像素是绿色的('components' => [
'cache' => [
'class' => 'yii\caching\MemCache',
],
'fileCache' => [
'class' => 'yii\caching\FileCache',
]
]
)有没有办法让我使用它和repmat以便将图像中的所有像素都填满绿色要求黑色
答案 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_green
与img2
的类型相同,因为在此特定方案中执行逐元素乘法之前需要这样做。
但是,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图像。