gpt4 book ai didi

image - Matlab 金字塔问题

转载 作者:太空宇宙 更新时间:2023-11-03 19:57:00 27 4
gpt4 key购买 nike

我在使用 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 的 header 来执行此操作:

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);

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com