我试图用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。任何想法如何这个图像插值可能工作?
在您提供的链接的描述中,我可以看到这两点:
- 切换2d和3d插值的X/Y参数顺序
- 只接受一个标量查询值(我可能会在某个时候改变它,当我觉得它,或者如果我看到人们实际上关心它。并且想使用我的函数)
看完代码后,我对第(4)点的理解是输入图像应该调换。
我对第(5)点的理解是,查询值xo
和yo
必须是标量(所以你必须在循环中迭代图像)。
更重要的是,这个"文档"的懒惰和非正式性质我建议你在相信这段代码之前应该仔细考虑一下。
我发现几乎不可能相信在处理整个图像时,这可能比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
。