精华内容
下载资源
问答
  • python脚本纠错:interpolate.interp2d的正确用法
    2021-02-09 03:25:05

    说明:

    所以在插值前,加两句把输入参数变成一维数组

    XX = np.arange(0, 16, 1)

    YY= np.arange(0, 12, 1)

    29755a34cc16746c003dc06f9ef068ad.png

    代码:

    from matplotlib import pyplot as plt

    import numpy as np

    from mpl_toolkits.mplot3d import Axes3D

    from scipy import interpolate

    import matplotlib as mpl

    import matplotlib.cm as cm

    fig = plt.figure()

    Z=np.empty([12,16])

    #ax = Axes3D(fig)

    ax = fig.add_subplot(121, projection='3d')

    bx = fig.add_subplot(122, projection='3d')

    adc=[

    29.38, 29.28, 29.23, 29.35, 29.53, 29.49, 29.41, 29.34, 29.42, 29.46, 29.58, 29.55, 29.49, 29.35, 29.46, 30.07,

    29.43, 29.36, 29.39, 29.34, 29.55, 29.54, 29.44, 29.44, 29.60, 29.43, 29.73, 29.65, 29.46, 29.67, 29.87, 29.63,

    29.45, 29.39, 29.33, 29.53, 29.59, 29.62, 29.44, 29.44, 29.62, 29.74, 29.60, 29.60, 29.54, 29.52, 29.63, 29.54,

    29.51, 29.48, 29.59, 29.52, 29.63, 29.52, 29.58, 29.66, 29.68, 29.80, 29.59, 29.55, 29.53, 29.54, 29.74, 29.68,

    29.48, 29.61, 29.62, 29.50, 29.57, 29.61, 29.63, 29.64, 30.01, 30.82, 29.86, 29.80, 29.74, 29.71, 29.80, 29.76,

    29.79, 29.73, 29.53, 29.51, 29.66, 29.71, 29.69, 29.78, 29.97, 32.57, 30.31, 30.06, 29.84, 29.72, 29.53, 29.60,

    29.64, 29.62, 29.59, 29.66, 29.67, 29.74, 29.74, 29.75, 29.78, 30.92, 31.55, 29.95, 29.94, 29.87, 29.76, 29.69,

    29.70, 29.69, 29.78, 29.74, 29.88, 29.86, 29.81, 29.77, 29.76, 29.88, 31.88, 30.18, 29.87, 29.89, 29.93, 29.60,

    29.56, 29.72, 29.83, 29.98, 31.13, 31.41, 29.81, 29.83, 29.85, 29.80, 30.17, 30.06, 29.87, 29.86, 30.12, 29.81,

    29.85, 29.81, 29.81, 29.91, 30.28, 32.26, 30.99, 29.79, 29.85, 29.68, 29.81, 29.93, 29.83, 29.97, 29.93, 29.98,

    30.20, 29.72, 29.95, 29.83, 30.05, 30.26, 31.81, 30.70, 29.66, 29.74, 29.79, 29.91, 30.25, 29.91, 29.90, 30.12,

    30.95, 30.80, 29.93, 29.80, 29.80, 29.89, 30.00, 30.88, 29.78, 29.87, 29.77, 29.88, 30.83, 30.00, 29.79, 30.06

    ]

    X = np.arange(0, 16, 1)

    Y = np.arange(0, 12, 1)

    X, Y = np.meshgrid(X, Y)

    for i in range(0,12):

    for j in range(0,16):

    Z[i][j]=adc[i*16+j]

    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')

    ax.contour(X,Y, Z, zdir = 'z', offset = 21, cmap = plt.get_cmap('rainbow'))

    ax.set_zlim(20, 40)

    znew=np.empty([48,64])

    XX = np.arange(0, 16, 1)

    YY= np.arange(0, 12, 1)

    #二维插值

    newfunc = interpolate.interp2d(XX, YY, Z, kind='cubic')

    # 计算100*100的网格上的插值

    xnew = np.linspace(0,16,64)#x

    ynew = np.linspace(0,12,48)#y

    znew = newfunc(xnew, ynew)

    Xnew, Ynew = np.meshgrid(xnew, ynew)

    bx.plot_surface(Xnew, Ynew, znew, rstride=1, cstride=1, cmap='rainbow')

    bx.contour(Xnew,Ynew, znew, zdir = 'z', offset = 0, cmap = plt.get_cmap('rainbow'))

    bx.set_zlim(0, 40)

    plt.show()

    原文链接:https://blog.csdn.net/m0_37738150/article/details/106247829

    更多相关内容
  • scipy.interpolate.interp2d注意事项python插值方法scipy.interpolate.interp2d注意事项问题scipy.interpolate.interp2d的使用变化说明 python插值方法scipy.interpolate.interp2d注意事项 问题 在使用scipy....

    python插值方法scipy.interpolate.interp2d注意事项

    问题

    在使用scipy.interpolate.interp2d对数据插值时,发现输出的数据图像并不相同,然后找了一下原因。
    坐标用的是经纬度数据,粗细的纬度数据都是从60~-60这样排列的,原因应该就是插值完的输出坐标应该都是从小到大排序(即从负到正),因此导致不同。

    scipy.interpolate.interp2d的使用

    scipy.interpolate.interp2d官方文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp2d.html#scipy.interpolate.interp2d
    例子如下:

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import interpolate
    
    x = np.arange(-3.01, 5.01, 0.25)
    y = np.arange(-1.01, 5.01, 0.25)
    xx, yy = np.meshgrid(x, y) #建立原始坐标
    z = np.sin(xx**2+yy**2) #建立原始数据
    f = interpolate.interp2d(x, y, z, kind='cubic')
    
    xnew = np.arange(5.01, -3.01, -1e-2)
    ynew = np.arange(-1.01, 5.01, 1e-2)
    znew = f(xnew, ynew) #插值后的数据
    

    展示结果

    plt.imshow(z)
    

    原始数据z

    plt.imshow(znew)
    

    插值后的数据znew

    变化说明

    如果把x换成从正到负的横坐标列:

    x = np.arange(5.01, -3.01, -0.25)
    y = np.arange(-1.01, 5.01, 0.25)
    xx, yy = np.meshgrid(x, y)
    z = np.sin(xx**2+yy**2)
    plt.imshow(z)
    

    直接画图有:
    转换了x的z图像
    但是如果把xnew换成从正到负的横坐标列,这时产生的znew的横坐标并不与xnew对应,而是从小到大从负到正:

    x = np.arange(-3.01, 5.01, 0.25)
    y = np.arange(-1.01, 5.01, 0.25)
    xx, yy = np.meshgrid(x, y)
    z = np.sin(xx**2+yy**2)
    f = interpolate.interp2d(x, y, z, kind='cubic')
    xnew = np.arange(5.01, -3.01, -1e-2)
    ynew = np.arange(-1.01, 5.01, 1e-2)
    znew = f(xnew, ynew)
    plt.imshow(znew)
    

    转换了xnew之后的插值数据znew图像
    应该就是不管设定的坐标顺序是怎样,查之后的结果都是按照坐标从小到大排列的。
    如果是用于地理信息数据的插值的时候要注意。

    展开全文
  • scipy.interpolate.interp2d插值函数 博客地址:https://editor.csdn.net/md?not_checkout=1&articleId=109588264 1. interp2d函数用法 详见官方API文档 2. 问题描述 Python 3.8.3 Platform: Spyder 3 SciPy ...

    scipy.interpolate.interp2d插值函数

    博客地址:https://editor.csdn.net/md?not_checkout=1&articleId=109588264

    1. interp2d函数用法

    详见官方API文档

    2. 问题描述

    Python 3.8.3
    Platform: Spyder 3
    SciPy 1.5.0

    在使用interp2d进行插值时,当输入的纵坐标顺序为正序时(递增序列,如[0, 1, 2, …10]),插值结果是正常的;而当输入逆序的纵坐标时(递减序列,如[10, 9, 8…,0]),插值结果会出现异常,如果不注意的话,程序会给出意想不到的插值结果,最后的插值结果会出现上下颠倒的情况。

    # import module
    from scipy import interpolate
    import numpy as np
    import matplotlib.pyplot as plt
    

    先看一段插值结果为【正常】的代码:

    # 插值结果正常
    x = np.asarray([0,1,2])
    y = np.asarray([0, 3])  #! 注意: 这里是正序
    z = np.asarray([[1,2,3], [4,5,6]])
    xx, yy = np.meshgrid(x, y)
    plt.contourf(xx, yy, z)
    plt.show()
    # interp
    xn = np.linspace(0, 2, num=8)
    yn = np.linspace(0, 3, num=6)  #! 注意: 这里是正序
    interpfunc = interpolate.interp2d(x, y, z, kind='linear')
    zn = interpfunc(xn, yn)
    xxn, yyn = np.meshgrid(xn, yn)
    plt.contourf(xxn, yyn, zn)  # 展示插值结果
    plt.show()
    

    运行结果如图所示:
    正序插值结果
    再来看一下插值【不正常】的代码:

    # 插值结果不正常
    x = np.asarray([0,1,2])
    y = np.asarray([3, 0])  #! 注意: 这里是逆序
    z = np.asarray([[1,2,3], [4,5,6]])
    xx, yy = np.meshgrid(x, y)
    plt.contourf(xx, yy, z)
    plt.show()
    # interp
    xn = np.linspace(0, 2, num=8)
    yn = np.linspace(3, 0, num=6)  #! 注意: 这里是逆序
    interpfunc = interpolate.interp2d(x, y, z, kind='linear')
    zn = interpfunc(xn, yn)
    xxn, yyn = np.meshgrid(xn, yn)
    plt.contourf(xxn, yyn, zn)  # 展示插值结果
    plt.show()
    

    逆序插值结果

    3. 解决办法

    在程序中加入一个判断,如果输入的纵坐标为逆序,则使用numpy.flipud(array)的方法先将其进行上下倒置,则输出结果为正常。
    代码如下【使用numpy.flipud()】:

    # 解决interp2d插值结果倒置问题
    x = np.asarray([0,1,2])
    y = np.asarray([3, 0])  #! 注意: 这里是逆序
    z = np.asarray([[1,2,3], [4,5,6]])
    xx, yy = np.meshgrid(x, y)
    plt.contourf(xx, yy, z)
    plt.show()
    # interp
    xn = np.linspace(0, 2, num=8)
    yn = np.linspace(3, 0, num=6)  #! 注意: 这里是逆序
    # 这里假如判断函数, 如果输入的纵坐标为倒序, 则翻转插值矩阵
    if y[0] > y[-1]:
    	z = np.flipud(z)
    interpfunc = interpolate.interp2d(x, y, z, kind='linear')
    zn = interpfunc(xn, yn)
    xxn, yyn = np.meshgrid(xn, yn)
    plt.contourf(xxn, yyn, zn)  # 展示插值结果
    plt.show()
    

    使用flipud之后正常的插值结果

    2020年12月13日补充:interp2d居然还有另外一个更隐蔽的坑。该函数插值生成的格点值与真实的(经纬度)坐标格点有错位,目前不知道怎么解决。。。现在使用iris模块的插值方法进行替换:

    cube_intp = cube.interpolate(sample_points, iris.analysis.Linear())
    

    iris的这个方法插值速度非常慢,比scipy的插值方法要慢很多很多。插值的详细代码不贴了,哎,处理了那么久的数据,结果发现错了,WDNMD。

    4. 总结

    一般情况下,插值所使用的坐标轴序列都是正序的,但是,有时候也会使用逆序列,如做某些地理处理,这时候常会遇到纬度序列为逆序,即从北纬90°N向南纬-90°S递减的序列,如果这时候直接使用该函数进行插值,结果就会出现问题。

    scipy.interpolate.interp2d的坑有不少,慎用!

    程序小白,与君共勉!

    展开全文
  • 根据 scipy.interpolate.interp2d 中对于interp2d的用法进行了介绍。 class scipy.interpolate.interp2d(x, y, z, kind='linear', copy=True, bounds_error=False, fill_value=nan) 函数参数 x, y : array_like ...

    简 介: 利用scipy.interpolate.interp2d可以对图像进行插值,获得图像在各个方向的渐进过度过程。这可以为后面在一些特征点进行超像素处理中提供更加精确光滑的数据处理过程。

    关键词 插值interp2dscipyinterpolateinterp2d

     

    interp2d函数
    目 录
    Contents
    函数功能
    函数参数
    函数返回
    举例
    图像插值
    插值图像
    原始图像
    插值图像
    插值总结

     

    §01 interp2d函数


    1.1 函数功能

      根据 scipy.interpolate.interp2d 中对于interp2d的用法进行了介绍。

    class scipy.interpolate.interp2d(x, y, z, kind='linear', copy=True, bounds_error=False, fill_value=nan)
    

    1.1.1 函数参数

    • x, y : array_like
        Arrays defining the data point coordinates.

      If the points lie on a regular grid, x can specify the column coordinates and y the row coordinates, for example:

    x = [0,1,2]; y = [0,3]; z = [[1,2,3], [4,5,6]]
    Otherwise, x and y must specify the full coordinates for each point, for example:

    x = [0,1,2,0,1,2]; y = [0,0,0,3,3,3]; z = [1,2,3,4,5,6]
    If x and y are multi-dimensional, they are flattened before use.

    • z : array_like
        The values of the function to interpolate at the data points. If z is a multi-dimensional array, it is flattened before use. The length of a flattened z array is either len(x)*len(y) if x and y specify the column and row coordinates or len(z) == len(x) == len(y) if x and y specify coordinates for each point.

    • kind : {‘linear’, ‘cubic’, ‘quintic’}, optional
        The kind of spline interpolation to use. Default is ‘linear’.

    • copy : bool, optional
        If True, the class makes internal copies of x, y and z. If False, references may be used. The default is to copy.

    • bounds_error : bool, optional
        If True, when interpolated values are requested outside of the domain of the input data (x,y), a ValueError is raised. If False, then fill_value is used.

    • fill_value : number, optional
        If provided, the value to use for points outside of the interpolation domain. If omitted (None), values outside the domain are extrapolated.

    1.1.2 函数返回

    • values_x : ndarray, shape xi.shape[:-1] + values.shape[ndim:]
        Interpolated values at input coordinates.

    1.2 举例

    from scipy import interpolate
    x = np.arange(-5.01, 5.01, 0.25)
    y = np.arange(-5.01, 5.01, 0.25)
    xx, yy = np.meshgrid(x, y)
    z = np.sin(xx**2+yy**2)
    f = interpolate.interp2d(x, y, z, kind='cubic')
    

    ▲ 图1.2.1 函数取值

    ▲ 图1.2.1 函数取值

    ▲ 图1.2.2 插值之后的图像

    ▲ 图1.2.2 插值之后的图像

    xnew = np.arange(-5.01, 5.01, 1e-2)
    ynew = np.arange(-5.01, 5.01, 1e-2)
    znew = f(xnew, ynew)
    plt.plot(x, z[0, :], 'ro-', xnew, znew[0, :], 'b-')
    plt.show()
    

    ▲ 图1.2.3 对于x轴方面的插值结果

    ▲ 图1.2.3 对于x轴方面的插值结果

    ▲ 图1.2.4  插值前的函数

    ▲ 图1.2.4 插值前的函数

    import sys,os,math,time
    import matplotlib.pyplot as plt
    from numpy import *
    
    from scipy import interpolate
    from tqdm import tqdm
    
    gifpath = '/home/aistudio/GIF'
    if not os.path.isdir(gifpath):
        os.makedirs(gifpath)
    gifdim = os.listdir(gifpath)
    for f in gifdim:
        fn = os.path.join(gifpath, f)
        if os.path.isfile(fn):
            os.remove(fn)
    
    theta = linspace(0, 2*pi, 50)
    x = arange(-5.01, 5.01, 0.25)
    y = arange(-5.01, 5.01, 0.25)
    xx,yy = meshgrid(x,y)
    
    z = sin(xx**2+yy**2 + t)
    f = interpolate.interp2d(x,y,z, kind='cubic')
    
    xxx = arange(-5.01, 5.01, 0.01)
    yyy = arange(-5.01, 5.01, 0.01)
    id = 0
    for t in tqdm(theta):
        z = sin(xx**2+yy**2 + t)
        f = interpolate.interp2d(x,y,z, kind='cubic')
        zzz = f(xxx, yyy)
        plt.figure(figsize=(8,8))
        plt.imshow(zzz)
        savefile = os.path.join(gifpath, '%03d.jpg'%id)
        id += 1
        plt.savefig(savefile)
        plt.close()
    

    ▲ 图1.2.5  插值后的函数

    ▲ 图1.2.5 插值后的函数

     

    §02 像插值


    2.1 插值图像

      利用在 利用圆圈轮廓面积求取圆环半径:cv2.findContours, contourArea 抑菌圈金属模板扫描图片,通过 cv2.resize之后形成64×64的分辨率的图像。

    2.1.1 原始图像

    import sys,os,math,time
    import matplotlib.pyplot as plt
    from numpy import *
    import cv2
    from scipy                  import interpolate
    
    filename = '/home/aistudio/work/Scanner/ScanDiagBlock/img258.jpg'
    
    img = cv2.imread(filename)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray32 = cv2.resize(gray, (64,64))
    
    plt.figure(figsize=(10,10))
    plt.imshow(gray32)
    plt.savefig('/home/aistudio/stdout.jpg')
    

    ▲ 图2.1.1 设置成分辨率为64×64图片

    ▲ 图2.1.1 设置成分辨率为64×64图片

    2.1.2 插值图像

    x = arange(64)
    y = arange(64)
    f = interpolate.interp2d(x,y,gray32, kind='cubic')
    
    xx = arange(0, 64, 0.1)
    yy = arange(0, 64, 0.1)
    zz = f(xx, yy)
    plt.figure(figsize=(10,10))
    plt.imshow(zz)
    plt.savefig('/home/aistudio/stdout.jpg')
    

    (1)立方插值

    ▲ 图2.1.2 插值后的图像

    ▲ 图2.1.2 插值后的图像

    (2)线性插值

    ▲ 图2.1.3 线性插值

    ▲ 图2.1.3 线性插值

    (3)四次方插值

    ▲ 图2.1.4 四次方插值

    ▲ 图2.1.4 四次方插值

     

    值总结 ※


      用scipy.interpolate.interp2d可以对图像进行插值,获得图像在各个方向的渐进过度过程。这可以为后面在一些特征点进行超像素处理中提供更加精确光滑的数据处理过程。


    ■ 相关文献链接:

    ● 相关图表链接:

    #!/usr/local/bin/python
    # -*- coding: gbk -*-
    #============================================================
    # TEST3.PY                     -- by Dr. ZhuoQing 2022-01-27
    #
    # Note:
    #============================================================
    from headm import *                 # =
    import cv2
    from scipy                  import interpolate
    filename = '/home/aistudio/work/Scanner/ScanDiagBlock/img258.jpg'
    img = cv2.imread(filename)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray32 = cv2.resize(gray, (64,64))
    plt.figure(figsize=(10,10))
    plt.imshow(gray32)
    plt.savefig('/home/aistudio/stdout.jpg')
    #------------------------------------------------------------
    x = arange(64)
    y = arange(64)
    f = interpolate.interp2d(x,y,gray32, kind='quintic')
     #------------------------------------------------------------
    xx = arange(0, 64, 0.1)
    yy = arange(0, 64, 0.1)
    zz = f(xx, yy)
    plt.figure(figsize=(10,10))
    plt.imshow(zz)
    plt.savefig('/home/aistudio/stdout.jpg')
    #------------------------------------------------------------
    #        END OF FILE : TEST3.PY
    #============================================================
    
    展开全文
  • interpolate.interp2d二维插值的曲面出现奇怪的突出 网上能找到的关于二维插值的博文比较少,对插值算法函数的...链接: python脚本纠错:interpolate.interp2d的正确用法_我的博客-CSDN博客_interpolate.interp2d. 做了
  • python一维插值scipy.interpolate.interp1d

    千次阅读 2019-09-30 20:53:15
    SciPy的interpolate模块提供了许多对数据进行插值运算的函数,范围涵盖简单的一维插值到复杂多维插值求解。当样本数据变化归因于一...classscipy.interpolate.interp1d(x,y,kind='linear',axis=-1,copy=True,bounds_...
  • >最近“捕捉”到最近的数据点. >零是零阶样条.它的价值在任何时候都是最后看到的原始..., kinds): new_y = interpolate.interp1d(x, y, kind=kind)(new_x) ax.plot(new_x, new_y, 'ro-') ax.set_title(kind) plt.show()
  • scipy.interpolate.interp1d

    万次阅读 2018-11-19 15:54:36
    class scipy.interpolate.interp1d(x, y, kind='linear', axis=-1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False) 解释一 import numpy as np import matplotlib.pyplot as plt from scipy ...
  • """ scipy:interp2d二维插值、画三维图 mayuhua 2020.5.15 """ from scipy import interpolate import numpy as np def z(x,y): return (x+y)*np.exp(-5*(x**2+y**2...f = interpolate.interp2d(x,y,z(x,y),kind='cu
  • a = np.array([[1, 2], [2, 3]]) interObj = interpolate.interp2d([0, 2], [0, 2], a) rst = interObj(range(3), range(3)) print(a) print(rst) [[1 2] [2 3]] [[1. 1.5 2. ] [1.5 2. 2.5] [2. 2.5 3. ]]
  • 我只是将其添加为脚本的“替代”方式.import numpy as npimport scipy.interpolate as spintRGI = spint.RegularGridInterpolatorx = np.linspace(0, 1, 3) # or 0.5*np.arange(3.) works too# populate the 3D a...
  • Python:插值interpolate模块

    千次阅读 2020-12-03 01:12:13
    SciPy的interpolate模块提供了许多对数据进行插值运算的函数,范围涵盖简单的一维插值到复杂多维插值求解。当样本数据变化归因于一个独立的变量时,就使用一维插值;反之样本数据归因于多个独立变量时,使用多维插值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 485
精华内容 194
关键字:

interpolate.interp2d