【Python】:SIFT算法的实现

这篇具有很好参考价值的文章主要介绍了【Python】:SIFT算法的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

✨博客主页:王乐予🎈
✨年轻人要:Living for the moment(活在当下)!💪
🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法】


本文侧重于如何使用Python语言实现SIFT算法

所有程序已打包:基于OpenCV-Python的SIFT算法的实现

😺一、什么是SIFT算法

  SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。

😺二、准备工作

🐶2.1 实验设备

  本文在Windows10系统上,使用pycharm软件完成所有实验。

🐶2.2 OpenCV安装

  我们可以使用OpenCV库中的cv2.xfeatures2d.SIFT_create()函数实现SIFT,但由于专利保护,很多版本的OpenCV库已无法提供该函数,目前仅3.4.2.16版本的OpenCV库可使用此函数。

安装教程
  (1)查看当前版本opencv:进入cmd(组合键win+R,输入cmd),输入conda list,查看当前pycharm所有库并找到opencv-python,若找不到库,说明没有安装。
  (2)卸载原版本(在cmd中输入:pip uninstall opencv
  (3)安装新版本(在cmd中输入:pip install opencv-python==3.4.2.16 -i "https://pypi.doubanio.com/simple/"
  (4)安装附属库(在cmd中输入:pip install opencv-contrib-python==3.4.2.16 -i "https://pypi.doubanio.com/simple/"

😺三、实验工作

🐶3.1 图像选择

  这里选择经典的lena图像作为实验对象,为了选择一个待匹配图像,本文使用如下代码对lena图像进行逆时针45°旋转。

from PIL import Image

img = Image.open('lena.png')
img2 = img.rotate(45)       # 逆时针旋转45°
img2.save("lena_rot45.png")
img2.show()

参考图像与待匹配图像(即旋转图像)如下图所示:
【Python】:SIFT算法的实现

🐶3.2 程序实现

"""
图像匹配——SIFT点特征匹配实现步骤:
    (1)读取图像;
    (2)定义sift算子;
    (3)通过sift算子对需要匹配的图像进行特征点获取;
        a.可获取各匹配图像经过sift算子的特征点数目
    (4)可视化特征点(在原图中标记为圆圈);
        a.为方便观察,可将匹配图像横向拼接
    (5)图像匹配(特征点匹配);
        a.通过调整ratio获取需要进行图像匹配的特征点数量(ratio值越大,匹配的线条越密集,但错误匹配点也会增多)
        b.通过索引ratio选择固定的特征点进行图像匹配
    (6)将待匹配图像通过旋转、变换等方式将其与目标图像对齐
"""

import cv2              # opencv版本需为3.4.2.16
import numpy as np      # 矩阵运算库
import time             # 时间库

original_lena = cv2.imread('lena.png')          # 读取lena原图
lena_rot45 = cv2.imread('lena_rot45.png')       # 读取lena旋转45°图

sift = cv2.xfeatures2d.SIFT_create()

# 获取各个图像的特征点及sift特征向量
# 返回值kp包含sift特征的方向、位置、大小等信息;des的shape为(sift_num, 128), sift_num表示图像检测到的sift特征数量
(kp1, des1) = sift.detectAndCompute(original_lena, None)
(kp2, des2) = sift.detectAndCompute(lena_rot45, None)

# 特征点数目显示
print("=========================================")
print("=========================================")
print('lena 原图  特征点数目:', des1.shape[0])
print('lena 旋转图 特征点数目:', des2.shape[0])
print("=========================================")
print("=========================================")

# 举例说明kp中的参数信息
for i in range(2):
    print("关键点", i)
    print("数据类型:", type(kp1[i]))
    print("关键点坐标:", kp1[i].pt)
    print("邻域直径:", kp1[i].size)
    print("方向:", kp1[i].angle)
    print("所在的图像金字塔的组:", kp1[i].octave)

print("=========================================")
print("=========================================")
"""
首先对原图和旋转图进行特征匹配,即图original_lena和图lena_rot45
"""
# 绘制特征点,并显示为红色圆圈
sift_original_lena = cv2.drawKeypoints(original_lena, kp1, original_lena, color=(255, 0, 255))
sift_lena_rot45 = cv2.drawKeypoints(lena_rot45, kp2, lena_rot45, color=(255, 0, 255))

sift_cat1 = np.hstack((sift_original_lena, sift_lena_rot45))        # 对提取特征点后的图像进行横向拼接
cv2.imwrite("sift_cat1.png", sift_cat1)
print('原图与旋转图 特征点绘制图像已保存')
cv2.imshow("sift_point1", sift_cat1)
cv2.waitKey()

# 特征点匹配
# K近邻算法求取在空间中距离最近的K个数据点,并将这些数据点归为一类
start = time.time()     # 计算匹配点匹配时间
bf = cv2.BFMatcher()
matches1 = bf.knnMatch(des1, des2, k=2)
print('用于 原图和旋转图 图像匹配的所有特征点数目:', len(matches1))

# 调整ratio
# ratio=0.4:对于准确度要求高的匹配;
# ratio=0.6:对于匹配点数目要求比较多的匹配;
# ratio=0.5:一般情况下。
ratio1 = 0.5
good1 = []

for m1, n1 in matches1:
    # 如果最接近和次接近的比值大于一个既定的值,那么我们保留这个最接近的值,认为它和其匹配的点为good_match
    if m1.distance < ratio1 * n1.distance:
        good1.append([m1])

end = time.time()
print("匹配点匹配运行时间:%.4f秒" % (end-start))

# 通过对good值进行索引,可以指定固定数目的特征点进行匹配,如good[:20]表示对前20个特征点进行匹配
match_result1 = cv2.drawMatchesKnn(original_lena, kp1, lena_rot45, kp2, good1, None, flags=2)
cv2.imwrite("match_result1.png", match_result1)

print('原图与旋转图 特征点匹配图像已保存')
print("=========================================")
print("=========================================")
print("原图与旋转图匹配对的数目:", len(good1))

for i in range(2):
    print("匹配", i)
    print("数据类型:", type(good1[i][0]))
    print("描述符之间的距离:", good1[i][0].distance)
    print("查询图像中描述符的索引:", good1[i][0].queryIdx)
    print("目标图像中描述符的索引:", good1[i][0].trainIdx)

print("=========================================")
print("=========================================")
cv2.imshow("original_lena and lena_rot45 feature matching result", match_result1)
cv2.waitKey()

# 将待匹配图像通过旋转、变换等方式将其与目标图像对齐,这里使用单应性矩阵。
# 单应性矩阵有八个参数,如果要解这八个参数的话,需要八个方程,由于每一个对应的像素点可以产生2个方程(x一个,y一个),那么总共只需要四个像素点就能解出这个单应性矩阵。
if len(good1) > 4:
    ptsA = np.float32([kp1[m[0].queryIdx].pt for m in good1]).reshape(-1, 1, 2)
    ptsB = np.float32([kp2[m[0].trainIdx].pt for m in good1]).reshape(-1, 1, 2)
    ransacReprojThreshold = 4
    # RANSAC算法选择其中最优的四个点
    H, status =cv2.findHomography(ptsA, ptsB, cv2.RANSAC, ransacReprojThreshold)
    imgout = cv2.warpPerspective(lena_rot45, H, (original_lena.shape[1], original_lena.shape[0]),
                                 flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)

    cv2.imwrite("imgout.png", imgout)
    cv2.imshow("lena_rot45's result after transformation", imgout)
    cv2.waitKey()

🐶3.3 程序结果

【Python】:SIFT算法的实现文章来源地址https://www.toymoban.com/news/detail-428564.html

到了这里,关于【Python】:SIFT算法的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV-Python(32):SIFT算法

    学习SIFT 算法的概念 学习在图像中查找SIFT关键点和描述符         在前面两节我们学习了一些角点检测技术:比如Harris 等。它们具有 旋转不变特性, 即使图片发生了旋转,我们也能找到同样的角点。很明显即使图像发生旋转之后角点还是角点。但是,如果我们对图像进

    2024年02月02日
    浏览(33)
  • 全网最详细SIFT算法原理实现

    尺度不变特征转换(SIFT, Scale Invariant Feature Transform)是图像处理领域中的一种局部特征描述算法. 该方法于1999年由加拿大教授David G.Lowe提出,申请了专利,其专利属于英属哥伦比亚大学. SIFT专利在2020年3月17日之后到期,现在只需更新cv版本即可免费使用. SIFT算法不仅只有尺度不

    2024年01月23日
    浏览(31)
  • 学习笔记:Opencv实现图像特征提取算法SIFT

    2023.8.19 为了在暑假内实现深度学习的进阶学习,特意学习一下传统算法,分享学习心得,记录学习日常 SIFT的百科: SIFT = Scale Invariant Feature Transform, 尺度不变特征转换 全网最详细SIFT算法原理实现_ssift算法_Tc.小浩的博客-CSDN博客 在环境配置中要配置opencv: pip install opencv-c

    2024年02月12日
    浏览(32)
  • 【计算机视觉、关键点检测、特征提取和匹配】基于SIFT、PCA-SIFT和GLOH算法在不同图像之间建立特征对应关系,并实现点匹配算法和图像匹配(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章

    2024年03月14日
    浏览(37)
  • python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法

    原理 Harris 角点检测是一种用于在图像中检测角点的算法。角点是图像中局部区域的交叉点或者突出的特征点。Harris 角点检测算法旨在寻找图像中对于平移、旋转和尺度变化具有不变性的角点。 该算法通过计算图像中每个像素点的灰度值的变化,来识别角点。具体来说,Ha

    2024年01月19日
    浏览(35)
  • OpenCV Python – 使用SIFT实现两张图片的特征匹配

     我们使用尺度不变特征变换(  SIFT  )特征描述符和暴力匹配算法实现两张图像的特征匹配。其中,  SIFT  用于找到图像中的关键点和描述符,而  暴力匹配算法  用于在两张图像中匹配描述符。 要使用  SIFT  特征检查器和  暴力  匹配算法实现两张图像的特征匹配,可

    2024年02月03日
    浏览(38)
  • SIFT算法 特征匹配

    一、SIFT算法 参考链接 【OpenCV】SIFT原理与源码分析 DOG尺度空间构造(Difference of Gaussian) 首先是对原特征图下采样可以得到金字塔形状的多分辨率空间,作为特征金字塔,该特征金字塔可以方便提取出不同尺度的特征(感觉这里也可以叫多尺度空间) 多尺度空间:利用高斯

    2024年02月04日
    浏览(23)
  • 基于SIFT算法的图像匹配

    基本概念 尺度不变特征转换(Scale-invariant feature transform,简称SIFT) ,是一种用来侦测与描述影像中的局部性特征的算法,它在空间尺度中寻找极值点,提取位置、尺度、旋转不变量,生成特征描述子。 SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点

    2024年01月19日
    浏览(75)
  • 关键点检测SIFT算法笔记

            SIFT(Scale Invariant Feature Transform),尺度不变特征变换。具有旋转不变性、尺度不变性、亮度变化保持不变性,是一种非常稳定的局部特征。在目标检测和特征提取方向占据着重要的地位。         SIFT算法所查找到的关键点是一些很突出,不因光照、仿射变换和噪

    2024年02月16日
    浏览(34)
  • 无人机航拍图像匹配——SIFT算法实践(含代码)

    SIFT(Scale-Invariant Feature Transform)算法是由David Lowe于1999年提出的一种用于图像处理和计算机视觉中的特征提取和匹配方法。它在航拍图像匹配中具有重要的意义,主要体现在以下几个方面: 尺度不变性 :航拍图像通常具有大范围的尺度变化,例如拍摄距离目标较远或较近的

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包