Matlab重塑回原始图像

Matlab reshape back into original image

我正在尝试将多维数组重塑为原始图像。我使用我找到的很好的解决方案 in this question:

将 512x512 像素的图像拆分为 8x8 像素的子矩阵
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 循环,但我不知道该怎么做。我知道存在函数 colfiltblockproc 但我不能使用它们。非常感谢任何帮助!

只需执行与您用于重塑原始数组的操作相反的操作。置换命令保持不变(切换第一维和第二维),而重塑命令返回到 512

reshaped_i_image = reshape(permute(reshape(permute(sub_images, [2 1 3]), 8, 512, []), [2 1 3]), 512, 512);

你可以用两个reshape's and one permute-

来解决
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