您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:OpenCV半小时掌握基本操作之SIFT算法

51自学网 2021-10-30 22:13:18
  python
这篇教程OpenCV半小时掌握基本操作之SIFT算法写得很实用,希望能帮到您。

概述

OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. (第 24 课)

在这里插入图片描述

图像尺度空间

在一定的范围内, 无论物体是大还是小, 人眼都可以分辨出来. 而计算机要有相同的能力却很难, 所以要让机器能够对物体在不同尺度下有一个统一的认知, 就需要考虑图像在不同的尺度下都存在的特点.

在这里插入图片描述

多分辨率金字塔

使用高斯模糊, 不同的 σ 决定了图像的平滑程度, 越大的 σ 值对应的图像越模糊. 通过使用不同的 σ 我们可以实现多分辨率金字塔.

在这里插入图片描述

高斯模糊:

cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
  • src: 需要滤波的图片
  • ksize: 卷积核大小
  • sigmaX: 高斯核函数在 X 方向的的标准偏差
  • sigmaY: 高斯核函数在 Y 方向的的标准偏差

例子:

import cv2from matplotlib import pyplot as plt# 读取图片img = cv2.imread("face.jpg")# 画图f, ax = plt.subplots(2, 3, figsize=(12, 8))ax[0, 0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))ax[0, 0].set_title("original")ax[0, 0].set_xticks([])ax[0, 0].set_yticks([])# 高斯模糊for i in range(1, 6):    # 高斯模糊    image_blur = cv2.GaussianBlur(img, (15, 15), i)    # 计算子图    ax[int(i/3), i % 3].imshow(cv2.cvtColor(image_blur, cv2.COLOR_BGR2RGB))    # 标题    ax[int(i/3), i % 3].set_title("σ" + str(i))    ax[int(i/3), i % 3].set_xticks([])    ax[int(i/3), i % 3].set_yticks([])# 展示图片plt.show()

输出结果:

在这里插入图片描述

高斯差分金字塔

DoG (Difference of Gaussian) 即高斯差分金字塔, 是在高斯金字塔的基础上构建起来的. 通过对高斯金字塔逐层相减, 得到 t-1 的高斯差分金字塔:

在这里插入图片描述

计算极值点

DoG 空间极值检测: 将每个像素点和同一层周围的 8 个像素点以及上下两层的 18 个像素点, 共 26 个像素点进行比较. 如果一像素点大于或小于邻近的 26 个像素点的时候, 就成为了极值点.

在这里插入图片描述

SIFT 算法

SIFT (Scale Invariant Feature Transform), 即尺度不变特征变换匹配算法. SIFT 算法对于旋转和尺度具有不变性.

函数

实例化 SHIFT 算法:

cv2.SIFT_create()

获取特征点:

sift.detect(img_gray, None)

绘制特征点:

cv2.drawKeypoints(image, keypoints, outImage, color=None, flags=None)
  • image: 输入图像
  • keypoints: 特征点
  • outImage: 输出图像

将特征点转换为128 维的向量:

sift.compute(img, kp)

实战

例子:

import numpy as npimport cv2# 读取图片img = cv2.imread("face.jpg")key_points = img.copy()# 实例化SIFT算法sift = cv2.SIFT_create()# 得到特征点kp = sift.detect(img, None)print(np.array(kp).shape)# 绘制特征点cv2.drawKeypoints(img, kp, key_points)# 图片展示cv2.imshow("key points", key_points)cv2.waitKey(0)cv2.destroyAllWindows()# 保存图片cv2.imwrite("key_points.jpg", key_points)# 计算特征kp, des = sift.compute(img, kp)# 调试输出print(des.shape)print(des[0])

输出结果:

(2183,)
(2183, 128)
[ 9. 18. 1. 0. 0. 0. 10. 8. 11. 18. 7. 34. 37. 14.
31. 11. 15. 6. 33. 50. 26. 9. 8. 10. 2. 1. 77. 94.
72. 17. 2. 5. 20. 44. 4. 1. 0. 0. 0. 0. 37. 63.
34. 128. 53. 4. 1. 1. 144. 11. 8. 56. 45. 25. 9. 63.
20. 1. 5. 22. 144. 144. 8. 18. 16. 3. 0. 0. 0. 0.
0. 2. 49. 7. 2. 17. 80. 35. 0. 9. 144. 39. 1. 5.
44. 19. 1. 12. 47. 9. 0. 0. 144. 126. 1. 2. 8. 0.
0. 0. 0. 0. 0. 1. 34. 2. 0. 0. 60. 25. 0. 5.
144. 38. 0. 0. 39. 14. 0. 2. 61. 13. 0. 0. 144. 50.
0. 0.]

在这里插入图片描述

在这里插入图片描述

到此这篇关于OpenCV半小时掌握基本操作之SIFT算法的文章就介绍到这了,更多相关OpenCV SIFT内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


OpenCV半小时掌握基本操作之角点检测
Python入门基本操作列表排序用法详解
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。