zoukankan      html  css  js  c++  java
  • SIFT特征匹配处理

    一、SIFT算法特征原理

    SIFT即尺度不变特征转换,它用来检测图像的局部性特征,在空间尺度中寻找极值点,提取这点的位置、尺度、旋转不变量。这些关键点是一些十分突出,不会因光照和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等,所以与影像的大小和旋转无关,对光线、噪声、视角改变的容忍度也很高。

           SIFT特征检测有四步:

    1.尺度空间的极值检测:搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和选择不变的兴趣点。

    2.特征点定位:在每个候选的位置上,通过一个拟合精细模型来确定位置尺度,关键点的选取依据他们的稳定程度。

    3.特征方向赋值:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性。

    4.特征点描述:在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变换。

    二、SIFT特征匹配处理

      对两张图片进行SIFT特征匹配处理

        1.两张差异较大的集美大学尚大楼

          原图:

                                  

                                               图1                                                   图2

          SIFT特征匹配:

          

                                                                         图3

        2. 两张差异较小的集美大学尚大楼

               原图:

             

                                   图4                                                       图5

          SIFT特征匹配:

          

     代码:

     1 import io
     2 from PIL import Image, ImageTk
     3 import tkinter as tk
     4 
     5 import cv2
     6 import numpy as np
     7 MIN_MATCH_COUNT = 4
     8 
     9 img1 = cv2.imread("C:/Users/w/PycharmProjects/sift/picture/1.jpg")
    10 img2 = cv2.imread("C:/Users/w/PycharmProjects/sift/picture/16.jpg")
    11 g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    12 g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    13 sift = cv2.xfeatures2d.SIFT_create()
    14 match = cv2.FlannBasedMatcher(dict(algorithm =2, trees =1), {})
    15 kp1, de1 = sift.detectAndCompute(g1,None)
    16 kp2, de2 = sift.detectAndCompute(g2,None)
    17 m = match.knnMatch(de1, de2, 2)
    18 m = sorted(m,key = lambda x:x[0].distance)
    19 ok = [m1 for (m1, m2) in m if m1.distance < 0.7 * m2.distance]
    20  med = cv2.drawMatches(img1, kp1, img2, kp2, ok, None)
    21 
    22 cv2.imwrite("C:/Users/w/PycharmProjects/sift/picture/b.jpg", med)
    23 #
    24 # cv2.imshow("0", med)
    25 # cv2.waitKey()
    26 # cv2.destroyAllWindows()
    27 
    28 
    29 def resize(w, h, w_box, h_box, pil_image):
    30     f1 = 1.0 * w_box / w  # 1.0 forces float division in Python2
    31     f2 = 1.0 * h_box / h
    32     factor = min([f1, f2])
    33     width = int(w * factor)
    34     height = int(h * factor)
    35     return pil_image.resize((width, height), Image.ANTIALIAS)
    36 
    37 root = tk.Tk()
    38 # size of image display box you want
    39 # 期望图像显示的大小
    40 w_box = 800
    41 h_box = 1000
    42 
    43 # 以一个PIL图像对象打开
    44 pil_image = Image.open(r'C:/Users/w/PycharmProjects/sift/picture/b.jpg')
    45 
    46 # get the size of the image
    47 # 获取图像的原始大小
    48 w, h = pil_image.size
    49 
    50 # resize the image so it retains its aspect ration
    51 # but fits into the specified display box
    52 # 缩放图像让它保持比例,同时限制在一个矩形框范围内
    53 pil_image_resized = resize(w, h, w_box, h_box, pil_image)
    54 
    55 # convert PIL image object to Tkinter PhotoImage object
    56 # 把PIL图像对象转变为Tkinter的PhotoImage对象
    57 tk_image = ImageTk.PhotoImage(pil_image_resized)
    58 
    59 # put the image on a widget the size of the specified display box
    60 # Label: 这个小工具,就是个显示框,小窗口,把图像大小显示到指定的显示框
    61 label = tk.Label(root, image=tk_image, width=w_box, height=h_box)
    62 # padx,pady是图像与窗口边缘的距离
    63 label.pack(padx=5, pady=5)
    64 root.mainloop()
    SIFT Code

    三、SIFT和Harris特征匹配处理的对比 

      例如,下图是福建省厦门市集美大学的尚大楼的图片:

            

    用sift算法和Harris算法找到关键点并绘制关键点:  

                    

                    SIFT算法                          Harris算法

    SIFT代码:

     1 import cv2
     2 import numpy as np
     3 
     4 img = cv2.imread('C:/Users/w/PycharmProjects/untitled2/11.jpg')
     5 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
     6 sift = cv2.xfeatures2d.SIFT_create()
     7 
     8 kp = sift.detect(gray, None)  # 找到关键点
     9 
    10 img = cv2.drawKeypoints(gray, kp, img)  # 绘制关键点
    11 
    12 cv2.imshow('sp', img)
    13 cv2.waitKey(0)
    SIFT Code

    Harris代码:

     1 import cv2
     2 import numpy as np
     3 
     4 filename = 'C:/Users/w/PycharmProjects/sift/picture/11.jpg'
     5 
     6 img = cv2.imread(filename)
     7 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
     8 gray = np.float32(gray)
     9 #图像转换为float32
    10 dst = cv2.cornerHarris(gray,2,3,0.04)
    11 #result is dilated for marking the corners, not important
    12 dst = cv2.dilate(dst,None)#图像膨胀
    13 # Threshold for an optimal value, it may vary depending on the image.
    14 #print(dst)
    15 #img[dst>0.00000001*dst.max()]=[0,0,255] #可以试试这个参数,角点被标记的多余了一些
    16 img[dst>0.01*dst.max()]=[0,0,255]#角点位置用红色标记
    17 #这里的打分值以大于0.01×dst中最大值为边界
    18 
    19 cv2.imshow('dst',img)
    20 if cv2.waitKey(0) & 0xff == 27:
    21     cv2.destroyAllWindows()
    Harris Code

       SIFT特征检测:SIFT从理论上说是一种相似不变量,即对图像尺度变化和旋转是不变量。然而,由于构造SIFT特征时,在很多细节上进行了特殊处理,使得SIFT对图像的复杂变形和光照变化具有了较强的适应性,同时运算速度比较快,定位精度比较高。如:
      (1)在多尺度空间采用DOG算子检测关键点,相比传统的基于LOG算子的检测方法,运算速度大大加快;
      (2)关键点的精确定位不仅提高了精度,而且大大提高了关键点的稳定性;
      (3)在构造描述子时,以子区域的统计特性,而不是以单个像素作为研究对象,提高了对图像局部变形的适应能力;

      Harris特征检测:在计算机视觉中,通常需要找出两帧图像的匹配点,如果能找到两幅图像如何相关,就能提取出两幅图像的信息。我们说的特征的最大特点就是它具有唯一可识别这一特点,图像特征的类型通常指边界、角点(兴趣点)、斑点(兴趣区域)。角点就是图像的一个局部特征,应用广泛。harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对L型角点检测精度高,但由于采用了高斯滤波,运算速度相对较慢,角点信息有丢失和位置偏移的现象,而且角点提取有聚簇现象。

    四、遇到的问题:报错:Read timed out

    1.先下载opencv-python3.4.2.16,

    直接在CMD命令窗口里输入: pip install opencv-python==3.4.2.16

    如果在安装时报错:

    pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

    那就在命令窗口里输入:

    pip install opencv-python==3.4.2.16 --default-timeout=1000

    下载成功:

    2.再下载opencv-contrib-python3.4.2.16,

    输入:

    pip install opencv-contrib-python==3.4.2.16 --default-timeout=1000

    下载成功:

  • 相关阅读:
    测试思想-流程规范 关于预发布环境的一些看法
    Jenkins 开启用户注册机制及用户权限设置
    Jenkins 利用Dashboard View插件管理任务视图
    Loadrunner 脚本开发-从文件读取数据并参数化
    SVN SVN合并(Merge)与拉取分支(Branch/tag)操作简介
    测试思想-流程规范 SVN代码管理与版本控制
    Python 关于Python函数参数传递方式的一点探索
    接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]
    Python 解决Python安装包时提示Unable to find vcvarsall.bat的问题
    lintcode :链表插入排序
  • 原文地址:https://www.cnblogs.com/wenbozhu/p/10548794.html
Copyright © 2011-2022 走看看