整个答案仅适用于问题的原始形式。
假设您可以将所有二进制矩阵组合成一个大的 n×m×256 矩阵binaryimage(x,y,greyvalue)
。然后你可以计算你的最终图像
newimage=sum(bsxfun(@times,binaryimage,reshape(0:255,1,1,[])),3)
这里的魔法是由 bsxfun 完成的,它将 3D (nxmx 256) 二进制图像与包含灰度值 0...255 的 1 x 1 x 256 向量相乘。这将生成一个 3D 图像,其中对于固定的 x 和 y,向量 (y,x,:) 包含许多零,并且(对于G
二进制图像包含 a的一个灰度值1
)它包含值G
。所以现在你只需要对这个第三维求和就可以得到一张n x m
图像。
更新
为了测试它是否正常工作,让我们先换一种方式:
fullimage=floor(rand(100,200)*256);
figure;imshow(fullimage,[0 255]);
是一个随机灰度图像。您可以像这样计算 256 个二进制矩阵:
binaryimage=false([size(fullimage) 256]);
for i=1:size(fullimage,1)
for j=1:size(fullimage,2)
binaryimage(i,j,fullimage(i,j)+1)=true;
end
end
我们现在可以应用我上面给出的解决方案
newimage=sum(bsxfun(@times,binaryimage,reshape(0:255,1,1,[])),3);
并验证我是否返回了原始图像:
all(newimage(:)==fullimage(:))
这给出了1
(真):-)。
更新 2
你现在提到你的二进制图像在一个单元格数组中,我假设binimg{1:256}
每个单元格都包含一个 nxm 二进制数组。如果可以的话,更改生成此数据的代码以创建我在上面使用的 3D 二进制数组可能是有意义的 - 如果不同的单元格包含不同类型、形状或大小的数据,则单元格最有用。
如果有充分的理由坚持使用元胞数组,您可以使用将其转换为 3D 数组
binaryimage = reshape(cell2mat(reshape(binimg,1,256)),n,m,256);
和上面使用n
的m
一样。如果你已经有内部重塑是不必要的size(binimg)==[1 256]
。所以总结一下,你需要使用你的单元格数组binimg
来计算 3D 矩阵二进制图像,然后你可以用它来计算newimage
你有兴趣使用我的答案开头的代码。
希望这可以帮助...