zoukankan      html  css  js  c++  java
  • SIFT提取特征

    SIFT特征提取:

      角点检测:

      Morvavec角点检测算子:基于灰度方差的角点检测方法,该算子计算图像中某个像素点沿水平、垂直方向上的灰度差异,以确定角点位置

      Harris角点检测算子:不止考察水平,垂直4个方向上的灰度差异,而是考察了所有方向上的灰度差异,并且具有旋转不变性和部分放射变换的稳定性

      Shi-Tomasi角点检测算子:通过考察自相关矩阵M的两个特征值中的较小者来确定角点,大部分情况下,有比Harris更好的检测效果。

      FAST算子:通过考察像素点与其邻域内16个像素点的差异来确定特征点(角点),并且通过分割测试算法对检测效率做了极大的提升。

      

      SIFT算子(Scale Invariant Feature Transform):尺度不变特征变换(尺度不变:按比例缩放

      基于尺度空间的,对图像缩放,旋转,甚至仿射变换保持不变性的图像局部特征描述算子。SIFT提取图像的局部特征,在尺度空间中寻找极值点,并提取出其位置,尺度,方向信息。

      算法实质:在不同的尺度空间中查找关键点(特征点),计算关键点的大小,方向,尺度信息,利用这些这些信息组成关键点对特征点进行描述,sift所查找的关键点都是十分突出,不会因为光照,仿射和噪声等因素而变换的稳定的特征点。匹配的过程就是匹配关键点(特征点)的过程。流程如下:

    参考博客:https://blog.csdn.net/hxg2006/article/details/80398701


    Dense-SIFT

       图像识别问题之所以采用密集采样,是因为密集采样后的点,会通过训练后的分类器进行进一步的筛选。在研究目标图像表示或者理解时,dense sift 更好,因为即使密集采样的区域不能够被准确匹配,这块区域也包含了表达图像内容的信息。 

     


     sif提取特征

    输入:一张图像,设置的长宽的最大值

      每次移动长度的参数

    1.图像转换为double类型,如果为rgb,先转成灰度图像,再转换为double类型,否则直接转为double类型

    2.读取图像的长宽,是否大于输入的图像的最大值,如果大于,则按比例缩小图像

      I = imresize(I, maxImSize/max(im_h, im_w), 'bicubic');
      [im_h, im_w] = size(I);

    3.使用稠密sift提取特征

     1)将三维转换成两维:i=mean(i,3)

     2)归一化:i=i /max(i(:))   max(i(:))所有点的最大值

     3)在0到2π之间截取16段,每一段长度:angle_step = 2 * pi / num_angles

    angle_step = 2 * pi / num_angles;
    angles = 0:angle_step:2*pi;

    angles(num_angles+1) = []; % bin centers

     4)生成高斯低通滤波器

      f_wid = 4 * ceil(sigma) + 1; % ceil:向上取整
      G = fspecial('gaussian', f_wid, sigma);G是5×5大小的矩阵

       [GX,GY] = gradient(G);求梯度

      GX = GX * 2 ./ sum(sum(abs(GX)));%2与矩阵中对应元素相除
      GY = GY * 2 ./ sum(sum(abs(GY)));%得到了GX,GY,分别为5×5的

      5)根据滤波器GX,GY,在水平方向和垂直方向对图像I进行滤波(滤波之后和原来图像大小相同)

      https://blog.csdn.net/sxj0820/article/details/79883233(filter2方法讲解) 

      I_X = filter2(G_X, I, 'same'); % vertical edges
      I_Y = filter2(G_Y, I, 'same'); % horizontal edges

       计算反正切

      I_theta = atan2(I_Y,I_X);

      去除I_theta中不是数据的情况 I_theta(find(isnan(I_theta)))=0

     6)计算网格:

      采样的图像块,64×64

      移动16个像素

      网格大小27×37

      收集的块个数:999个 

    grid_x = patch_size/2:grid_spacing:wid-patch_size/2+1;(37)
    grid_y = patch_size/2:grid_spacing:hgt-patch_size/2+1;(27)

     7)计算方向图片

      计算每一个方向通道

    % compute each orientation channel
    tmp = (cosI*cos(angles(a))+sinI*sin(angles(a))).^alpha;
    tmp = tmp .* (tmp > 0);

    % weight by magnitude
    I_orientation(:,:,a) = tmp .* I_mag;

    % Outputs:
    [grid_x,grid_y] = meshgrid(grid_x, grid_y);
    [nrows, ncols, cols] = size(sift_arr);

    规范化sift描述符

    sift_arr = reshape(sift_arr, [nrows*ncols num_angles*num_bins*num_bins]); 

    sift_arr = normalize_sift(sift_arr);

    sift_arr = sift_arr';

    大佬对sift算法的解读

    https://blog.csdn.net/molihong28/article/details/89296677

    http://www.doc88.com/p-3758093643565.html

      

  • 相关阅读:
    Daliy Algorithm (dp,模拟)-- day 80
    Daliy Algorithm (dp,堆)-- day 79
    Mybatis一级缓存和二级缓存 Redis缓存
    简单排序
    java一个大接口拆用多线程方式拆分成多个小接口
    集群环境下Shiro Session的管理
    递归和快速排序
    分布式定时任务
    Redis集群架构
    IO流
  • 原文地址:https://www.cnblogs.com/shuangcao/p/11556126.html
Copyright © 2011-2022 走看看