Matlab中的图像插值与J. Wu的快速线性插值法

Image interpolation in Matlab with J. Wu's fast linear interpolation method

我正在尝试使用 Jeffrey Wu 1 的快速线性插值方法对图像进行插值,但它失败了。 Matlab标准方法是

    [h_i, w_i, d_i] = size(img);
    [xi, yi] = meshgrid(linspace(0, w_i-1, w_i), linspace(0, h_i-1, h_i));
    p2p = zeros(size(yo,1), size(xo,2), 3, 'uint8');
    for k = 1:d_i; p2p(:,:,k) = interp2(xi, yi, img(:,:,k), xo, yo); end

但是当切换到(Wu: function v = lininterp2(X, Y, V, x, y))

for k = 1:d_i; p2p(:,:,k) = lininterp2(xi, yi, img(:,:,k), xo, yo); end

我收到由

引起的错误[length(X), length(Y)] does not match size(V)
if ((length(X) ~= size(V, 1)) || (length(Y) ~= size(V, 2))),
error('[length(X), length(Y)] does not match size(V)'); end

大小相等 hX = hY = hV; wX = wY = wV; dX = dY = dV; 但因为 X,Y (xi,yi) 是网格,它们的长度(不是 h 或 w)肯定大于相应图像通道 V 的 h 或 w。知道这是怎么回事吗图像插值可能有用吗?

在你提供的link处的描述中,我看到了这两点:

  1. Order of X/Y arguments switched for 2d and 3d interpolate
  2. Only takes a scalar query value (I will change this sometime perhaps, when I feel like it, or if I see that people actually care and want to use my function)

看了代码,我对第(4)点的理解是输入图像要转置

我对第 (5) 点的理解是查询值 xoyo 必须是标量(因此您必须在循环中迭代图像)。

更重要的是,这个“文档”的懒惰和非正式性质告诉我,在信任这个代码之前你应该仔细考虑。

我发现几乎不可能相信这在处理整个图像时会比 interp2 更快。它通过双线性插值从字面上计算单个像素值:

v = V(pindexx, pindexy) * (1 - slopex) * (1 - slopey) + V( indexx, pindexy) * slopex * (1 - slopey) ... 
  + V(pindexx,  indexy) * (1 - slopex) *       slopey + V( indexx,  indexy) * slopex *       slopey ;

因此,我可以想象这对于计算单个像素值(或者可能是一小部分)会更快,但我看不到任何性能优化的尝试。因此,如果您的图像尺寸超过几个像素,那么我什至不会考虑使用 lininterp2.