【问题标题】:Image interpolation in Matlab with J. Wu's fast linear interpolation method使用 J. Wu 的快速线性插值法在 Matlab 中进行图像插值
【发布时间】:2021-05-17 13:13:14
【问题描述】:

我正在尝试使用 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。知道这个图像插值如何工作吗?

【问题讨论】:

    标签: matlab image-processing interpolation


    【解决方案1】:

    在您提供的链接的描述中,我可以看到这两点:

    1. 为 2d 和 3d 插值切换 X/Y 参数的顺序
    2. 只接受一个标量查询值(我可能会在某个时候改变它,当我喜欢它时,或者如果我看到人们真正关心它 并想使用我的功能)

    看了代码,我对第(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

    【讨论】:

    • 非常感谢您的洞察力,我不会跟进。我之所以被吸引,是因为它承诺更快的插值和文件交换页面上的非常好的反馈,但没有任何消息说它不能用于图像插值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2016-01-09
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多