Matlab 金字塔问题

Matlab impyramid issue

我在使用 matlab 的 impyramid 中遇到问题。我正在尝试保存一个二进制图像的缩小版本以及该二进制图像的两个缩小版本。在 matlab 中很简单,如下代码所示:

scale1_2= impyramid(compressed_image, 'reduce');
scale1_4= impyramid(scale1_2, 'reduce');

因此,一张尺寸为 810x1080 的图像以 405x540 和 203x270 像素保存。我面临的问题是当我尝试将这两个图像扩展回具有与以前相同的尺寸时。

scaled_result1_2=impyramid(scale1_2,'expand');
scaled_result1_4=impyramid(impyramid(scale1_4,'expand'), 'expand');

因此,scaled_result1_2 和 scaled_result1_4 应该是 810x1080 图像,但不是:

>>size(scaled_result1_2)
     809        1079
>>size(scaled_result1_4)
     809        1077

我需要这两张图片再次具有相同的 810x1080 像素,但 impyramid 无法做到这一点。如果我使用 imresize 调整这些图像的大小,它会通过放大和模糊图像来执行图像金字塔分解吗?我应该使用哪种方法(插值)来获得类似的结果?

如果你真的打开 impyramid 并查看源代码,它归结为一个 imresize 调用。具体来说,当 A 被定义为图像时调用 impyramid 时使用 expand 时会发生这种情况:

M = size(A,1);
N = size(A,2);
scaleFactor = 2;
outputSize = 2*[M N] - 1;
kernel = makePiecewiseConstantFunction( ...
    [1.25   0.75    0.25   -0.25   -0.75   -1.25   -Inf], ...
    [0.0    0.125   0.5     0.75    0.5    0.125    0.0]);
kernelWidth = 3;

B = imresize(A, scaleFactor, {kernel, kernelWidth}, ...
    'OutputSize', outputSize, 'Antialiasing', false);

如您所见,outputSize 定义为图像尺寸的两倍减去 1,这就是每个尺寸偏离 1 个像素的原因。函数 makePiecewiseConstantFunction 是在 impyramid 中定义的局部函数。我会让你打开它自己看看。确保在调用上面的代码之前定义了它。

因此,只需去掉1的减法即可实现你想要的。

这样调用上面的代码,但是把outputSize改成:

outputSize = 2*[M N];

不过,如果你喜欢冒险,你可以自己修改这个源代码来接受一个标志,如果你将它设置为 true,它不会减去 1 和 false 执行减法。因此,可以修改impyramid的表头来实现:

function B = impyramid(A, direction, padding)

然后,在任何计算完成之前,您可以这样做:

if nargin == 2
    padding = false;
end

这允许您在没有第三个参数的情况下调用 impyramid,这将默认为无填充。

完成后,在 if 语句的 expand 部分,您可以:

else
    scaleFactor = 2;
    outputSize = 2*[M N];
    if ~padding %// Change
        outputSize = outputSize - 1;
    end
    kernel = makePiecewiseConstantFunction( ...
        [1.25   0.75    0.25   -0.25   -0.75   -1.25   -Inf], ...
        [0.0    0.125   0.5     0.75    0.5    0.125    0.0]);
    kernelWidth = 3;
end

嵌套的 if 语句然后检查您是否要允许输出图像的大小为 2M x 2N2M - 1 x 2N - 1。因此,当您修改完代码后,您可以:

scaled_result1_2 = impyramid(scale1_2, 'expand', true);
scaled_result1_4 = impyramid(impyramid(scale1_4,'expand', true), 'expand', true);