精华内容
下载资源
问答
  • 常用三种插值算法

    万次阅读 2019-05-27 16:18:18
    在做数字图像处理时,经常会碰到小数象素坐标的取值问题,这时就需要... 这是简单的一种插值方法,不需要计算,在待求象素的四邻象素中,将距离待求象素最近邻的像素灰度赋给待求象素。设为待求象素坐标(x+u,y+v) ...

           在做数字图像处理时,经常会碰到小数象素坐标的取值问题,这时就需要依据邻近象素的值来对该坐标进行插值。比如做图像的几何校正,也会碰到同样的问题。

    1、最近邻插值法(Nearest Neighbour Interpolation)

          这是最简单的一种插值方法,不需要计算,在待求象素的四邻象素中,将距离待求象素最近邻的像素灰度赋给待求象素。设为待求象素坐标(x+u,y+v) ,【注:x,y为整数, u,v为大于零小于1的小数】则待求象素灰度的值 f(x+u,y+v)为 ,选取距离插入的像素点(x+u, y+v)最近的一个像素点,用它的像素点的灰度值代替插入的像素点。

    特点:最近邻插值法虽然计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

    2、双线性插值

    双线性插值,顾名思义,在像素点矩阵上面,x和y两个方向的线性插值所得的结果。那么先看看一维线性插值:

                                                     
                    

    对于二维图像:

                                                

    先在x方向上面线性插值,得到R2、R1像素值:

                     
    然后以R2,R1在y方向上面再次线性插值。

    本质:根据4个近邻像素点的灰度值做2个方向共3次线性插值

    特点:双线性内插法的计算比最邻近点法复杂,计算量较大,但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。

    3、双三次插值

          在数值分析这个数学分支中,双三次插值是二维空间中最常用的插值方法。在这种方法中,函数f 在点 (x, y) 的值可以通过矩形网格中最近的十六个采样点的加权平均得到,在这里需要使用两个多项式插值三次函数,每个方向使用一个。

                                        

    双三次插值计算公式:

    , 这个a(i, j)便是加权系数了,所以关键是要把它求解出来。

    求解加权系数的公式如下:
       

    其中,a取-0.5,BiCubic函数形状如下:

                                       

                           

    特点:三次多项式插值法插值精度高,具有更EI平滑的边缘,图像损失质量低,但是计算量较大。

    对于二维医学图像插值需要考虑16个邻域点的灰度值的影响,如下图所示:

                               
    1、在四条水平线上分别运用四次多项式插值计算a,b,c,d四点处的灰度值,例如:

    2、对a,b,c,d四点在垂直方向上再进行三次多项式插值,

    函数c(x)的定义如下:

    from:https://www.jianshu.com/p/8118e708b766

    from:https://blog.csdn.net/zhangfuliang123/article/details/76659467

    展开全文
  • 三种点雨量插值方法的比较研究,戚晓明,陆桂华,对距离反比、普通Kriging和PRISM三种常用点雨量插值算法进行了原理、适用范围和优缺点的对比分析。根据雨量站点的平面三角几何关系,
  • 种常用插值和分段插值方法Matlab算法实现

    万次阅读 多人点赞 2019-06-16 20:57:42
    种常用插值方法主要有:Lagrange插值、Newton插值、Hermite插值;分段插值方法主要有:分段线性插值、分段次Hermite插值次样条插值。 接下来: 已知的插值公式: 已知的分段插值公式: 将以上插值公式...

    首先:
    几种常用的插值方法主要有:Lagrange插值、Newton插值、Hermite插值;分段插值方法主要有:分段线性插值、分段三次Hermite插值、三次样条插值。
    接下来:
    已知的插值公式:
    在这里插入图片描述
    已知的分段插值公式:
    在这里插入图片描述
    将以上插值公式使用Matlab算法实现:
    X为x的行向量,Y为y的行向量,Z为y的一阶导数向量或者边界一阶导数行向量。不同的方法用到的部分代码可能相同。
    代码:

    Lagrange插值公式求解及作图代码:
    function [L]=Lagrange(X,Y)
    [C,L,L1,l]=Lagran(X,Y);
    X1=1:0.01:5;
    Y1=polyval(C,X1);
    plot(X,Y,'*',X1,Y1,'r');
    grid on;
    xlabel('x');
    ylabel('y');
    
    function [C,L,L1,l]=Lagran(X,Y)
    m=length(X);
    L=ones(m,m);
    for k=1:m
        v=1;
        for i=1:m
            if k~=i
                v=conv(v,poly(X(i)))/(X(k)-X(i));
            end
        end
        L1(k,:)=v;
        l(k,:)=poly2sym(v);
    end
    C=Y*L1;
    L=Y*l;
    
    Newton插值公式求解及作图代码:
    function [L]=Newton(X,Y)
    [A,C,L]=Newploy(X,Y);
    X1=1:0.01:5;
    Y1=polyval(C,X1);
    plot(X,Y,'*',X1,Y1,'r');
    grid on
    xlabel('x');
    ylabel('y');
    
    function [A,C,L]=Newploy(X,Y)
    n=length(X);
    A=zeros(n,n);
    A(:,1)=Y';
    s=0.0;
    p=1.0;
    q=1.0;
    c1=1.0;
    for j=2:n
        for i=j:n
            A(i,j)=(A(i,j-1)-A(i-1,j-1))/(X(i)-X(i-j+1));
        end
        b=poly(X(j-1));
        q1=conv(q,b);
        c1=c1*j;
        q=q1;
    end
    C=A(n,n);
    b=poly(X(n));
    q1=conv(q1,b);
    for k=(n-1):-1:1
        C=conv(C,poly(X(k)));
        d=length(C);
        C(d)=C(d)+A(k,k);
    end
    L(k,:)=poly2sym(C);
    
    Hermite插值公式求解及作图代码:
    function [L]=Hermite(X,Y,Z)
    [A,C,L]=Herm1(X,Y,Z);
    X1=1:0.01:5;
    Y1=polyval(C,X1);
    plot(X,Y,'*',X1,Y1,'r');
    grid on
    xlabel('x');
    ylabel('y');
    
    function [A,C,L]=Herm1(X,Y,Z)
    s=length(X);
    n=2*s;
    X2=zeros(1,n);
    Y2=zeros(1,n);
    Z2=zeros(1,n);
    A=zeros(n,n);
    for m=1:s
        X2(2*m-1)=X(m);
        X2(2*m)=X(m);
        Y2(2*m-1)=Y(m);
        Y2(2*m)=Y(m);
        Z2(2*m)=Z(m);
    end
    A(:,1)=Y2';
    s=0.0;
    p=1.0;
    q=1.0;
    c1=1.0;
    for j=2:n
        for i=j:n
            if X2(i)==X2(i-j+1)
                A(i,j)=Z2(i);
            else
            A(i,j)=(A(i,j-1)-A(i-1,j-1))/(X2(i)-X2(i-j+1));
            end
        end
        b=poly(X2(j-1));
        q1=conv(q,b);
        c1=c1*j;
        q=q1;
    end
    C=A(n,n);
    b=poly(X2(n));
    q1=conv(q1,b);
    for k=(n-1):-1:1
        C=conv(C,poly(X2(k)));
        d=length(C);
        C(d)=C(d)+A(k,k);
    end
    L(k,:)=poly2sym(C);
    
    分段线性插值公式求解及作图代码:
    function FD(X,Y)
    n=length(X);
    X1=X;
    Y1=Y;
    for i=1:n-1
        x=X1(i):0.01:X1(i+1);
        y=Y1(i)*(x-X1(i+1))/(X1(i)-X1(i+1))+Y1(i+1)*(x-X1(i))/(X1(i+1)-X1(i));
        plot(X,Y,'*',X1,Y1,'r');
        hold on
    end
    xlabel('x');
    ylabel('y');
    syms x;
    for i=1:n-1
        y=Y1(i)*(x-X1(i+1))/(X1(i)-X1(i+1))+Y1(i+1)*(x-X1(i))/(X1(i+1)-X1(i))
    end
    
    分段三次Hermite插值公式求解及作图代码:
    function TH(X,Y,Z)
    n=length(X);
    X3=zeros(2);
    Y3=zeros(2);
    Z3=zeros(2);
    for i=1:n-1
        X3(1)=X(i);
        X3(2)=X(i+1);
        Y3(1)=Y(i);
        Y3(2)=Y(i+1);
        Z3(1)=Z(i);
        Z3(2)=Z(i+1);
        [A,C,L]=Herm1(X3,Y3,Z3)
        X1=X3(1):0.01:X3(2);
        Y1=polyval(C,X1);
        plot(X,Y,'*',X1,Y1,'r');
        grid on
        hold on
    end
    xlabel('x');
    ylabel('y');
    
    三次样条插值公式求解及作图代码:
    function SY(X,Y,Z)
    n=length(X);
    Y1=zeros(n,1);
    A=2*eye(n);
    for i=2:n-1
        A(i,i-1)=(X(i)-X(i-1))/(X(i+1)-X(i-1));
        A(i,i+1)=1-(X(i)-X(i-1))/(X(i+1)-X(i-1));
    end
    A(1,2)=1;
    A(n,n-1)=1;
    Y1(1)=6/(X(2)-X(1))*((Y(2)-Y(1))/(X(2)-X(1))-Z(1));
    Y1(n)=6/(X(n)-X(n-1))*(Z(2)-(Y(n)-Y(n-1))/(X(n)-X(n-1)));
    for i=2:n-1
        Y1(i)=6/(X(i+1)-X(i-1))*((Y(i+1)-Y(i))/(X(i+1)-X(i))-(Y(i)-Y(i-1))/(X(i)-X(i-1)));
    end
    U=A;
    L=eye(n);
    for k=1:n-1
        L(k+1:n,k)=U(k+1:n,k)/U(k,k);
        U(k+1:n,k+1:n)=U(k+1:n,k+1:n)-L(k+1:n,k)*U(k,k+1:n);
        U(k+1:n,k)=zeros(n-k,1);
    end
    for j=1:n-1
        Y1(j)=Y1(j)/L(j,j);
        Y1(j+1:n)=Y1(j+1:n)-Y1(j)*L(j+1:n,j);
    end
    Y1(n)=Y1(n)/L(n,n);
    for j=n:-1:2
        Y1(j)=Y1(j)/U(j,j);
        Y1(1:j-1)=Y1(1:j-1)-Y1(j)*U(1:j-1,j);
    end
    Y1(1)=Y1(1)/U(1,1);
    for i=1:n-1
        x=X(i):0.01:X(i+1);
        y=Y1(i)/6*(X(i+1)-x).^3/(X(i+1)-X(i))+Y1(i+1)/6*(x-X(i)).^3/(X(i+1)-X(i))+(Y(i)-Y1(i)/6*(X(i+1)-X(i)).^2)*(X(i+1)-x)/(X(i+1)-X(i))+(Y(i+1)-Y1(i+1)/6*(X(i+1)-X(i)).^2)*(x-X(i))/(X(i+1)-X(i));
        plot(X,Y,'*',x,y,'r');
        hold on
    end
    xlabel('x');
    ylabel('y');
    syms x;
    for i=1:n-1
        y=Y1(i)/6*(X(i+1)-x).^3/(X(i+1)-X(i))+Y1(i+1)/6*(x-X(i)).^3/(X(i+1)-X(i))+(Y(i)-Y1(i)/6*(X(i+1)-X(i)).^2)*(X(i+1)-x)/(X(i+1)-X(i))+(Y(i+1)-Y1(i+1)/6*(X(i+1)-X(i)).^2)*(x-X(i))/(X(i+1)-X(i))
    end
    
    
    

    对同一例题采用以上方法分别求解:
    在这里插入图片描述
    Lagrange插值:
    在这里插入图片描述
    Newton插值:
    在这里插入图片描述
    Hermite插值:
    在这里插入图片描述
    分段线性插值:
    在这里插入图片描述
    分段三次Hermite插值:
    在这里插入图片描述
    三次样条插值:
    在这里插入图片描述
    解释:
    Lagrange插值和Hermite插值所得结果相同的原因是:两者均采用n次多项式插值,同属于代数插值的范畴。

    展开全文
  • 常用的图像插值方法

    2020-11-13 09:49:10
    三种常用的图像插值算法: 1.邻近元法 2.双线性内插法 3.次内插法

    三种常用的图像插值算法:

    1.最邻近元法

    2.双线性内插法

    3.三次内插法

    展开全文
  • Surfer等值线绘制中的十二种插值方法介绍
  • 这里对次样条插值函数,拉格朗日插值多项式,牛顿插值多项式这三种插值方法进行比较 代码 import numpy as np from sympy import * from matplotlib import pyplot as plt def lagrange(x, y): p, la = symbols...

    这里对三次样条插值函数,拉格朗日插值多项式,牛顿插值多项式这三种插值方法进行比较
    代码

    import numpy as np
    from sympy import *
    from matplotlib import pyplot as plt
    
    
    def lagrange(x, y):
        p, la = symbols('p  la')
        n = len(x)
        s = 0
        for k in range(n):
            la = y[k]
            for j in range(k):
                la = la * (p - x[j]) / (x[k] - x[j])
            for j in range(k+1, n):
                la = la * (p - x[j]) / (x[k] - x[j])
            s = s + la
        return s
    
    
    def newton(x, y):
        n = len(x)
        c = np.zeros((n, n))
        for i in range(n):
            c[i, 0] = y[i]
        for i in range(1, n):
            for j in range(i, n):
                c[j, i] = (c[j, i-1] - c[j-1, i-1])/(x[j] - x[j-i])
        p, la = symbols('p  la')
        la = 0
        s = 0
        for i in range(n):
            la = c[i, i]
            for j in range(0, i):
                la = la * (p - x[j])
            s = s + la
        return s
    
    
    def spline(x, y, t):
        n = len(x)
        h = [x[i]-x[i-1] for i in range(1, n)]
        A = np.eye(n-2)
        A = A*2
        u1 = [h[i]/(h[i]+h[i+1]) for i in range(n-2)]
        la1 = [1-u1[i] for i in range(n-2)]
        c = np.zeros((n, n))
        for i in range(n):
            c[i, 0] = y[i]
        for i in range(1, n):
            for j in range(i, n):
                c[j, i] = (c[j, i-1] - c[j-1, i-1])/(x[j] - x[j-i])
        for i in range(n-3):
            A[i+1, i] = u1[i+1]
            A[i, i+1] = la1[i]
        d = [6*c[-((n-2)-i), 2] for i in range(n-2)]
        di = np.mat(d)
        ai = np.mat(A)
        l, u, x3 = zuiganfa(ai, di)
        x1 = [x3[0, i] for i in range(n-2)]
        M = [0] + x1 + [0]
        S, X, la = symbols('S X la')
        for t1 in range(1, n):
            if (x[t1-1] <= t) and (t < x[t1]):
                i = t1
                break
        S = ((x[i] - X) ** 3 / (6 * h[i - 1])) * M[i - 1] + ((X - x[i - 1]) ** 3 / (6 * h[i - 1])) * M[i] + \
            + (y[i - 1] - (h[i - 1] * h[i - 1] / 6) * M[i - 1]) * ((x[i] - X) / h[i - 1]) + \
            + (y[i] - (h[i - 1] * h[i - 1] / 6) * M[1]) * (X - x[i - 1]) / h[i - 1]
        yo = S.subs(X, t)
        return yo
    
    
    def zuiganfa(A, d):
        n = A.shape[0]
        l = np.mat(np.zeros(n, dtype=float))
        u = np.mat(np.zeros(n, dtype=float))
        y = np.mat(np.zeros(n, dtype=float))
        a = np.mat(np.zeros(n, dtype=float))
        b = np.mat(np.zeros(n, dtype=float))
        c = np.mat(np.zeros(n, dtype=float))
        x = np.mat(np.zeros(n, dtype=float))
        for i in range(1, n-1):
            a[0, i] = A[i, i-1]
            b[0, i] = A[i, i]
            c[0, i] = A[i, i+1]
        a[0, -1] = A[n-1, n-2]
        c[0, 0] = A[0, 1]
        b[0, 0] = A[0, 0]
        b[0, n-1] = A[n-1, n-1]
        u[0, 0] = b[0, 0]
        y[0, 0] = d[0, 0]
        for i in range(1, n):
            l[0, i] = a[0, i]/u[0, i-1]
            u[0, i] = b[0, i] - l[0, i] * c[0, i-1]
            y[0, i] = d[0, i] - l[0, i] * y[0, i-1]
        x[0, -1] = y[0, -1]/u[0, -1]
        for i in range(n-2, -1, -1):
            x[0, i] = (y[0, i] - c[0, i] * x[0, i+1])/u[0, i]
        return l, u, x
    
    
    if __name__ == "__main__":
        x = np.linspace(-1, 1, 10)
        x = list(x)
        y = [1/(1+it*it) for it in x]
        x1 = np.linspace(x[0], x[-1], 100)
        x1 = list(x1)
        y_spline = []
        for i in x1:
            y_spline.append(spline(x, y, i))
        p = symbols('p')
        y_lagrange = []
        t = lagrange(x, y)
        x1 = np.linspace(-2, 2, 100)
        x1 = list(x1)
        for i in x1:
            y_lagrange.append(t.subs(p, i))
        s = newton(x, y)
        y_newton = []
        for i in x1:
            y_newton.append(s.subs(p, i))
        plt.figure(figsize=(15, 8), dpi=80)
        plt.plot(x, y, 'r1', markersize=40, label='original')
        x1 = np.linspace(-2, 2, 100)
        x1 = list(x1)
        plt.plot(x1, y_newton, 'kD:', markersize=8, label='newton')
        plt.plot(x1, y_lagrange, 'g^:', markersize=8, label='lagrange')
        x1 = np.linspace(x[0], x[-1], 100)
        x1 = list(x1)
        plt.plot(x1, y_spline, 'y*:', markersize=8, label='spline')
        plt.xlabel('x')
        plt.ylabel('y')
        plt.legend()
        plt.savefig('chazhi_compare.jpg')
        plt.show()
    

    比较结果如下图所示:
    在这里插入图片描述

    展开全文
  • 常用插值方法

    2020-12-06 10:02:11
    拉格朗日插值法 参考链接 拉格朗日插值法(图文详解)    次样条插值法 参考链接 次样条插值
  • xn≤b上的值为y0,y1,…,yn,若存在简单函数P(x)使得P(xi)=yi (i=0,1,…,n)成立,就称P(x)为f(x)的插值函数, x0,x1,…,xn称为插值节点,包含插值节点的区间[a,b]称为插值区间,求插值函数P(x)的方法就是插值法。...
  • Inter1d函数包含常用的**四种插值方法:分段线性插值,临近插值,球面插值次多项式插值。**而Spline就对应其中的次多项式插值插值的步骤应该是先根据已有序列拟合出一个函数,然后再在这个序列区间中均匀...
  • 针对常用的空间插值方法在精度分析方面比较的不足,从地质统计学、数学函数 和几何方法方面分别选取普通克里金插值法、次样条函数法和距离权重倒数法进行插 值精度的比较与分析
  • 常用插值方法比较

    千次阅读 2018-10-30 11:03:51
    插值算法有多种,最常用的有最近邻插值、双线性插值以及立方卷积插值。本文对三种插值算法进行简单分析并对它们的处理结果加以比较,最后总结了三种算法各自的优缺点。  关键词:图像处理;最近邻插值;双线...
  • 种常见的二维插值方法

    千次阅读 2021-03-08 13:40:01
    双线性插值在数学上,双线性插值是线性插值的一推广,用于在二维直线网格上插值两个变量(如x和y)的函数。 双线性插值首先在一个方向上使用线性插值,然后在另一个方向上使用线性插值。虽然每一步在采样值和位置...
  • 常见插值方法

    千次阅读 2015-05-21 11:04:04
    常见插值方法介绍 Inverse Distance to a Power(反距离加权 插值法)”、 “Kriging(克里金插值法)”、 “Minimum Curvature(最小曲率)”、 “Modified Shepard's Method(改进谢别德法)”、 ...
  • 早就想着找个地方记录...废话少说吧,先要介绍的插值方法有双线性插值(bilinear interpolation),双三次插值(Bi-cubic interpolation),拉格朗日插值(Largrange interpolation),还有个B-Spline,额不知道这个中
  • 接着双线性插值,此次为双三次插值(Bi-cubic interpolation),前面我们知道双线性插值是周边的四个点进行计算,这次双三次是通过计算周边的16个点进行插值的。 Bicubicinterpolation solves for the value at a ...
  • 图像变换中常用的一些插值方法

    千次阅读 2014-02-22 19:17:52
    在进行图像变换时通常会用到一些插值方法,使变换后的图像看起来更加自然。图像插值的应用非常广泛,如
  • 图像处理中常用插值方法
  • 数字图像处理中常用插值方法;在做数字图像处理时,经常会碰到小数象素坐标的取值问题,这时就需要依据邻近象素的值来对该坐标进行插值邻近元法、双线性内插法、次内插法的算法介绍。
  • 下面我们将对这三种插值方法做简单的介绍,以及针对用以构建DEM的点数据的空间特性,来选择一个较合适的插值方法,生成一个能达到预期效果的DEM。一. 三种插值方法的简介1.不规则三角网法简单来说构建不规则三角网...
  • 图像处理常用插值方法总结

    千次阅读 2018-11-15 01:02:57
    图像处理常用插值方法总结
  • 以下是几在ArcGIS中常见插值方法: IDW:确定性插值方法。每个栅格单元内的样本点数据距离单元内加权平均距离点的距离为自变量,点对平均距离点的影响与其距离幂值成反比,适合样本密集情况下进行分析。 ...
  • 插值方法

    2018-08-27 00:17:00
    最近看文献发现插值有很多用处,这篇博客是用来梳理和...1、插值方法原理详解【转】 转载于http://www.cnblogs.com/duye/p/8671820.html 插值就是根据已知数据点(条件),来预测未知数据点值得方法。具体来说,...
  • 研究了由已知地质信息推测未知空间信息的插值方法,重点对比分析了常用插值方法的适用条件及优缺点,提出参数优化选择的有效方法。并以矿山实例为工程背景,选择合适的空间插值方法对其煤层进行了构建,研究表明:插值...
  • 缘由之前我在公司做了一个在JNI层缩放Bitmap的需求。需求本身很简单,就是按各种比例缩小或者放大图像,要求缩放后无明显锯齿,不失真。很容易就想到了双线性插值算法,于是在Github上找...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,347
精华内容 16,138
关键字:

常用的三种插值方法