【问题标题】:Matlab impyramid issueMatlab金字塔问题
【发布时间】:2015-03-26 04:40:56
【问题描述】:

我在使用 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 像素,但 impyramid 无法做到这一点。如果我用 imresize 调整这些图像的大小,它会通过放大和模糊图像来执行图像金字塔分解吗?我应该使用哪种方法(插值)来获得类似的结果?

【问题讨论】:

    标签: image matlab image-processing computer-vision


    【解决方案1】:

    如果你真的打开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);
    

    【讨论】:

    • 非常感谢您的回答。但是,我可以使用 imresize 将图像扩展回原始大小吗?效果是一样的还是我应该使用不同的内核来进行插值?还是效果不一样?
    • 您可以使用 imresize 是的。这就是扩展选项归结为的原因,但您需要确保使用正确的插值内核。再次阅读答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多