python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法

这篇具有很好参考价值的文章主要介绍了python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

harris角点检测

原理

Harris 角点检测是一种用于在图像中检测角点的算法。角点是图像中局部区域的交叉点或者突出的特征点。Harris 角点检测算法旨在寻找图像中对于平移、旋转和尺度变化具有不变性的角点。

该算法通过计算图像中每个像素点的灰度值的变化,来识别角点。具体来说,Harris 角点检测通过以下步骤实现:

  1. 计算图像的梯度: 对图像进行空间梯度的计算,通常使用 Sobel 等滤波器。

  2. 计算结构矩阵: 对每个像素点,根据其周围像素的梯度计算一个结构矩阵。结构矩阵是一个2x2的矩阵,其中包含了该像素点附近局部梯度的信息。

  3. 计算角点响应函数: 利用结构矩阵的信息,计算每个像素点的角点响应函数。Harris 角点检测使用如下的角点响应函数:

R = det ⁡ ( M ) − k ⋅ trace 2 ( M ) R = \det(M) - k \cdot \text{trace}^2(M) R=det(M)ktrace2(M)

其中,M是结构矩阵, det ⁡ \det det表示矩阵的行列式, trace \text{trace} trace 表示矩阵的迹,k是一个常数(通常取较小的值)。

  1. 选取角点: 通过对角点响应函数进行阈值处理,选择角点。通常,角点响应函数大于某个阈值的像素点被认为是角点。

Harris 角点检测的优势在于它对图像的平移、旋转和尺度变化有较好的不变性,因此在计算机视觉领域中被广泛应用。检测到的角点通常用于图像匹配、物体识别、图像配准等应用。

对于角点的检测,harris依据一下直观判断:角点应该在窗口的各个方向都有变化,边界会在某个方向基本不变,而平坦区域在各个方向变化都小。

函数

cv2.cornerHarris(src, blockSize, ksize, k, dst, borderType)

  • src:数据类型为float32的输入图像
  • blockSize:角点检测中要考虑的领域大小
  • ksize:Sobel求导中使用的窗口大小
  • k:Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].
  • dst:目标图像
  • borderType:边界类型
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
 
def plot(img, n):
    filename = img
    #读入图像并转化为float类型,用于传递给harris函数
    img = cv2.imread(filename)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = np.float32(gray)
    # 输入图像必须是 float32 
    
    #对图像执行harris,最后一个参数在 0.04 到 0.05 之间
    dst = cv2.cornerHarris(gray, 2, 3, 0.04)
    
    # result is dilated for marking the corners, not important(腐蚀harris结果)
    dst = cv2.dilate(dst, None)
    
    # Threshold for an optimal value, it may vary depending on the image.(设置阈值)
    Threshold = 0.005*dst.max()
    img[dst > Threshold] = [255, 0, 0] # RGB,[0,0,255]表示该点为红色
    
    # 打印图像
    plt.subplot(1, 3, n), plt.imshow(img, cmap='gray'),
    plt.title('dst'), plt.axis('off')
 
 
plot('test30.jpg', 1)
plot('test30_1.jpg', 2)
plot('test30_2.jpg', 3)
 
plt.show()

python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法,数字图像处理,python,算法,计算机视觉

# 一般方法
import cv2
import numpy as np


img = cv2.imread('./image/img2.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)

img[dst > 0.1 * dst.max()] = [0, 0, 255]
cv2.imshow('dst', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法,数字图像处理,python,算法,计算机视觉


图像尺度空间

概念

尺度空间就是试图在图像领域中模拟人眼观察物体的概念与方法。

这是由于通过计算机视觉系统,我们无法直接获取所关注物体、对象的大小,这时候就需要一个尺度空间来描述。

在一定的范围内,无论物体是大还是小,人眼都可以分辨出来。然而计算机要有相同的能力却不是那么的容易,在未知的场景中,计算机视觉并不能提供物体的尺度大小,其中的一种方法是把物体不同尺度下的图像都提供给机器,让机器能够对物体在不同的尺度下有一个统一的认知。在建立统一认知的过程中,要考虑的就是在图像在不同的尺度下都存在的特征点。

使之能在图像模糊的时候能识别出来是什么东西(教室里看到的清晰的班主任和球场上可以认出走过来的模糊人脸是班主任)

二维图像的尺度空间定义

python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法,数字图像处理,python,算法,计算机视觉

局部不变性

对于目标物体,我们希望通过一些特征来描述它。比如车,可以选取车牌、轮廓等特征,对于人脸,则有五官、面型等特征。

分析图像物体时,我们关注的是目标与背景的差异性,局部不变性就是特征分析的重要性质。其包括:

  • 尺度不变性

    摄像头相对于物体远近呈现出来的物体尺寸不受其大小影响。 貌似说:就是不管你的物体大小如何,摄像头都可以改变目标物体的图像大小,只不过是摄像头放的远近问题。比如说:两个除了尺寸之外都一样的球,摄像头离大的球远一些,离小的球近一些,在某个点上,就会出现图像上两个球一样大小的情况。

  • 旋转不变性

    即若图像按下式进行变换(相当于所有坐标在极坐标下旋转θ角度):

python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法,数字图像处理,python,算法,计算机视觉
python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法,数字图像处理,python,算法,计算机视觉
图像的某些特征值不变,(某些函数值不变,如hu矩)

当这个物体发生旋转时,我们照样可以正确地辨认它,这就是所谓的旋转不变性(另外一个熟悉的具有旋转不变形的是拉普拉斯算子)

局部不变特征

全局特征:从整个图像中抽取的特征。较多的运用在图像检索领域,如图像颜色直方图。

局部特征:从图像的局部区域中抽取的特征(这个局部区域往往是图像中的一个像素及它周围的邻域)。

一种好的局部特征应该具有下面的特性:

  • 可重复性:同一个物体在不同时间,不同角度拍到图像中,检测到的特征对应的越多越好。
  • 独特性:特征在该物体上表现为独特性,能与场景下其他物体区分。
  • 局部性:特征往往是物体某个局部的特点,这样才可以避免遮挡时不能匹配的问题。
  • 数量性:检测到的特征数目一定要多,密集度最好能在一定程度上反映图像的内容。
  • 准确性:得到的特征应该能被精确定位,能够精确到像素。
  • 高效性:特征检测算法运算要快。

为了研究图像的尺度不变特征,我们需要先从图像的尺度空间理论开始。

当用一个机器视觉系统分析未知场景时,计算机没有办法预先知识图像中物体尺度,因此,我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度。

所以在很多时候,我们会在将图像构建为一系列不同尺度的图像集,在不同的尺度中去检测我们感兴趣的特征。比如:在Harr特征检测人脸的时候,因为我们并不知道图像中人脸的尺寸,所以需要生成一个不同大小的图像组成的金字塔,扫描其中每一幅图像来寻找可能的人脸

SIFT算法

SIFT(Scale-Invariant Feature Transform)是一种用于图像处理和计算机视觉中的特征提取算法,它具有尺度不变性和旋转不变性,因此在图像匹配、目标识别和图像配准等领域得到广泛应用。

SIFT 算法的主要步骤包括:

  1. 尺度空间极值检测: 在不同的尺度下,通过高斯滤波器构建图像的尺度空间金字塔,然后在每个尺度下检测局部极值点(关键点)。这些关键点代表图像中的显著特征。

  2. 关键点定位: 在检测到的极值点中,通过比较其尺度空间的局部邻域,选择稳定的关键点。这些关键点具有在尺度、位置和方向上的不变性。

  3. 方向分配: 为每个关键点分配主方向,使得该关键点对于旋转具有不变性。SIFT 使用梯度方向直方图来确定关键点的主方向。

  4. 关键点描述: 使用关键点周围的图像信息来创建描述符。描述符是一个向量,包含关键点周围区域的梯度信息。这些描述符是用于匹配关键点的特征。

SIFT 算法的优点包括对于尺度、旋转、光照变化等的不变性,以及对于局部图像区域的高判别性。然而,由于 SIFT 的计算量较大,因此在实时性要求较高的应用中可能会受到一些限制。

要点

检测到关键点 —(种子、直方图统计)—> 生成特征向量

让选择的特征点更加准确:把图像首先做一个金字塔,金字塔中每一层做不同的高斯滤波,让每一层图像进行不同程度的模糊,通过差分的方法选出最有价值的点,点的选择方法:DoG空间极值检测——在3X3的三维像素区域内(类似魔方)将中心点与周围26个像素点进行比较,得到候选关键点;但这些点是DOG空间的局部极值点,而且均为离散的点。故需要对这些点做曲线拟合操作,计算其极值点,从而实现关键点(特征点)的精确定位。补充完善:消除边界响应(Hessian矩阵)

得到特征点坐标后,接着要获取特征点的主方向,要先算出每个点坐标Location(x,y)的梯度的模m(x,y)以及方向θ(x,y),完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向,生成特征描述;为保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标旋转θ角度,即将坐标轴旋转为特征点的主方向;旋转之后以主方向为中心取8X8的窗口,求每个像素的梯度幅值和方向,找到一些种子点,基于这些种子,算出每一小块的直方图(8维向量),最终得到16X8=128维的向量。这样一个关键点就会产生128维的SIFT特征向量。

import cv2


img = cv2.imread('./image/img1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
# 注:新版本(对应py3.9)为sift = cv2. SIFT_create()


kp = sift.detect(gray, None)
# 找到关键点

img = cv2.drawKeypoints(gray, kp, img)
# 绘制关键点

cv2.imshow('sp',img)
cv2.waitKey(0)

python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法,数字图像处理,python,算法,计算机视觉文章来源地址https://www.toymoban.com/news/detail-803935.html


到了这里,关于python数字图像处理基础(八)——harris角点检测、图像尺度空间、SIFT算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • python数字图像处理基础(九)——特征匹配

    蛮力匹配(ORB匹配) Brute-Force匹配非常简单,首先在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点. 对于BF匹配器,首先我们必须使用**cv2.BFMatcher()**创建 BFMatcher 对象。它需要两个可选的参数: normTyp

    2024年01月19日
    浏览(54)
  • python数字图像处理基础(五)——Canny边缘检测、图像金字塔、图像分割

    梯度是什么? 梯度就是变化的最快的那个方向 edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 第一个参数是需要处理的原图像,该图像必须为单通道的灰度图; 第二个参数是阈值1; 第三个参数是阈值2。 原理步骤 1)使用高斯滤波器,以平滑图像,滤除噪

    2024年01月18日
    浏览(48)
  • python数字图像处理基础(二)——图像基本操作、滑动条、鼠标操作

    import cv2 import numpy as np import matplotlib.pyplot as plt 图像读取 cv2.MREAD_COLOR: 彩色图像 或用1 cv2.IMREAD_GRAYSCALE:灰度图像 或用0 img = cv2.imread(‘cat.jpg’, cv2.IMREAD_GRAYSCALE) 等同于: img = cv2.imread(‘cat.jpg’, 0) 图像的显示,也可以创建多个窗口 cv2.imshow(‘img’, img) 等待时间,毫秒级,0表示

    2024年01月18日
    浏览(60)
  • python数字图像处理基础(七)——直方图均衡化、傅里叶变换

    均衡化原理 图像均衡化是一种基本的图像处理技术,通过更新图像直方图的像素强度分布来调整图像的全局对比度。这样做可以使低对比度的区域在输出图像中获得更高的对比度。 简单理解:改变图像对比度,让色彩更丰富,灰度值直方图:瘦高 - 均衡 本质上,直方图均衡

    2024年01月18日
    浏览(56)
  • 【图像处理】SIFT角点特征提取原理

            提起在OpenCV中的特征点提取,可以列出Harris,可以使用SIFT算法或SURF算法来检测图像中的角特征点。本篇围绕sift的特征点提取,只是管中窥豹,而更多的特征点算法有: Harris Stephens / Shi–Tomasi 角点检测算法 Förstner角点检测器; 多尺度 Harris 算子 水平曲线曲率法

    2024年02月07日
    浏览(43)
  • 数字信号与图像处理实验三:图像处理基础与图像变换

    ​ 通过本实验加深对数字图像的理解,熟悉MATLAB中的有关函数;应用DCT对图像进行变换;熟悉图像常见的统计指标,实现图像几何变换的基本方法。 ​ 选择两幅图像,读入图像并显示,同时使用Matlab计算图像的大小,灰度平均值、协方差矩阵、灰度标准差和相关系数。 DC

    2024年02月04日
    浏览(62)
  • 数字图像处理MATLAB大作业:基础版

    本次程序共分为10个功能点: 第一个功能点是实现彩色图像的灰度化、灰度图像的二值化及图像的灰度变化。 第二个功能点是实现图像的代数运算及逻辑运算。 第三个功能点是基于直方图修正的图像增强。 第四个功能点是基于空间域去实现图像平滑和提取图像边缘。 第五个

    2024年02月05日
    浏览(49)
  • 彩色图像处理之彩色图像直方图处理的python实现——数字图像处理

    彩色图像的直方图处理是一种重要的图像处理技术,用于改善图像的视觉效果,增强图像的对比度,或为后续的图像处理任务(如图像分割、特征提取)做准备。彩色图像通常由红色(R)、绿色(G)、蓝色(B)三个颜色通道组成,因此彩色图像的直方图处理相比单色图像更

    2024年01月23日
    浏览(69)
  • 《数字图像处理-OpenCV/Python》连载:形态学图像处理

    本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 形态学图像处理是基于形状的图像处理,基本思想是利用各种形状的结构元进行形态学运算,从图像中提取表达和描绘区域形状的结构信息。形态学运算的数学原

    2024年02月19日
    浏览(81)
  • 数字图像处理与Python实现

    1.1数字图像简介 目的 提升图像的视觉感知质量 提取图像中感兴趣区域或特征 方便图像的存储和运输 特点 可再现能力强 处理精度高 适用范围广 灵活性高 方法 图像变换 图像压缩编码 图像增强和复原 图像分割 图像描述 图像分类(识别) 1.2图像的采样和量化 是将模拟图像转

    2024年02月04日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包