我在 matlab 的金字塔中遇到了问题。我试图保存一个二进制图像的缩小版本,以及这个二进制图像的两个缩小版本。在 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 像素,但 imyramid 无法做到这一点。如果我使用 imresize 调整这些图像的大小,它会通过放大和模糊图像来执行图像金字塔分解吗?我应该使用哪种方法(插值)来获得类似的结果?

最佳答案

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

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 的 header 来执行此操作:
function B = impyramid(A, direction, padding)

然后,在任何计算完成之前,你可以这样做:
if nargin == 2
    padding = false;
end

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

完成后,在 expand 语句的 if 部分,您可以执行以下操作:
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);

关于image - Matlab金字塔问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29265346/

10-11 18:46