【OpenCV】 ⚠️高手勿入! 半小时学会基本操作 24⚠️ SIFT 算法

  • 概述
  • 图像尺度空间
    • 多分辨率金字塔
    • 高斯差分金字塔
    • 计算极值点
  • SIFT 算法
    • 函数
    • 实战

概述

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

图像尺度空间

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

多分辨率金字塔

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

高斯模糊:

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

例子:

import cv2
from 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 np
import 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】 ⚠️高手勿入! 半小时学会基本操作 24⚠️ SIFT 算法相关推荐

  1. 【OpenCV】⚠️高手勿入! 半小时学会基本操作 15⚠️ 对象测量

    [OpenCV]⚠️高手勿入! 半小时学会基本操作 15⚠️ 对象测量 概述 对象测量 多边形拟合 计算对象中心 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就 ...

  2. 【OpenCV】高手勿入! 半小时学会基本操作 4 图像裁剪融合

    [OpenCV]高手勿入! 半小时学会基本操作 4 概述 图像裁剪 数值计算 图像融合 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 Ope ...

  3. 【NLP】⚠️学不会打我! 半小时学会基本操作 4⚠️词向量模型

    [NLP]⚠️学不会打我! 半小时学会基本操作 4⚠️词向量模型 概述 词向量 词向量维度 Word2Vec CBOW 模型 Skip-Gram 模型 负采样模型 词向量的训练过程 1. 初始化词向量 ...

  4. 【NLP】⚠️学不会打我! 半小时学会基本操作 8⚠️ 新闻分类

    [NLP]⚠️学不会打我! 半小时学会基本操作 8⚠️ 新闻分类 概述 TF-IDF 关键词提取 TF IDF TF-IDF TfidfVectorizer 数据介绍 代码实现 概述 从今天开始我们将 ...

  5. 【NLP】⚠️学不会打我! 半小时学会基本操作 2⚠️词向量模型简介

    [NLP]⚠️学不会打我! 半小时学会基本操作 2⚠️词向量模型简介 概述 词向量维度 Word2Vec CBOW 模型 Skip-Gram 模型 负采样模型 词向量的训练过程 1. 初始化词向量矩阵 ...

  6. 【NLP】⚠️学不会打我! 半小时学会基本操作 5⚠️ 家暴归类, 妈妈再也不同担心我被家暴啦

    [NLP]⚠️学不会打我! 半小时学会基本操作 5⚠️ 家暴归类, 妈妈再也不同担心我被家暴啦 概述 数据介绍 词频统计 朴素贝叶斯 代码实现 预处理 主函数 概述 从今天开始我们将开启一段自然语言处 ...

  7. 【NLP】学不会打我 半小时学会基本操作 14 文本处理 <PAD><EOS><UNK><GO>

    [NLP]⚠️学不会打我! 半小时学会基本操作 14⚠️ 文本处理 概述 文本处理 概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的 ...

  8. 五笔打字:速成手册---半小时学会五笔打字

    [半小时内学会五笔打字] 五笔打字,是专业打字法.(王码86版.或万能五笔版) 简介 五笔是将每个字拆分成几个(最多4个,不足4个则补识别码)字根,然后根据每个字根对应的 键来打出该汉字.比如:森字, ...

  9. opencv imshow函数报cv::exception错误,以及sift算法的使用问题

    记录遇到的小问题 刚发布的就不见了,活生生的不见了,难道是我吐槽百度出来的博客很多都是抄的同一篇? 简略的描述一下问题(小白使用,大佬就不用看了) opencv版本:4.0.0,使用vs2015编译 ...

最新文章

  1. MySQL基本了解与使用
  2. DeepMind推出分布式深度强化学习架构IMPALA,让一个Agent学会多种技能
  3. 通过pipeline实现jenkins的ci/cd功能
  4. mysql服务怎么改名字_MySQL数据库改名字
  5. 有趣的网页注释代码,保护我方源码
  6. java普通类跳转到jsp_JSP跳转到Servlet的两种配置
  7. ajax jsp jquery,ajax +jquery 基本
  8. Seata多微服务互相调用_全局分布式事物使用案例_Storage-Module 仓储微服务说明---微服务升级_SpringCloud Alibaba工作笔记0063
  9. 最近两周的前后端交互
  10. 【Python-2.7】if-elif-else
  11. ThinkingInJava 学习 之 0000001 一切都是对象
  12. 服务器系统自检可以关吗,1366电脑服务器开机自检肿么关闭
  13. 好消息,高清版谷歌卫星地图终于可以正常使用了
  14. python eel + vue开发桌面应用
  15. 〖Python 数据库开发实战 - MySQL篇⑮〗- 数据表结果集的排序与去除重复(去重)
  16. python排序题总结
  17. 论文检测的时间段是什么时候?
  18. 鲁棒随机优化(Robust Stochastic Optimization)和RSOME
  19. ERROR: Command errored
  20. 如何看待 30 岁转行做程序员这件事

热门文章

  1. Koa koa-combine-routers 分路由管理
  2. 教你给大量视频快速调整色调的方法
  3. 大疆 芯片开发 面经
  4. 手机有软件测试网络通不通,怎样使用ping命令测试网络通不通
  5. vb python excel_【Python3+VBA】在Excel中生成小姐姐
  6. Android 小米应用角标
  7. Gradual warmup lr schedule--pytorch
  8. ZXing 相册中识别二维码和条形码(直接引用就可以了)
  9. Mapped Statements collection already contains value for
  10. java-IO流(4)-对象流及其序列化介绍