我有一个二维矩阵,其元素表示可以进行颜色映射并表示为图像的数据。我想插入它们,但是我在一些无法解释的边界上会出现奇怪的行为。
这是原始图像,插值例程的3次迭代后的图像,以及10次插值迭代后的图像。
这是我的代码:
close all
ifactor = 0.9; % Interpolation factor
% Cut out the meaningless stuff at the edges
bshift_i = bshift(1:16, 1:50);
[m, n] = size(bshift_i);
% Plot the initial data using colormapping
figure()
imagesc(bshift_i, [7.5 10.5])
colorbar()
% Main processing loop
for ii = 1:10
% Every iteration, we generate a grid that has the same size as the
% existing data, and another one that whose axis step sizes are
% (ifactor) times smaller than the existing axes.
[b_x, b_y] = meshgrid(1:ifactor^(ii - 1):n, 1:ifactor^(ii - 1):m);
[b_xi, b_yi] = meshgrid(1:ifactor^ii:n, 1:ifactor^ii:m);
% Interpolate our data and reassign to bshift_i so that we can use it
% in the next iteration
bshift_i = interp2(b_x, b_y, bshift_i, b_xi, b_yi);
end
% Plot the interpolated image
figure()
imagesc(bshift_i, [7.5 10.5])
colorbar()
我主要想知道为什么会出现底部和右边的蓝色瑕疵,如果出现这种情况,我该如何解决/避免它们。
答案 0 :(得分:1)
问题在于如何定义插值的x
和y
范围
我们来看看1:ifactor^(ii - 1):m
:
1
到16
。 1
到15.4
1
到15.58
这足以说明问题。通过第二次迭代,一切都很好,因为上面的插值边界在值范围内。但是,对于第三次迭代,您的上限现在超出了值范围(15.58 > 15.4
)
interp2
未进行推断,它返回NaN
(在第3次迭代后,bshift_i(end,end)
为NaN
)。这些NaN
被绘制为0
,因此为蓝色。
要解决此问题,您必须确保x
和y
范围始终包含最后一个值。一种方法可以是:
[b_x, b_y] = meshgrid(linspace(1,n,n./(ifactor^(ii - 1))), ...
linspace(1,m,m./(ifactor^(ii - 1))));
[b_xi, b_yi] = meshgrid(linspace(1,n,n./(ifactor^(ii))), ...
linspace(1,m,m./(ifactor^(ii))));
linspace
始终包含第一个和最后一个元素。但是,第三个输入不增量,而是元素数。这就是为什么你必须调整这个条件以适应你的方法。