如果您实际打开了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 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);