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处的描述中,我看到了这两点:
- Order of X/Y arguments switched for 2d and 3d interpolate
- 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) 点的理解是查询值 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
.
我正在尝试使用 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处的描述中,我看到了这两点:
- Order of X/Y arguments switched for 2d and 3d interpolate
- 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) 点的理解是查询值 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
.