当前位置: 首页 > news >正文

机器学习:opencv--特征检测

目录

前言

一、 Harris 角点检测

1.基本思想

2.代码实现

二、 SIFT(尺度不变特征变换)

1.代码实现


前言

        特征检测是计算机视觉中的一个重要任务,旨在从图像中提取具有辨识度的关键点或区域。这些特征可以用于后续的图像分析、匹配和识别。

一、 Harris 角点检测

  • Harris角点检测算法是一种常用的计算机视觉算法,用于检测图像中的角点。该算法通过计算图像中每个像素的局部自相关矩阵,来判断该像素是否为角点。

 

1.基本思想

  1. 使用一个固定的小窗口在图像上进行任意方向的滑动,
  2. 比较滑动前与滑动后两种情况,
  3. 窗口中的像素灰度变化程度,
  4. 如果存在任意方向上的滑动,都有着较大灰度变化(sobel算子),
  5. 那么我们可以认为该窗口中存在角点
  • 例如该图中黄色框框就是一个检测窗口,任意方向滑动之后比较滑动前后的变化,如果有较大变化,就认为该窗口存在角点

 

2.代码实现

  1. 传入图像,变成灰度图
  2. 进行角点检测,返回图像大小的矩阵,矩阵中每个值是每个像素为角点的概率
  3. 该代码中通过是否大于最大概率的十分之一来判断是否是角点
  4. 若是,则标为绿色
import cv2"""角点检测harris"""
# 角点指图像中局部区域与周围区域有较大灰度变化的点或像素。
# cornerHarris(img,blockSize,ksize, k[, dst[, borderType]])-> dst
#   img:输入图像。
#   blockSize:角点检测中要考虑的领域大小。
#   ksize:Sobel求导中使用的窗口大小。
#   k:Harris角点检测方程中的自由参数,取值参数为[0.04,0.06]
# dst:返回numpy.ndarray对象,大小和src相同,值越大,对应像素点是角的概奉越高img = cv2.imread('huanghelou.png')
# img = cv2.imread('huanghelou1.JPG')
# img = cv2.imread('face.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.cornerHarris(gray, 4, 3, 0.06)# 标记检测到的角点
img[dst > 0.1 * dst.max()] = [0, 255, 0]
cv2.imshow('img', img)
cv2.waitKey(0)print(dst[dst > 0.06 * dst.max()])

输出:

 

二、 SIFT(尺度不变特征变换)

  • SIFT特征具有对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。
  • 其原理是通过高斯图像金字塔以及高斯模糊等系列算法来获取图像的关键点

1.代码实现

  1. 传入图像,变成灰度图
  2. 创建sift对象,
  3. 使用.detect方法查找图像的关键点
  4. 再使用.drawKeypoints方法在图像上绘制出关键点以及关键点的信息
  5. 使用.compute方法计算关键点的描述符,将每个点映射到128维的矩阵内,
  6. 一行数值表示一个点,一个点有128个特征,有助于后面进行不同图像之间的关键点匹配
import cv2
import numpy as np"""特征提取sift"""
# 检测图像中的关键点
# cv2.SIFT_create()
# #cv2.xfeatures2d.SIFT_create()#创建一个sift特征的提取对象
# sift.detect(img)在图像中查找关键点# img = cv2.imread('man.png')
img = cv2.imread('face.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.SIFT_create()  # 创建sift对象
kp = sift.detect(gray)  # 查找关键点# 绘制关键点
# drawKeypoints(image, keypoints, outImage, color=None, flags=None)
# image:原始图片
# keypoints:从原图中获得的关键点,这也是画图时所用到的数据
# outputimage:输出图像,可以是原始图片,也可以是None
# color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,q=绿色,r=红色。
# flags:绘图功能的标识设置
img_sift = cv2.drawKeypoints(img, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('img_sift', img_sift)
cv2.waitKey(0)# 使用sift.compute()计算关键点描述符,方便后期的特征匹配
kp, des = sift.compute(img, kp)
print(np.array(kp).shape, des.shape)
for i in kp:print(i.pt)

输出:

 

  • 利用kp中的pt属性,获取每个关键点的坐标

相关文章:

  • 切换笔记本键盘的启用与禁用状态
  • Java基础(Arrays工具类)(asList()方法)(详细)
  • 鸿蒙开发(NEXT/API 12)【硬件(接入手写套件)】手写功能开发
  • 《深度学习》卷积神经网络 数据增强、保存最优模型 原理解析及实例实现
  • 【自动驾驶】对2D框的四条边同时缩进
  • 【07】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Swiper轮播组件与样式结构重用
  • Linux下C开发使用小技巧
  • TIM定时中断
  • 17 vue3之tsx手写vite tsx插件
  • 每天学习一个技术栈 ——【Django Channels】篇(1)
  • Kafka与RabbitMQ:深入理解两者之间的区别
  • MySQL基础--表的增删改查
  • 时间技能物品竞品抢拍拍卖发布h5公众号小程序开源版开发
  • 笔记整理—linux进程部分(2)使用fork创建进程
  • 尚品汇-自动化部署-Jenkins的安装与环境配置(五十六)
  • 网络传输文件的问题
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 2019年如何成为全栈工程师?
  • Angular 4.x 动态创建组件
  • ECS应用管理最佳实践
  • Effective Java 笔记(一)
  • Fastjson的基本使用方法大全
  • Github访问慢解决办法
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Linux中的硬链接与软链接
  • mongo索引构建
  • mysql innodb 索引使用指南
  • Python连接Oracle
  • React-Native - 收藏集 - 掘金
  • Vue 重置组件到初始状态
  • Vue全家桶实现一个Web App
  • webpack入门学习手记(二)
  • 百度地图API标注+时间轴组件
  • 读懂package.json -- 依赖管理
  • 区块链技术特点之去中心化特性
  • 跳前端坑前,先看看这个!!
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​马来语翻译中文去哪比较好?
  • $(selector).each()和$.each()的区别
  • (12)Linux 常见的三种进程状态
  • (k8s)kubernetes集群基于Containerd部署
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十六)视图变换 正交投影 透视投影
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)kafka实战——kafka源码编译启动
  • (译) 函数式 JS #1:简介
  • (转)Linux整合apache和tomcat构建Web服务器
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net core使用ef 6