Matlab分配1D切片的3D阵列

时间:2016-11-25 18:26:48

标签: matlab

如何在MATLAB中的3d数组中分配1维切片?

我有一个名为'CD'的逻辑2d数组,它对应于我想要设置的3-D图像矩阵(RGB格式)的像素。

git stash pop

所以在这种情况下,'CDM'是一个包含每个像素的R,G,B值的3d矩阵(例如,它是一个771x457x3矩阵)。

以上代码有效。它会生成我想要的红色像素图像。

但现在假设我想生成绿色或青色像素?如何访问“CDM”的第二个和第三个“层”(绿色和蓝色值)?我尝试过分配

CD = any(d, 3);
CDM(CD) = 255;

但这会返回错误

CDM(CD) = [0 255 255];

1 个答案:

答案 0 :(得分:2)

为了使用这样的2D数组修改每个通道,您需要获取每个通道(作为2D数组),然后使用2D逻辑阵列将所需的像素替换为所需的值,然后将其分配回来进入阵列。

green = CDM(:,:,2);
green(CD) = 255;
CDM(:,:,2) = green;

或者,您可以执行以下操作来对问题进行矢量化。

replace_color = [0 255 255];
CDM = bsxfun(@times, ~CD, CDM) + bsxfun(@times, CD, reshape(replace_color, [1 1 3]))

<强>解释

首先,我们使用bsxfun执行维度广播,并将CDM内的每个RGB像素与逻辑矩阵的逆(~)相乘。这会将1CD的所有像素设置为0,并将所有其他像素保留为原始值(因为它们乘以1)。

bsxfun(@times, ~CD, CDM)

然后我们将CD乘以新颜色(重新整形为1 x 1 x 3数组)以生成M x N x 3数组,其中每个RGB矢量CD为{{1}是所需的RGB值,所有其他值都是1

0

然后,我们将这两者结合起来,以便在bsxfun(@times, CD, reshape(replace_color, [1 1 3])) CD的任何地方保留RGB值,并在0CD的任何地方将RGB值替换为新值。

如果您使用的是R2016b或更高版本,则可以删除1并将解决方案简化为:

bsxfun