我试图将多维数组重塑为原始图像。我使用我发现in this question的优秀解决方案在8x8像素的子矩阵中分割出512x512像素的图像:
sub_images = permute(reshape(permute(reshape(i_image, size(i_image, 1), n, []), [2 1 3]), n, m, []), [2 1 3]);
在这种情况下,n = m = 8,sub_images是8x8x4096的数组。现在问题是我想回到原始图像避免for循环但我不明白该怎么做。我知道存在函数colfilt
或blockproc
但我无法使用它们。非常感谢任何帮助!
答案 0 :(得分:1)
与您用于重塑原始数组的方法相反。置换命令保持不变(切换第一维和第二维),而重塑命令返回到512
reshaped_i_image = reshape(permute(reshape(permute(sub_images, [2 1 3]), 8, 512, []), [2 1 3]), 512, 512);
答案 1 :(得分:1)
out = reshape(permute(reshape(sub_images,n,m,512/n,512/m),[1 3 2 4]),512,[]);
这里需要注意的是permute
代价,必须尽可能避免。
下面列出的是针对目前列出的解决方案方法所述问题规模的运行时测试 -
i_image = rand(512,512);
n = 8; m = 8;
sub_images = permute(reshape(permute(reshape(i_image, size(i_image, 1), ...
n, []), [2 1 3]), n, m, []), [2 1 3]);
func1 = @() reshape(permute(reshape(sub_images,n,m,512/n,512/m),...
[1 3 2 4]),512,[]);
func2 = @() reshape(permute(reshape(permute(sub_images, [2 1 3]), ...
8, 512, []), [2 1 3]), 512, 512);
>> timeit(func1)
ans =
0.0022201
>> timeit(func2)
ans =
0.0046847