OpenCV(图像处理)-基于Python-特征检测-特征点匹配

这篇具有很好参考价值的文章主要介绍了OpenCV(图像处理)-基于Python-特征检测-特征点匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python open cv sift 特征匹配,图像处理,opencv,图像处理,python

1.图像特征

图像特征就是指有意义的图像区域,具有独特性,易于识别性,比如角点、斑点以及高密度区。而为什么角点具有重要的特征呢?
看下图:
python open cv sift 特征匹配,图像处理,opencv,图像处理,python
观察ABD三张图片,我们不容易得知图像的位置,而CEF三张图我们特别容易找到它们在原图中对应的位置,这是因为ABD比较平滑,我们不易找出他们的特点,而CEF三张图有很明显的轮廓特征,有很多边缘特征即角点,因此一幅图像中的角点非常重要。
想让计算机具有识别图片的功能,首先要让他们学会提取图片的特征,提取图像的角点。

角点的特征

  • 在特征中最重要的是角点
  • 是灰度梯度最大值所对应的像素
  • 两条线的交点
  • 极值点(一阶导数最大值但是二阶导数为0)

2. 哈里斯检测

原理:
python open cv sift 特征匹配,图像处理,opencv,图像处理,python
图1方块上下左右移动都没有变化,说明图1不是角点;图2上下没有变化,左右移动有变化,说明图2是边缘;图3上下左右移动都有变化,说明图3是角点。

python open cv sift 特征匹配,图像处理,opencv,图像处理,python

cornerHarris()

dst = cv2.cornerHarris(img, blockSize, ksize, k)
img :需要检测的图像,最好为灰度图
blockSize:检测窗口的大小,一般取2
ksiez:Sobel卷积核,一般取3
k:权重系数,经验值,一般取0.02~0.04之间
返回值:dst不是图像,是点的集合
缺点:k是个经验值需要自己调节

import cv2
import numpy as np

# 读取图片,并转为灰度图
img = cv2.imread('./image/chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Harris角点检测
dst = cv2.cornerHarris(gray, 2, 3, 0.02)

# 表示img中dst值大于0.01*dst.max()的像素点索引出来,然后将这些像素点的值赋为 [0,0,255]。
img[dst > 0.01*dst.max()] = [0, 0, 255]
cv2.imshow('img', img)

cv2.waitKey(0)

python open cv sift 特征匹配,图像处理,opencv,图像处理,python

3.Shi-Tomasi角点检测

Shi-Tomasi是Harris角点检测的改进,因为Harris角点检测的稳定性与k有关,而k是个经验值,与人的主观因素有关。Shi-Tomasi避免了这个问题。

goodFeaturesToTrack()

dst = cv2.goodFeaturesToTrack(img, maxCorners, qualityLevel, minDistance)
img:需要检测的图像,最好为灰度图
maxCorners:角点的最大数量,值为0表示无限制
qualityLevel:小于1.0的正数,一般在0.01-1.0之间
minDistance:角之间最小欧式距离,忽略小于此距离的点
mask:感兴趣的区域,不填默认全部图像
blockSize:检测窗口大小
useHarrisDetector:是否使用Harris算法,True/False
k:默认是0.04

import cv2
import numpy as np

# 读取图片,并转为灰度图
img = cv2.imread('./image/chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Harris角点检测
# dst = cv2.cornerHarris(gray, 2, 3, 0.02)

maxCorners = 100
ql = 0.01
minDistance = 10
# ShiTomasi角点检测
corners = cv2.goodFeaturesToTrack(gray, maxCorners, ql, minDistance)
# corners为float32类型,需要转化为整型
corners = np.int0(corners)
# 表示img中dst值大于0.01*dst.max()的像素点索引出来,然后将这些像素点的值赋为 [0,0,255]。
# img[dst > 0.01*dst.max()] = [0, 0, 255]

for i in corners:
    x, y = i.ravel() # 将迭代的数组,转化成一维的
    cv2.circle(img, (x, y), 3, (0, 0, 255), -1)

cv2.imshow('img', img)

cv2.waitKey(0)

python open cv sift 特征匹配,图像处理,opencv,图像处理,python

4.Scale-Invariant Feature Transform(SIFT)

该算法是与缩放无关的特征检测,比如说,以前是角点,但是在图放大或缩小后,由于图片比例的变化,原来是角,放大之后,可能就不是角;原来是角,缩小之后可能就是角。而该算法正好解决了这个问题。
python open cv sift 特征匹配,图像处理,opencv,图像处理,python


SIFT能够计算关键点和描述子,关键点:位置、大小和方向;关键点描述子:记录了关键点周围对其有贡献的像素点的一组向量值,其不受仿射变换、光照变换的影响。

SIFT语法

  • 首先创建SIFT对象
  • 进行检测,kp =sift.detect(img,…)
  • 绘制关键点,drawKeypoints(gray, kp, img)
  • 从灰度图gray中检测的,关键点kp,在原图img中画

创建SIFT对象
sift = cv2.xfeatures2d.SIFT_create(什么也不写)
kp = sift.detect(img, mask)
img:是检测图片,尽量用灰度图
mask:掩码,指明对图中哪部分进行检测,一般填None(全图)

import cv2
import numpy as np

# 读取图片,并转为灰度图
img = cv2.imread('./image/chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建sift对象
sift = cv2.xfeatures2d.SIFT_create()
# 关键点检测
kp = sift.detect(gray, None)
# 使用关键点画图
cv2.drawKeypoints(gray, kp, img)
cv2.imshow('img', img)

cv2.waitKey(0)

python open cv sift 特征匹配,图像处理,opencv,图像处理,python


此接口一下能算出关键点和描述子
kp, des = sift.detectAndCompute(img, mask)
img:是检测图片,尽量用灰度图
mask:掩码,指明对图中哪部分进行检测,一般填None(全图)

import cv2
import numpy as np

# 读取图片,并转为灰度图
img = cv2.imread('./image/chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建sift对象
sift = cv2.xfeatures2d.SIFT_create()
# kp = sift.detect(gray, None)

kp, des = sift.detectAndCompute(gray, None)

cv2.drawKeypoints(gray, kp, img)
cv2.imshow('img', img)

cv2.waitKey(0)

python open cv sift 特征匹配,图像处理,opencv,图像处理,python


SIFT缺点:速度慢

5.SURF

由于SIFT速度较慢,因此又产生了SURF算法,该算法速度优于SIFT。

  • 首先创建SURF对象
  • 进行检测,kp, des =surf.detectAndCompute(img, mask)
  • 绘制关键点,drawKeypoints(gray, kp, img)
  • 从灰度图gray中检测的,关键点kp,在原图img中画

创建surf对象
surf = cv2. xfeatures2d.SURF_create()
kp, des = surf.detectAndCompute(img, mask)
img:是检测图片,尽量用灰度图
mask:掩码,指明对图中哪部分进行检测,一般填None(全图)
kp:检测出的关键字
des:是描述子,用来特征匹配使用的

import cv2
import numpy as np

# 读取图片,并转为灰度图
img = cv2.imread('./image/chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# # 创建sift对象
# sift = cv2.xfeatures2d.SIFT_create()

# 创建surf对象
surf = cv2.xfeatures2d.SURF_create()

# 计算关键点和描述子
kp, des = surf.detectAndCompute(gray, None)

cv2.drawKeypoints(gray, kp, img)
cv2.imshow('img', img)

cv2.waitKey(0)

注意:此算法由于付费的缘由,需要使用3.4.2.17版本的opencv库

6.ORB(Oriented FAST and Rotated BRIEF)

其中FAST用于特征检测,BRIEF是对已检测到的特征点进行描述,它加快了特征描述符的建立速度,同时也极大降低了特征匹配的时间。
ORB的优势在于:速度快,可用于实时监测;免费。

先建立ORB对象
orb = cv2.ORB_create()
计算特征点与描述子
kp, des = orb.detectAndCompute(img, mask)
使用kp画出特征点
cv2.drawKeypoints(gray, kp, img)

img:是检测图片,尽量用灰度图
mask:掩码,指明对图中哪部分进行检测,一般填None(全图)

import cv2
import numpy as np

# 读取图片,并转为灰度图
img = cv2.imread('./image/chess.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 创建orb对象
orb = cv2.ORB_create()
# 对ORB进行检测
kp, des = orb.detectAndCompute(gray, None)

cv2.drawKeypoints(gray, kp, img)
cv2.imshow('img', img)

cv2.waitKey(0)

python open cv sift 特征匹配,图像处理,opencv,图像处理,python


检测出的特征点越来越少,因此在提升检测速度的同时,精度也在丢失。

7.特征匹配

根据特征点的描述子进行匹配,特征匹配方法有:

  • BF(Brute-Force),暴力特征匹配方法
  • FLANN 最快临近区特征匹配方法

7.1 暴力特征匹配

它使用第一组中的每个特征点的描述子与第二组中的所有特征点的描述子进行匹配,计算他们之间的差距,然后将最接近的一个匹配返回

  • 创建匹配器,bf = cv2.BFMatcher(normType, crossCheck)
  • 进行特征匹配,match = bf. match(des1, des2)
  • 绘制匹配点, cv2.drawMatches(img1, kp1, img2, kp2,…)

创建匹配器
bf = cv2.BFMatcher(normType, crossCheck)
normType:NORM_L1(SIFT),NORM_L2(SURF), HAMMING1(ORB)
crossCheck:是否进行交叉匹配,默认为false
描述子进行匹配
match = bf.match(dst1, dst2)
dst1:要搜索的图的描述子
dst2:从库里能匹配的描述子
画相同的地方
img3 = cv2.drawMatchers(img1, kp1, img2, kp2, match, None)
img1, kp1:要搜索的图,和特征点
img2, kp2:从库里匹配的图和特征点
match:匹配好的描述子

import cv2
import numpy as np

# 读取图片,并转为灰度图
img1 = cv2.imread('./image/opencv_search.png')
img2 = cv2.imread('./image/opencv_orig.png')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 创建orb对象
orb = cv2.ORB_create()
# 对ORB进行检测
kp1, dst1 = orb.detectAndCompute(gray1, None)
kp2, dst2 = orb.detectAndCompute(gray2, None)

# 创建匹配器
bf = cv2.BFMatcher(cv2.NORM_HAMMING)
# 描述子进行匹配
match = bf.match(dst1, dst2)

img3 = cv2.drawMatches(img1, kp1, img2, kp2, match, None)

cv2.imshow('img3', img3)

python open cv sift 特征匹配,图像处理,opencv,图像处理,python

7.2 FLANN

  • 进行批量特征匹配时,FLANN速度更快
  • 由于它使用的是临近近似值,所以精度较差

创建匹配器
flann = cv2.FlannBasedMatcher()
进行特征匹配
match = flann.match()
绘制匹配点
img3 = cv2.drawMatches()

import cv2
import numpy as np

# 读取图片,并转为灰度图
img1 = cv2.imread('./image/opencv_search.png')
img2 = cv2.imread('./image/opencv_orig.png')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 创建orb对象
orb = cv2.ORB_create()
# 对ORB进行检测
kp1, dst1 = orb.detectAndCompute(gray1, None)
kp2, dst2 = orb.detectAndCompute(gray2, None)
# 判断描述子的数据类型,若不符合,则进行数据替换
if dst1.dtype != 'float32':
    dst1 = dst1.astype('float32')
if dst2.dtype != 'float32':
    dst2 = dst2.astype('float32')

# 创建匹配器(FLANN)
flann = cv2.FlannBasedMatcher()
# 描述子进行匹配计算
matches = flann.match(dst1, dst2)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches, None)

cv2.imshow('img3', img3)

python open cv sift 特征匹配,图像处理,opencv,图像处理,python文章来源地址https://www.toymoban.com/news/detail-777337.html

到了这里,关于OpenCV(图像处理)-基于Python-特征检测-特征点匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 图像处理(二)之 基于OpenCV的水泥裂缝检测(区域延申)

    一、基本逻辑思路 1. 读取图形、修改尺寸、灰度图转换 2. 直方图均衡化 原理:         直方图均衡化通常是对图像灰度值进行归一化的方法,并且可以增强图像的对比度;         图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩

    2023年04月09日
    浏览(32)
  • Python-OpenCV中的图像处理-边缘检测

    Canny 边缘检测是一种非常流行的边缘检测算法,是 John F.Canny 在 1986 年提出的。它是一个有很多步构成的算法:噪声去除、计算图像梯度、非极大值抑制、滞后阀值等。 Canny(image: Mat, threshold1, threshold2, edges=…, apertureSize=…, L2gradient=…) 在 OpenCV 中只需要一个函数: cv2.Canny(),

    2024年02月13日
    浏览(31)
  • 基于 OpenCV 的车辆变道检测,计算机视觉+图像处理技术

    本期教程我们将和小伙伴们一起研究如何使用计算机视觉和图像处理技术来检测汽车在行驶中时汽车是否在改变车道!大家一定听说过使用 OpenCV 的 haar 级联文件可以检测到面部、眼睛等,但是如果目标是汽车,公共汽车呢? 01. 数据集 我们将道路上汽车的视频文件用作数据

    2024年01月25日
    浏览(47)
  • OpenCV基本图像处理操作(十)——图像特征harris角点

    角点 角点是图像中的一个特征点,指的是两条边缘交叉的点,这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中,角点是重要的特征,因为它们通常是图像中信息丰富的区域,可以用于图像分析、对象识别、3D建模等多种应用。 角点的识别可以帮助在进

    2024年04月23日
    浏览(31)
  • OpenCV(图像处理)-基于Python-轮廓查找

    一个图像中具有相同颜色或强度(灰度图)的连续点所组成的集合,就是轮廓。轮廓可用于图形分析、物体的识别与检测等等。 在图像中,为了防止轮廓边缘强弱不明显,需要先对图像进行二值化或Canny操作(一般改为黑底白字), 画轮廓时会修改输入的图像。 查找图形的

    2024年02月09日
    浏览(31)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之六 简单图像倾斜校正处理效果 一、简单介绍 二、简单图像倾斜校正处理效果实现原理 三、简单图像倾斜校正处理效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机程序设计语言。是一种面向对

    2024年04月13日
    浏览(40)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 视频图像处理基础操作 之 视频捕获/存储/提取/合成/合并

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 视频图像处理基础操作 之 视频捕获/存储/提取/合成/合并 一、简单介绍 二、视频处理流程和原理 三、视频的捕获和存储 四、提取视频中的某些帧 五、将图片合成为视频 六、多个视频合并 Python是一种跨平台的计算机程序设计

    2024年04月10日
    浏览(73)
  • Python 基于 OpenCV 视觉图像处理实战 之 背景知识

    目录 Python  基于 OpenCV 视觉图像处理实战  之 背景知识 一、简单介绍 二、人工智能(Artificial Intelligence,AI) 三、OpenCV 四、计算机视觉任务的主要类型 五、计算机视觉是通过创建人工模型来模拟本该由人类执行的视觉任务。 Python是一种跨平台的计算机程序设计语言。是一

    2024年04月12日
    浏览(36)
  • OpenCV(图像处理)-基于Python-图像的基本变换-平移-翻转-仿射变换-透视变换

    为了方便开发人员的操作,OpenCV还提供了一些图像变换的API,本篇文章讲简单介绍各种API的使用,并附上一些样例。 图像缩放函数,用于把图像按指定的尺寸放大或缩小。 dst = cv2.resize(src, dsize, fx, fy, interpolation) dst = 生成的目的图像 src:需要变换的原图像 disize:(x, y)需要

    2024年02月08日
    浏览(38)
  • 数字图像处理(实践篇)二十九 OpenCV-Python在图像中检测矩形、正方形和三角形的实践

    目录 1 方案 2 实践 1 方案 ①检测矩形和正方形 ⒈检测图像中的所有轮廓。 ⒉循环检查所有检测到的轮廓。 ⒊为每个轮廓找到近似的轮廓。如果近似轮廓中的顶点数为4,则计算 宽高比 用来区分 矩形 和 正方形 。如果宽高比在0.9到1.1之间,则认为为正方形,否则的话,则为

    2024年01月25日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包