如何在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];
答案 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像素与逻辑矩阵的逆(~
)相乘。这会将1
中CD
的所有像素设置为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值,并在0
为CD
的任何地方将RGB值替换为新值。
如果您使用的是R2016b或更高版本,则可以删除1
并将解决方案简化为:
bsxfun