精华内容
下载资源
问答
  • 常见的空间插值算法

    2010-08-16 08:55:00
    空间插值算法: 1、距离倒数乘方法(Inverse Distance to a Power) 距离倒数乘方格网化方法是一个加权平均插值法,可以进行确切或者圆滑方式插值。方次参数控制着权系数如何随着离开一个格网结点距离增加...

    空间插值算法:

     

    1、距离倒数乘方法(Inverse Distance to a Power) 距离倒数乘方格网化方法是一个加权平均插值法,可以进行确切的或者圆滑的方式插值。方次参数控制着权系数如何随着离开一个格网结点距离的增加而下降。对于一个较大的方次,较近的数据点被给定一个较高的权重份额,对于一个较小的方次,权重比较均匀地分配给各数据点。计算一个格网结点时给予一个特定数据点的权值与指定方次的从结点到观测点的该结点被赋予距离倒数成比例。当计算一个格网结点时,配给的权重是一个分数,所有权重的总和等于1.0。当一个观测点与一个格网结点重合时,该观测点被给予一个实际为 1.0 的权重,所有其它观测点被给予一个几乎为 0.0 的权重。换言之,该结点被赋给与观测点一致的值。这就是一个准确插值。距离倒数法的特征之一是要在格网区域内产生围绕观测点位置的"牛眼"。用距离倒数格网化时可以指定一个圆滑参数。大于零的圆滑参数保证,对于一个特定的结点,没有哪个观测点被赋予全部的权值,即使观测点与该结点重合也是如此。圆滑参数通过修匀已被插值的格网来降低"牛眼"影响。

     

    2、克里金法 (Kriging)克里金法是一种在许多领域都很有用的地质统计格网化方法。克里金法试图那样表示隐含在你的数据中的趋势,例如,高点会是沿一个脊连接,而不是被牛眼形等值线所孤立。 克里金法中包含了几个因子:变化图模型,漂移类型 和矿块效应。

     

    3、最小曲率法 (Minimum Curvature)最小曲率法广泛用于地球科学。用最小曲率法生成的插值面类似于一个通过各个数据值的,具有最小弯曲量的长条形薄弹性片。最小曲率法,试图在尽可能严格地尊重数据的同时,生成尽可能圆滑的曲面。 使用最小曲率法时要涉及到两个参数:最大残差参数和最大循环次数参数来控制最小曲率的收敛标准。

     

    4、多元回归法 (Polynomial Regression)多元回归被用来确定你的数据的大规模的趋势和图案。你可以用几个选项来确定你需要的趋势面类型。多元回归实际上不是插值器,因为它并不试图预测未知的 Z 值。它实际上是一个趋势面分析作图程序。 使用多元回归法时要涉及到曲面定义和指定XY的最高方次设置,曲面定义是选择采用的数据的多项式类型,这些类型分别是简单平面、双线性鞍、二次曲面、三次曲面和用户定义的多项式。参数设置是指定多项式方程中 X 和 Y组元的最高方次 。

     

    5、径向基本函数法 (Radial Basis Function)径向基本函数法是多个数据插值方法的组合。根据适应你的数据和生成一个圆滑曲面的能力,其中的复二次函数被许多人认为是最好的方法。所有径向基本函数法都是准确的插值器,它们都要为尊重你的数据而努力。为了试图生成一个更圆滑的曲面,对所有这些方法你都可以引入一个圆滑系数。你可以指定的函数类似于克里金中的变化图。当对一个格网结点插值时,这些个函数给数据点规定了一套最佳权重。

     

    6、谢别德法( Shepard's Method) 谢别德法使用距离倒数加权的最小二乘方的方法。因此,它与距离倒数乘方插值器相似,但它利用了局部最小二乘方来消除或减少所生成等值线的"牛眼"外观。谢别德法可以是一个准确或圆滑插值器。 在用谢别德法作为格网化方法时要涉及到圆滑参数的设置。圆滑参数是使谢别德法能够象一个圆滑插值器那样工作。当你增加圆滑参数的值时,圆滑的效果越好。

     

    7、三角网/线形插值法 (Triangulation with Linear Interpolation)三角网插值器是一种严密的插值器,它的工作路线与手工绘制等值线相近。这种方法是通过在数据点之间连线以建立起若干个三角形来工作的。原始数据点的连结方法是这样:所有三角形的边都不能与另外的三角形相交。其结果构成了一张覆盖格网范围的,由三角形拼接起来的网。每一个三角形定义了一个覆盖该三角形内格网结点的面。三角形的倾斜和标高由定义这个三角形的三个原始数据点确定。给定三角形内的全部结点都要受到该三角形的表面的限制。因为原始数据点被用来定义各个三角形,所以你的数据是很受到尊重的。

     

    8.自然邻点插值法(Natural Neighbor) 自然邻点插值法(NaturalNeighbor)是Surfer7.0才有的网格化新方法。自然邻点插值法广泛应用于一些研究领域中。其基本原理是对于一组泰森(Thiessen)多边形,当在数据集中加入一个新的数据点(目标)时,就会修改这些泰森多边形,而使用邻点的权重平均值将决定待插点的权重,待插点的权重和目标泰森多边形成比例[9]。实际上,在这些多边形中,有一些多边形的尺寸将缩小,并且没有一个多边形的大小会增加。同时,自然邻点插值法在数据点凸起的位置并不外推等值线(如泰森多边形的轮廓线)。

     

    9.最近邻点插值法最近邻点插值法(NearestNeighbor)又称泰森多边形方法,泰森多边形(Thiesen,又叫Dirichlet或Voronoi多边形)分析法是荷兰气象学家A.H.Thiessen提出的一种分析方法。最初用于从离散分布气象站的降雨量数据中计算平均降雨量,现在GIS和地理分析中经常采用泰森多边形进行快速的赋值[2]。实际上,最近邻点插值的一个隐含的假设条件是任一网格点p(x,y)的属性值都使用距它最近的位置点的属性值,用每一个网格节点的最邻点值作为待的节点值[3]。当数据已经是均匀间隔分布,要先将数据转换为SURFER的网格文件,可以应用最近邻点插值法;或者在一个文件中,数据紧密完整,只有少数点没有取值,可用最近邻点插值法来填充无值的数据点。有时需要排除网格文件中的无值数据的区域,在搜索椭圆(SearchEllipse)设置一个值,对无数据区域赋予该网格文件里的空白值。设置的搜索半径的大小要小于该网格文件数据值之间的距离,所有的无数据网格节点都被赋予空白值。在使用最近邻点插值网格化法,将一个规则间隔的XYZ数据转换为一个网格文件时,可设置网格间隔和XYZ数据的数据点之间的间距相等。最近邻点插值网格化法没有选项,它是均质且无变化的,对均匀间隔的数据进行插值很有用,同时,它对填充无值数据的区域很有效。

     

    10.Moving Average(移动平均法)移动平均法是用一组最近的实际数据值来预测未来一期或几期内公司产品的需求量、公司产能等的一种常用方法。移动平均法适用于即期预测。当产品需求既不快速增长也不快速下降,且不存在季节性因素时,移动平均法能有效地消除预测中的随机波动,是非常有用的。移动平均法根据预测时使用的各元素的权重不同 移动平均法是一种简单平滑预测技术,它的基本思想是:根据时间序列资料、逐项推移,依次计算包含一定项数的序时平均值,以反映长期趋势的方法。因此,当时间序列的数值由于受周期变动和随机波动的影响,起伏较大,不易显示出事件的发展趋势时,使用移动平均法可以消除这些因素的影响,显示出事件的发展方向与趋势(即趋势线),然后依趋势线分析预测序列的长期趋势。

     

    11.Local Polynomial(局部多项式法)

     

    12.Modified Shepard's Method(改进谢别德法)

    转载于:https://www.cnblogs.com/luoluoHome/archive/2010/08/16/1800389.html

    展开全文
  • 空间数据插值

    2018-04-28 11:11:00
    空间统计方向的讲义,针对空间数据的特性给出了几种常见的插值方法
  • 以二维空间为例,常见的插值问题是,给定点列 其中 , 寻找适当的连续可微函数 使得 . 例如最常用的三次样条插值, 是假设 在 上是三次多项式 , 其中 系数待定, 在此区间上需要满足 过两个样本点, 且在两个端点是连续...

    样条插值是常用的插值方法,用至多三次的多项式对样本点进行插值,满足曲线连续可微。以二维空间为例,常见的插值问题是,给定点列

    其中

    , 寻找适当的连续可微函数
    使得
    . 例如最常用的三次样条插值, 是假设
    上是三次多项式
    , 其中
    系数待定, 在此区间上需要满足
    过两个样本点, 且在两个端点是连续可微的, 即

    对于三次多项式而言有4个系数待定, 而这四个方程刚好确定了四个系数, 就可以得到插值函数.

    但有时候会遇到诸

    并不是严格单调递增的,例如这些有序点列在平面上转了一个圈,那么就不能直接用上面的方法, 毕竟最后得到的并不是一个"函数"了 (例如可能存在
    ). 那么这样如何得到一条光滑的曲线穿过这串有序点列呢? 其实也很容易. 引入 单调递增的序列
    , 构造新的两串有序点列

    对这两个点列分别进行样条插值, 分别得到连续可微的插值函数

    . 构造映射

    那么

    是一条连续可微的曲线.

    下面是用Python实现的实例

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['figure.figsize'] = [4,4]
    import scipy.interpolate as spi
    
    x = [np.cos(k) for k in np.arange(0,2*np.pi, 2*np.pi / 8)]
    y = [np.sin(k) for k in np.arange(0,2*np.pi, 2*np.pi / 8)]
    w = [k for k in np.arange(0,2*np.pi, 2*np.pi / 8)]
    
    X = spi.splrep(w, x, k = 3)
    Y = spi.splrep(w, y, k = 3)
    W = [k for k in np.arange(0,2*np.pi - 2*np.pi / 8, 1e-4)]
    
    plt.plot(spi.splev(W,X), spi.splev(W,Y), label = 'Interpolation', c = 'black');
    plt.scatter(x,y,label = 'Inital point', c = 'C0');
    plt.legend()
    plt.show()

    b58743df169cb35b5bb325b75b4d5fd1.png
    平面有序点列的三次样条插值
    展开全文
  • 薄板样条函数(TPS)是一种很常见的插值方法。因为它一般都是基于2D插值,所以经常用在在图像配准中。在两张图像中找出N个匹配点,应用TPS可以将这N个点形变到对应位置,同时给出了整个空间的形变(插值)。 2. 实现 1....

    最近项目用到了tps算法,opencv2封装的tps实现起来比较慢,于是用pytorch实现了一下,可以支持gpu加速,就很nice了,在这里记录一下!

    1. 简介

    薄板样条函数(TPS)是一种很常见的插值方法。因为它一般都是基于2D插值,所以经常用在在图像配准中。在两张图像中找出N个匹配点,应用TPS可以将这N个点形变到对应位置,同时给出了整个空间的形变(插值)。
    在这里插入图片描述

    2. 实现

    1. opencv的tps使用

    import cv2
    import numpy as np
    import random
    import torch
    from torchvision.transforms import ToTensor, ToPILImage
    
    DEVICE = torch.device("cpu")
    
    def choice3(img):
        '''
        产生波浪型文字
        :param img:
        :return:
        '''
        h, w = img.shape[0:2]
        N = 5
        pad_pix = 50
        points = []
        dx = int(w/ (N - 1))
        for i in range( N):
            points.append((dx * i,  pad_pix))
            points.append((dx * i, pad_pix + h))
    
        #加边框
        img = cv2.copyMakeBorder(img, pad_pix, pad_pix, 0, 0, cv2.BORDER_CONSTANT,
                                 value=(int(img[0][0][0]), int(img[0][0][1]), int(img[0][0][2])))
    
        #原点
        source = np.array(points, np.int32)
        source = source.reshape(1, -1, 2)
    
        #随机扰动幅度
        rand_num_pos = random.uniform(20, 30)
        rand_num_neg = -1 * rand_num_pos
    
        newpoints = []
        for i in range(N):
            rand = np.random.choice([rand_num_neg, rand_num_pos], p=[0.5, 0.5])
            if(i == 1):
                nx_up = points[2 * i][0]
                ny_up = points[2 * i][1] + rand
                nx_down = points[2 * i + 1][0]
                ny_down = points[2 * i + 1][1] + rand
            elif (i == 4):
                rand = rand_num_neg if rand > 1 else rand_num_pos
                nx_up = points[2 * i][0]
                ny_up = points[2 * i][1] + rand
                nx_down = points[2 * i + 1][0]
                ny_down = points[2 * i + 1][1] + rand
            else:
                nx_up = points[2 * i][0]
                ny_up = points[2 * i][1]
                nx_down = points[2 * i + 1][0]
                ny_down = points[2 * i + 1][1]
    
            newpoints.append((nx_up, ny_up))
            newpoints.append((nx_down, ny_down))
    
        #target点
        target = np.array(newpoints, np.int32)
        target = target.reshape(1, -1, 2)
    
        #计算matches
        matches = []
        for i in range(1, 2*N + 1):
            matches.append(cv2.DMatch(i, i, 0))
    
        return source, target, matches, img
    
    def norm(points_int, width, height):
    	"""
    	将像素点坐标归一化至 -1 ~ 1
        """
    	points_int_clone = torch.from_numpy(points_int).detach().float().to(DEVICE)
    	x = ((points_int_clone * 2)[..., 0] / (width - 1) - 1)
    	y = ((points_int_clone * 2)[..., 1] / (height - 1) - 1)
    	return torch.stack([x, y], dim=-1).contiguous().view(-1, 2)
    
    
    class TPS(torch.nn.Module):
    
        def __init__(self):
            super().__init__()
    
        def forward(self, X, Y, w, h, device):
    
            """ 计算grid"""
            grid = torch.ones(1, h, w, 2, device=device)
            grid[:, :, :, 0] = torch.linspace(-1, 1, w)
            grid[:, :, :, 1] = torch.linspace(-1, 1, h)[..., None]
            grid = grid.view(-1, h * w, 2)
    
            """ 计算W, A"""
            n, k = X.shape[:2]
            device = X.device
    
            Z = torch.zeros(1, k + 3, 2, device=device)
            P = torch.ones(n, k, 3, device=device)
            L = torch.zeros(n, k + 3, k + 3, device=device)
    
            eps = 1e-9
            D2 = torch.pow(X[:, :, None, :] - X[:, None, :, :], 2).sum(-1)
            K = D2 * torch.log(D2 + eps)
    
            P[:, :, 1:] = X
            Z[:, :k, :] = Y
            L[:, :k, :k] = K
            L[:, :k, k:] = P
            L[:, k:, :k] = P.permute(0, 2, 1)
    
            Q = torch.solve(Z, L)[0]
            W, A = Q[:, :k], Q[:, k:]
    
            """ 计算U """
            eps = 1e-9
            D2 = torch.pow(grid[:, :, None, :] - X[:, None, :, :], 2).sum(-1)
            U = D2 * torch.log(D2 + eps)
    
            """ 计算P """
            n, k = grid.shape[:2]
            device = grid.device
            P = torch.ones(n, k, 3, device=device)
            P[:, :, 1:] = grid
    
            # grid = P @ A + U @ W
            grid = torch.matmul(P, A) + torch.matmul(U, W)
            return grid.view(-1, h, w, 2)
    
    if __name__=='__main__':
        # 弯曲水平文本
        img = cv2.imread('data/test.jpg', cv2.IMREAD_COLOR)
        source, target, matches, img = choice3(img)
        # #opencv版tps
        # tps = cv2.createThinPlateSplineShapeTransformer()
        # tps.estimateTransformation(source, target, matches)
        # img = tps.warpImage(img)
        # cv2.imshow('test.png', img)
        # cv2.imwrite('test.png', img)
        # cv2.waitKey(0)
    
        #torch实现tps
        ten_img = ToTensor()(img).to(DEVICE)
        h, w = ten_img.shape[1], ten_img.shape[2]
        ten_source = norm(source, w, h)
        ten_target = norm(target, w, h)
    
        tps = TPS()
        warped_grid = tps(ten_target[None, ...], ten_source[None, ...], w, h, DEVICE)   #这个输入的位置需要归一化,所以用norm
        ten_wrp = torch.grid_sampler_2d(ten_img[None, ...], warped_grid, 0, 0)
        new_img_torch = np.array(ToPILImage()(ten_wrp[0].cpu()))
    
        cv2.imshow('test.png', new_img_torch)
        cv2.imwrite('test.png', new_img_torch)
        cv2.waitKey(0)
    

    3. 效果

    • 贴个效果图对比:
      在这里插入图片描述
      在这里插入图片描述

    上图可以看出,pytorch实现与cv2的tps的效果完全对齐,所以重点看耗时,接下来贴耗时的对比图(差距还是蛮大的,图片越大差距越大)
    在这里插入图片描述
    如果对你有帮助的话,希望给个赞,谢谢~


    参考1:TPS 薄板样条插值 python的opencv实现
    注,这个参考可以初步了解使用cv2的tps使用,但是具体细节上还存在错误

    参考2:薄板样条函数(Thin plate splines)的讨论与分析
    参考3:数值方法——薄板样条插值(Thin-Plate Spline)

    展开全文
  • 《图像处理与分析:变分、pde、小波及随机方法》首先介绍了对于现代图像分析和处理有重要意义的一般数学、物理...本书讨论四种最常见的图像处理任务如图像降噪、图像去模糊、图像修复或插值以及图像分割的建模和计算。
  • 图像处理与分析——变分,PDE,小...本书讨论四种最常见的图像处理任务如图像降噪、图像去模糊、图像修复或插值以及图像分割的建模和计算,这些实际的图像处理任务在统一的数学框架下能够得到完整的分析和深入的理解。
  • 文章目录0. 颜色空间1. 图像滤波(1) 图像滤波(2) 图像增强——常见边缘检测算子2....常见颜色空间: RGB HSI(色调、饱和度、明度) YUV CMYK OpenCV为什么是BGR? 早期bmp等图像格式中BGR更...

    0. 颜色空间

    常见颜色空间:

    • RGB
    • HSI(色调、饱和度、明度)
    • YUV
    • CMYK

    OpenCV为什么是BGR?

    • 早期的bmp等图像格式中BGR更广泛一点,所以opencv也遵循这个格式

    • BGR与RGB格式转换

      img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
      # 或
      img_rgb = img[:,:,::-1] # 因为img[:,:,0]为b分量, img[:,:,1]为g,img[:,:,2]为r分量
      

      注:python的list中,listA[i:j:s],表示从i到j的左闭右开区间,s表示步长。

    • opencv中通道数是在最后面,也就是上面的不管rgb还是bgr都是[h,w,c]的格式,有时候需要将通道数放到前面,使用transpose方法

      img_channel_first = img.transpose((2,0,1))
      

    1. 图像滤波

    (1) 图像滤波

    • 图像噪声

      • 高斯噪声,噪声的概率密度函数服从高斯分布,一般来自于器件的热噪声、电路噪声;高斯白噪声,功率谱密度均匀分布(高斯滤波)
      • 椒盐噪声,亮暗点噪声(中值滤波)
      • 泊松噪声,概率密度函数服从泊松分布(泊松分布适合于描述单位时间内随机事件发生的次数的概率分布),一般也是由于器件的光电转换过程导致
      • 量化噪声
    • 滤波器

      (一般在计算模板的时候就对系数和进行归一化处理了,因此使用模板的时候只需要求加权和)

      • 高斯滤波器:根据高斯函数的形状来选择权值的线性平滑滤波器

      • 均值滤波:窗口下取均值

      • 中值滤波:窗口下取中位数

      • 双边滤波:非线性滤波,具有保持边缘、平滑降噪的功能。

        ​ 对一幅图像而言,边缘区域像素值变化快,而非边缘区域像素变化比较平坦。高斯滤波并没有对这两种区域加以区分,因此会导致边缘模糊。若要比较好的保留图像边缘,就必须引入一个变量去衡量当前像素变化的剧烈程度,所以双边滤波其实就是引入了这样一个图像像素域的核。原来的高斯滤波中就是一个空间域的核,它是一个二维的高斯函数;像素域核就是衡量像素变化剧烈程度的函数。它们俩共同作用的结果:在图像的平坦区域,像素值变化很小,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;在图像的边缘区域,像素值变化很大,像素范围域权重变大,从而保持了边缘的信息

        dst = cv2.bilateralFilter(src=image,d=0,sigmaColor=100,sigmaSpace=15)
        

        ​ 其模板权重的计算方法:先根据sigmaSpace核sigmaColor计算各自的高斯函数下的权重,然后在对应像素位置将二者的乘积作为模板权重。之后就是像一般的卷积那样像素值加权求和。

        ​ Ref:双边滤波原理

    (2) 图像增强——常见边缘检测算子

    • sobel

      边缘检测,边缘是像素值变化比较剧烈的位置,在连续函数上就是求梯度,在离散的数字图像上就是求差分。sobel算子就是求的水平或者竖直方向的一阶差分,同时带有一定的平滑效果。

      下图给出了两种sobel算子的功能。从本质上来看,上面这个sobel算子是水平差分+垂直平滑的结果,下面这个是水平平滑+垂直差分的结果。

      【优点】计算简单,速度快

      【缺点】计算方向单一,只有水平和垂直方向,难以应对复杂纹理;根据差分结果直接用单一阈值进行判断是否边缘像素,对有的噪声情况无法进行很好的处理

      img

    • canny

      虽然比较古老,但却是传统图像处理中,边缘检测的首选,性能很好。它主要包括以下四个步骤:

      • 高斯滤波,对图像进行平滑

      • 计算梯度大小和方向

        • 计算梯度大小,也使用类似sobel的梯度检测算子。它的模板系数计算方法是对高斯函数求梯度并标准化得到的,然后计算得到的也是水平和垂直两个方向的梯度大小

        • 计算梯度方向(角度)

          img

      • 利用非极大值抑制剔除上一步得到的梯度图像中大部分的非边缘点。这里的非极大值抑制思路主要为:如果一个像素点属于边缘,那么这个像素点在梯度方向上的梯度值是最大的。否则不是边缘,将灰度值设为0。如下图,梯度方向均为垂直向上,则取梯度方向上最大值为边缘点,这样理论上能够形成细且准确的单像素边缘

        img

      • 使用双阈值进行边缘连接。经过以上三步之后得到的边缘质量已经很高了,但还是存在很多伪边缘,因此Canny算法中所采用的算法为双阈值法,具体思路为选取两个阈值,将小于低阈值的点认为是假边缘置0,将大于高阈值的点认为是强边缘置1,介于中间的像素点需进行进一步的检查。具体实现的时候,根据高阈值图像中把边缘链接成轮廓,当到达轮廓的端点时,该算法会在断点的8邻域点中寻找满足低阈值的点,再根据此点收集新的边缘,直到整个图像闭合

      canny算子在opencv中的使用:

      dst = cv2.Canny(img, thresh1, thresh2) #两个threshold前者为低阈值,后者为高阈值
      

      Ref:https://zhuanlan.zhihu.com/p/59640437

    2. HoG特征与SIFT特征

    (1) HoG

    参考:HoG特征
    ① 对图像进行预处理,主要是伽马矫正和灰度化,尽量去除光照的影响
    ② 对原图中的每一点,计算其梯度值,得到其梯度的大小和方向
    例如,水平方向梯度gx:做水平差分;竖直方向梯度gy:做竖直差分。
    总的梯度大小g = sqrt(gx2+gy2)
    总的梯度方向θ = arctan(gx/gy)
    ③ 计算梯度直方图
    将8x8大小的区域划分为一个cell,其元素共有8x8x2=128个关于梯度的值,将其按角度分到9个bin中,这9个bin是将180度划分为9份得到。这样,就得到一个长度为9的数组(梯度的直方图)。一般来说,观察梯度方向的主要分布范围,就可以大致认为该8x8区域的具有某个方向的边缘。HoG是对边界敏感,对灰度变化平坦的区域不敏感。

    img

    img

    ④ 以4个cell为一个block进行归一化,进一步降低光照影响
    一个block事实上对应16x16的区域。4个cell,每个cell经过梯度直方图计算已经转化为一个长度为9的vector,现在一个block相当于包含一个长度为4x9=36的vector。这里的归一化,就是对这个长度为36的向量进行归一化

    img

    ⑤ 得到HoG特征向量
    注意block是在整张图上滑动的,因此对于64x128的图像,共7x15个block。
    因此一张图像的HoG向量为7x15x36 = 3780
    得到HoG特征向量之后,一般用svm进行分类。

    (2) SIFT 特征

    SIFT全称为scale invariant feature transform,即尺度不变特征变换。SFIT特征对于旋转、缩放、亮度等具有较好的不变性。

    • 特点

      • 描述图像的局部特征,能够对旋转(生成特征描述子时进行主方向校正)、尺度(通过差分高斯金字塔保证)、亮度(通过特征归一化保证)等保持不变,同时对视角变化、仿射变换、噪声等也具有一定的鲁棒性。
      • 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
      • 多量性,即使是很少几个物体也可以产生大量sift特征
      • 高速,经优化的sift匹配算法能够达到实时效果
      • 可以很方便的与其他特征向量联合
    • 4个主要步骤

      • 尺度空间的极值检测,搜索潜在的感兴趣点
      • 特征点的精确定位
      • 特征方向赋值
      • 特征点描述【重点】
    • 尺度空间的极值检测

      为了搜索潜在的感兴趣点(特征点),由于这样的点应该在不同尺度、不同模糊程度上,先要求解差分高斯图像。

      首先,对原图像进行不同程度的高斯模糊,方差倍增,构成高斯尺度金字塔;对该金字塔的每一个图像进行一组等比例的下采样,得到不同空间尺度下的高斯尺度金字塔。

      然后,对于同一个高斯尺度金字塔内的各个图像,它们之间的区别主要是高斯模糊的程度不同,为了检测出在不同模糊情况下都存在的特征点,较好的做法是使用高斯拉普拉斯算子(LoG),但是它计算量比较大,这里采用差分高斯(DoG)来替代。其计算方法简单,如下:
      在这里插入图片描述
      也就是说,将两个相邻的不同模糊程度的高斯空间的图像相减,就得到了差分高斯的响应图像。(k表示相邻两图的高斯方差成k倍)。将同一组内相邻的图像两两相减,就得到了差分高斯金字塔

      接下来,为了寻找极值点,同一个金字塔内,每个像素点要和其图像邻域(物理意义上相邻的像素)和尺度邻域(相邻高斯尺度空间)的所有相邻点进行比较,当它大于/小于所有相邻点时,这个点就是极值点。见下图,所有绿色点都是x点的“相邻点”。

      极值检测

      尺度变化连续性【待理解】:DoG金字塔每组首末两张图像无法比较求极值,这里有一点特殊处理。见参考文献。

    • 特征点的精确定位(对不好的特征点进行剔除)

      SIFT特征提取的关键点是DoG图像邻域(包括高斯尺度邻域和图像邻域)像素值的极值点(DoG做了差分,自身的像素值已经表示梯度了)。

      但DoG的局部极值点是在离散空间搜索得到的,不一定是真正意义上的极值点。因此需要将不满足条件的点剔除。可以通过尺度空间DoG函数进行曲线拟合来寻找极值点,其本质是对DoG局部曲率非常不对称的点进行剔除。这一步主要去除的是对比度低于一定阈值的特征点以及不稳定的边缘相应点(通过检测主曲率来实现)

    • 求取特征点的主方向(与HoG特征求解思路相同)

      经过上面的步骤,找到了在不同尺度下都存在的特征点,为了实现图像的旋转不变性,需要对特征点的方向进行赋值。对某个特征点,可以确定其对应的高斯尺度图像,计算以该特征点为中心、3×1.5倍标准差范围内各个点的梯度大小和方向角:在这里插入图片描述
      可以将[0,360°]划分为10个范围,按梯度方向角的大小统计梯度直方图(每个范围内的梯度累加),直方图的峰值即为特征点的主方向(实际中,应该还有平滑和插值拟合等操作)。

      在梯度直方图中,当存在一个相当于主峰值80%能量的柱值时,则可以将这个方向认为是该特征点辅助方向。所以,一个特征点可能检测到多个方向(也可以理解为,一个特征点可能产生多个坐标、尺度相同,但是方向不同的特征点)

      Lowe在论文中指出:15%的关键点具有多方向,而且这些点对匹配的稳定性很关键

      得到特征点的主方向后,对于每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向。由此可以确定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点

    • 生成特征描述

      通过上面的步骤已经得到了SIFT特征点的位置、尺度(个人理解为高斯模糊程度)和方向信息,下面需要用一组向量来对关键点进行描述。这组向量既包含了特征点本身的信息,也包含了特征点周围对他有贡献的其他像素点的信息。描述子应具有较高的独立性,以保证匹配率。

      SIFT特征描述子的生成包含以下三个步骤:

      • 校正旋转主方向,确保旋转不变性
      • 生成描述子,为一个128维特征向量
      • 对特征向量进行归一化,进一步去除光照影响

      校正旋转主方向,是为了保持特征向量的旋转不变性。这里的实现方法为:以特征点为中心,在其邻域内将坐标轴旋转到特征点主方向上,旋转后邻域内像素的新坐标为:
      在这里插入图片描述
      接下来,以特征点为中心,选取其周围16×16的像素,每4×4个划分为一组;求得每个像素的梯度大小和方向后,在4×4窗口内统计梯度直方图,这里将[0,360°]划分为8个方向,因此每个4×4窗口产生一个8维向量;而一共有16个窗口,因此每个特征点产生一个128维向量(这里的16个窗口,是16个直梯度直方图,相当于特征点周围的16个种子点,每个种子点有8个方向的信息)。

      这种邻域方向性信息联合增强了算法的抗噪声能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。 这里写图片描述

    Ref:SIFT特征原理

    3. 霍夫变换

    霍夫变换是对canny等算子处理后的边缘图像,求解图中的直线、圆等目标。其基本思路为:将特定图像上的点变换到一组参数空间上,根据参数空间中点的累计结果,找到一个极大值对应的解,那么这个解就对应着我们要寻找的几何形状的参数(如直线的斜率和截距、圆的圆心和半径)

    因此,关键在于找到这个参数空间,然后对其进行统计。

    (1) 直线检测

    假设有一条直线L,原点到该直线的垂直距离为p,垂线与x轴夹角为θ ,那么这条直线是唯一的,且直线的方程为 ρ=xcosθ+ysinθ

    img

    该直线上的所有点都只有满足一组唯一的共同参数(ρ,θ),这个(ρ,θ)决定的直线就是检测到的直线。尽管对于每个点自身而言,可以对应许多(ρ,θ),因为一个点可以出现在多条直线上。

    因此,对于每个点,我们去求解它所在直线的可能值,能够获得一系列(ρ,θ)参数,将一系列参数画在极坐标上,见下面右图。右图上的每一个点,对应直角坐标系上的一条直线

    img

    而对于原直线上的每一个点,都可以在参数空间画出这么一个曲线,接下来只需要统计在参数空间中这些曲线主要相交在哪个点,这个点对应的(ρ,θ)就是原空间中直线的参数。

    img

    因此霍夫变换直线检测的步骤如下:

    • 对原图使用canny算子等方法进行边缘提取
    • 将参数空间(ρ,θ) 量化,赋初值一个二维矩阵M,M(ρ,θ) 就是一个累加器了
    • 对图像边界上的每一个点进行变换,变换到属于哪一组(ρ,θ) ,就把该组(ρ,θ) 对应的累加器数加1。具体为,给定θiθ_i,根据ρi=xcosθi+ysinθiρ_i=xcosθ_i+ysinθ_i计算出ρiρ_i,然后将M(ρiρ_i,$ θ_i $)处的值+1。
    • 所有点处理完后,找到M矩阵上大于阈值T的点,这些点的参数值就对应原空间的一条直线。

    霍夫变换直线检测的问题:

    • Hough变换进行参数空间映射时需要对每个边缘点进行多次正弦曲线计算,这就大大的加重了算法的计算负担,同时也降低了其实时性
    • 在进行Hough变换之前需要对参数空间进行量化与离散化,但在离散化之后,参数空间中本来连续的函数被离散函数所取代,这就造成了变换之后得到的(A巧的值与原有值之间存在一定的误差
    • 上述方法对于参数空间中的离散点只进行一次投票,而在一次投票过程中常常出现伪峰值被判定为目标直线的情况。这点明显的不足严重的制约了其适用范围

    改进:

    • 不采用计数器+一次投票确定参数,而在计算完毕参数空间后,采用聚类算法,确定聚类中心。

    (2) 霍夫变换圆检测

    与直线检测类似,不过圆检测的参数空间是个三维空间(a,b,r),分别对应圆心坐标和半径。对于圆上的每一点,满足

    ​ $ (x-a)2+(y-a)2=r^2 $

    因此同样对其参数空间进行计数统计,找到满足点数最多的圆参数。

    霍夫变换圆检测的缺点:

    • 需要将参数空间离散为一个三维空间(a,b,r),送样就使得算法所需的计算时间与存储空间过大,这一问题严重制约了该算法在实际检测中的应用
    • 该算法需要对圆形的半径进行提前预判,这就导致检测过程中可能出现漏检、误检的可能,这也降低了该算法对于圆形提取的精确性

    优化方案:

    • 在OpenCV的霍夫圆检测函数实现中,为提升速度,采用的并非是直接对三个参数进行投票,而是另外一种通过计算梯度来对两侧可能出现圆心的位置进行投票的方法。具体可以查看该函数的实现。

    一些观点

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yFyfx8Ye-1587227089216)(C:\Users\LUO YUJIE\AppData\Roaming\Typora\typora-user-images\image-20200407180059250.png)]

    • 霍夫变换直线检测这样的传统图像处理方法怎么与深度学习方法结合起来?
      • 作为图像预处理,平滑去噪、光线校正、畸变校正、变换等
      • 作为数据增强手段,各种增强,噪声,变形
      • 作为后处理手段,比如先通过目标检测分割出目标区域,然后再做霍夫变换直线检测(参考这个:https://zhuanlan.zhihu.com/p/77666653)

    4. 开闭运算 腐蚀膨胀

    待更新

    5. 插值

    待更新

    展开全文
  • 空间统计学算法5

    2008-03-14 13:56:00
    四、二、三维等参单元法分析 常见的需要建立内插形函数的... 图3 形函数单元体示意图 一维等参单元的插值方法同样可以推广到二、三维。在二维单参单元常见的基本类型是四节点四边形等参单元(B), B1、B2、B3、B
  • 薄板样条函数(Thin plate splines)讨论与分析

    万次阅读 多人点赞 2014-07-27 03:17:14
    薄板样条函数(TPS)是一种很常见的插值方法。因为它一般都是基于2D插值,所以经常用在在图像配准中。在两张图像中找出N个匹配点,应用TPS可以将这N个点形变到对应位置,同时给出了整个空间的形变(插值)。 一般人...
  • 2、常见的预处理方法 (1)灰度化:将 RGB图像改为灰度图像,主要有分量法、加权平均法等; (2)几何变换:主要通过插值法对图像进行空间变换,减少图像误差信息; (3)图像增强:增强目标图像信息,包括...
  • 介绍本节内容将介绍几种常见的搜索算法(主要包含顺序搜索,二分搜索,插值搜索,跳越搜索,快速搜索,哈希搜索)的算法原理,算法复杂度的分析,以及如何实现。知识点顺序搜索二分搜索插值搜索跳越搜索快速搜索哈希...
  • 3.1.2 数组的常见运算 3.2 矩阵操作 3.2.1 创建矩阵 3.2.2 改变矩阵大小 3.2.3 重构矩阵 3.3 矩阵元素运算 3.3.1 矩阵加减运算 3.3.2 矩阵乘法运算 3.3.3 矩阵除法运算 3.3.4 矩阵幂运算 ...
  • 为了使用户能够更好地操作MATLAB,本书中示例命令已记录在M 文件及其他相关文件中,用户可以将相关目录设置为工作目录,直接使用M 文件进行操作,以便快速掌握MATLAB 使用方法。 1.3.3 工作区 1.4 MATLAB R...
  • 附件中是一些代码的集合,主要是一些比较常见的GIS功能的实现方法,我用C#+AE都实现了,可能包括基本GIS地图操作,空间分析,几何或交通网络分析等,内容还不错,可以让不太懂的人学习一下,也可以让比较懂的人借鉴一下,因为...
  • 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 399 ∷相关函数:labs函数 2.1.2 求...
  • 一、赋范空间定义及常见的赋范空间 二、由范数导出的度量 三、等价范数 四、赋范空间的子空间 3.2收敛序列与连续映射 一、序列的收敛性 二、赋范空间中的无穷级数 三、映射的连续性 3.3赋范空间的完备性 一、Cauchy...
  • scipy复习

    2021-04-03 08:48:15
    从优化和数据拟合开始,因为这些是一些最常见的任务,然后通过插值、集成、空间分析、聚类、信号和图像处理、稀疏矩阵和统计。 2.最优化和最小化 线性回归,找到一个函数的最小值和最大值,确定一个函数的根,并找到...
  • Pillow 为我们提供了常见的图像读取和处理操作,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。并且Pillow可以与iPython notebook无缝集合,是一种
  • 3.3 色彩空间的转换方法 112 3.3.1 RGB转换到HSV的方法 113 3.3.2 RGB转换到HSI的方法 114 3.3.3 RGB转换到YUV的方法 115 3.3.4 RGB转换到YCbCr的方法 116 3.4 本章实例:Photoshop 色彩编辑器 118 3.4.1 需求分析 ...
  • 消除路径追踪算法中常见的坏像素。 R20中的ProRender是产品可视化和其他类型渲染的绝佳选择,但当然这只是管中窥豹,ProRender最终将提供更多功能,并更深入地集成在将来的Cinema 4D版本中。 PBR工作流程 新PBR...
  • FSCE借助对比学习的思想对相关候选框进行编码优化其特征表示,加强特征的类内紧凑和类间相斥,最后方法常见的COCO和Pascal VOC数据集上都得到有效提升。 关键词:小样本目标检测,对比学习 论文链接:...
  • 大话数据结构

    2018-12-14 16:02:18
    简单的说,就是把我们要压缩的文本进行重新编码,以达到减少不必要的空间的技术。压缩和解压缩技术就是基于赫夫曼的研究之上发展而来,我们应该记住他。 6.12.1赫夫曼树 200 6.12.2赫夫曼树定义与原理 203 6.12.3...
  • C语言通用范例开发金典.part2.rar

    热门讨论 2012-08-31 14:18:18
    2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 399 ∷相关函数:labs函数 2.1.2 求...
  • C 开发金典

    2013-06-20 16:20:03
    2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 399 ∷相关函数:labs函数 2.1.2 求...
  • 介绍下机器学习和深度学习中常见的参数类算法和非参数类算法 随机梯度下降 神经网络训练如何解决过拟合和欠拟合 L1正则化和L2正则化区别,具体有何用途 L1正则化相比于 L2正则化为何具有稀疏解 2. C++开发...
  • C语言通用范例开发金典.part1.rar

    热门讨论 2012-08-31 14:09:26
    2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 399 ∷相关函数:labs函数 2.1.2 求...
  • 在栅格数据和矢量数据集成的环境下进行空间分析操作(ARCCIS在环保与流行病统计分析以及环境监测的应用为例介绍),并介绍地统计学基础以及一种先进的空间插值分析方法(以ARCCIS在生态项目中的应用为例 主讲人:GIS...
  • SciPy是一个开源Python算法库和数学工具包,SciPy包含模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用计算。其功能与软件MATLAB...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

常见的空间插值方法