【笔记】OpenCv-SIFT

Opencv_SIFT

一,介绍

SIFT代表尺度不变特征变换,是一种用于检测和描述图像局部特征的计算机视觉算法。它是由David Lowe在1999年提出的,并已广泛用于各种计算机视觉应用,包括对象识别、图像拼接和3D重建。 

以下是SIFT工作原理的简要概述:
1.*尺度空间极值检测: * - SIFT从识别对比例和旋转变化不变的关键点开始。这是通过创建图像的尺度空间表示,然后在高斯差(DoG)金字塔中搜索局部极值(最大值或最小值)来实现的。
2.*关键点本地化: * -通过消除低对比度关键点和那些定位不佳的关键点来细化检测到的关键点。关键点定位包括将3D二次函数拟合到尺度空间中每个关键点周围的亮度值。
3.*定位任务: * - SIFT为每个关键点指定一个方向,以实现旋转不变性。这是通过计算关键点周围像素的梯度幅度和方向并构建梯度方向直方图来实现的。直方图的峰值对应于主导方向。
4.*描述符生成: * 基于局部图像梯度为每个关键点计算特征描述符。描述符包括关于关键点邻域中的梯度幅度和方向的信息。它导致局部图像区域的高度独特和不变的表示。 SIFT已被广泛使用,但值得注意的是,它是有专利的,截至我2022年1月的知识截止日,该专利对其在商业应用中的使用有影响。此外,近年来,已经开发了ORB(面向FAST和Rotated BRIEF)和AKAZE等替代方法,提供了类似的功能,而没有专利限制。 要在Python中使用SIFT,可以使用OpenCV库中的‘cv2 . SIFT’模块。但从OpenCV第4版开始,由于专利问题,SIFT不再包含在默认发行版中。仍然可以通过使用非自由模块构建OpenCV来使用它。

import cv2

# Load an image
image = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)

# Initialize SIFT detector
sift = cv2.SIFT_create()

# Detect keypoints and compute descriptors
keypoints, descriptors = sift.detectAndCompute(image, None)

# Draw keypoints on the image
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)

# Display the result
cv2.imshow('SIFT Keypoints', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

1,特性

SIFT (Scale-Invariant Feature Transform) 是一种用于检测和描述图像局部特征的算法。它是一种用于在图像中找到关键点并计算这些关键点的局部描述符的方法。以下是 SIFT 算法的主要功能:

  1. 尺度不变性(Scale Invariance): SIFT 算法对于图像中的尺度变化具有不变性。这意味着即使目标物体在图像中的尺寸发生变化,SIFT 依然能够检测到相同的关键点。

  2. 旋转不变性(Rotation Invariance): SIFT 能够在一定程度上对图像中的旋转具有不变性。这是通过在多个尺度上对图像进行旋转不变性测试实现的。

  3. 光照不变性(Illumination Invariance): SIFT 具有一定的光照不变性,这意味着它对图像中的光照变化相对不敏感。

  4. 关键点检测: SIFT 算法能够检测图像中的关键点,这些关键点通常是图像中具有显著变化的位置,如角点、边缘等。

  5. 关键点描述: 对于每个检测到的关键点,SIFT 生成一个局部描述符,该描述符对关键点周围区域的外观进行了描述。这些描述符用于后续的特征匹配。

  6. 特征匹配: SIFT 提供了一种用于匹配图像中关键点的方法,这对于在不同图像中找到相似的场景或物体很有用。

SIFT 算法在计算机视觉领域中被广泛应用,特别是在目标识别、图像匹配和三维重建等任务中。然而,需要注意的是,由于 SIFT 算法的专利限制,OpenCV 的最新版本已经将 SIFT 移到了 cv2.xfeatures2d 模块中,而且 SIFT 算法的使用可能需要考虑专利问题。在某些情况下,使用其他算法如 ORB(Oriented FAST and Rotated BRIEF)可能是一个更好的选择。

二,实现

import numpy as np
import cv2

imgname1 = r"C:\Users\fanya\Desktop\small\double.png"
imgname2 = r"C:\Users\fanya\Desktop\small\small.png"

sift = cv2.xfeatures2d.SIFT_create()

img1 = cv2.imread(imgname1)
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)  # Convert to grayscale
kp1, des1 = sift.detectAndCompute(img1, None)  # Get keypoints and descriptors

img2 = cv2.imread(imgname2)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # Convert to grayscale
kp2, des2 = sift.detectAndCompute(img2, None)  # Get keypoints and descriptors

# Resize images to have the same height
min_height = min(gray1.shape[0], gray2.shape[0])
gray1 = cv2.resize(gray1, (int(gray1.shape[1] * min_height / gray1.shape[0]), min_height))
gray2 = cv2.resize(gray2, (int(gray2.shape[1] * min_height / gray2.shape[0]), min_height))

# Horizontal concatenation
hmerge = np.hstack((gray1, gray2))
cv2.imshow("gray", hmerge)
cv2.waitKey(0)

img3 = cv2.drawKeypoints(img1, kp1, img1, color=(255, 0, 255))
img4 = cv2.drawKeypoints(img2, kp2, img2, color=(255, 0, 255))
# Resize images to have the same height
img3 = cv2.resize(img3, (int(img3.shape[1] * min_height / img3.shape[0]), min_height))
img4 = cv2.resize(img4, (int(img4.shape[1] * min_height / img4.shape[0]), min_height))

# Horizontal concatenation
hmerge = np.hstack((img3, img4))
cv2.imshow("point", hmerge)
cv2.waitKey(0)

# BFMatcher to solve matches
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# Adjust ratio
good = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good.append([m])

img5 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, flags=2)
cv2.imshow("BFmatch", img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

三,结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值