我在 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 2N
或 2M - 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/