Matlab图像金字塔问题

4

我在使用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调整这些图像的大小,它会执行图像金字塔分解以进行放大和模糊处理吗?我应该使用哪种方法(插值)才能获得类似的结果?
1个回答

6
如果您实际打开impyramid并查看源代码,它会归结为一个imresize调用。具体来说,当您在调用impyramid时使用expand并且将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,这就是为什么每个维度都会少一个像素。函数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);

非常感谢您的回答。但是,我能否使用imresize将图像扩展回原始大小?效果是否相同,还是我需要使用不同的内核进行插值?或者效果不同? - mad
1
你可以使用imresize。这就是扩展选项的本质,但你需要确保使用正确的插值核函数。请再次阅读答案。 - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接