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