文章目录1、Harris角点检测1.1 基本概念1.2 数学表达2、实现与测试2.1 代码2.2 运行结果2.3 参数变化2.3.1 其他不变,改变k(此时sigma=3)2.3.2 其他不变,改变sigma(k=0.04) 1、Harris角点检测 1.1 基本概念 角点:窗口向任意方向的移动都导致图像灰度的明显变化。 1.2 数学表达 将图像窗口平移[u,v]产生灰度变化E(u,v): 那么,如何求解平移后的图像灰度I(x+u,y+v),以及灰度变化E(u,v)呢? 将I(x+u, y+v)函数在(x, y)处泰勒展开,得: 则可求得灰度变化: 于是对于局部微小的移动量 [u,v ### Harris角点检测 #### 1.1 基本概念 角点是图像处理中的一个重要概念,在图像特征提取和匹配领域中具有重要的应用价值。简单来说,角点是指那些在一定窗口范围内移动时,无论往哪个方向移动都会引起图像灰度显著变化的点。这些点通常位于图像中的边界交汇处或者纹理丰富的地方。角点因其稳定性高、易于匹配等特性而在图像匹配、物体识别等领域被广泛使用。 #### 1.2 数学表达 为了更好地理解角点的数学定义,我们可以通过以下步骤来推导角点的数学模型。 1. **图像窗口平移与灰度变化**: 当我们将一个固定大小的窗口在图像上进行平移时,如果这个窗口内的灰度变化非常大,那么这个窗口中心的点很可能就是一个角点。为了量化这种灰度的变化,我们可以定义一个能量函数 \( E(u,v) \) 来表示窗口平移后图像的灰度变化。这里的 \( u \) 和 \( v \) 分别代表窗口在水平和垂直方向上的平移距离。 2. **泰勒展开与灰度变化的求解**: 对于平移后的图像灰度 \( I(x+u, y+v) \),我们可以通过在当前点 \( (x, y) \) 处对 \( I(x+u, y+v) \) 进行泰勒展开来近似求解其值。假设图像在 \( (x, y) \) 点的梯度为 \( I_x, I_y \),那么根据泰勒公式,有: \[ I(x+u, y+v) \approx I(x, y) + I_x u + I_y v \] 从而灰度变化 \( E(u, v) \) 可以表示为: \[ E(u, v) = \sum_{x, y} w(x, y) [I(x+u, y+v) - I(x, y)]^2 \] 3. **灰度变化的简化**: 通过将上面的泰勒展开式代入到 \( E(u, v) \) 的定义中,可以得到: \[ E(u, v) \approx \begin{pmatrix} u & v \end{pmatrix} M \begin{pmatrix} u \\ v \end{pmatrix} \] 其中 \( M \) 是一个 \( 2 \times 2 \) 的矩阵,表示为: \[ M = \begin{pmatrix} \sum_{x, y} w(x, y) I_x^2 & \sum_{x, y} w(x, y) I_x I_y \\ \sum_{x, y} w(x, y) I_x I_y & \sum_{x, y} w(x, y) I_y^2 \end{pmatrix} \] 4. **角点响应函数**: 对于局部微小的移动量 [u,v],可以近似得到下面的表达: \[ E(u, v) = \lambda_1 u^2 + 2\lambda_2 uv + \lambda_3 v^2 \] 其中,\( \lambda_1, \lambda_2, \lambda_3 \) 是实对称矩阵 \( M \) 的特征值。角点响应函数 \( R \) 定义为: \[ R = det(M) - k \cdot trace^2(M) \] 其中 \( det(M) \) 表示矩阵 \( M \) 的行列式,\( trace(M) \) 表示矩阵 \( M \) 的迹,而 \( k \) 是一个介于 0 和 0.25 之间的经验值,常用值为 0.04 或 0.06。 #### 2. 实现与测试 #### 2.1 代码 接下来,我们来看一下Harris角点检测的Python实现代码片段: ```python from pylab import * from PIL import Image from PCV.localdescriptors import harris from scipy.ndimage import filters def compute_harris_response(im, sigma=3): # 在一幅灰度图像中,对每个像素计算Harris角点检测器响应函数 k = 0.04 imx = zeros(im.shape) filters.gaussian_filter(im, (sigma, sigma), (0, 1), imx) imy = zeros(im.shape) filters.gaussian_filter(im, (sigma, sigma), (1, 0), imy) # 计算Harris矩阵分量 Wxx = filters.gaussian_filter(imx * imx, sigma) Wxy = filters.gaussian_filter(imx * imy, sigma) Wyy = filters.gaussian_filter(imy * imy, sigma) # 计算矩阵的特征值和迹 Wdet = Wxx * Wyy - Wxy ** 2 Wtr = Wxx + Wyy # 返回像素值为Harris响应函数值的一幅图像 return Wdet / Wtr # 读入图像 im = array(Image.open('p3.jpg').convert('L')) # 检测Harris角点 harrisim = compute_harris_response(im) # 显示Harris响应图 harrisim1 = 255 - harrisim figure() gray() subplot(141) imshow(harrisim1) print(harrisim1.shape) axis('off') axis('equal') threshold = [0.01, 0.05, 0.1] for i, thres in enumerate(threshold): # 获取Harris角点 filtered_coords = harris.get_harris_points(harrisim, 6, thres) # 显示角点 subplot(1, 4, i+2) imshow(im) plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords]) ``` #### 2.2 运行结果 在运行上述代码之后,可以得到一系列的图像,包括原始图像和不同阈值下的Harris角点检测结果。这些结果可以帮助我们直观地看到不同参数设置下的角点检测效果。 #### 2.3 参数变化 为了进一步理解Harris角点检测的效果,我们可以尝试改变两个主要参数:\( k \) 和 \( \sigma \)。 ##### 2.3.1 其他不变,改变k(此时sigma=3) - **改变k的影响**:\( k \) 的值会影响角点响应函数 \( R \) 的计算结果。当 \( k \) 较小时,更倾向于检测到较多的角点,但可能会包含一些噪声;当 \( k \) 较大时,则只保留少数高质量的角点。 - **实验结果**:通过改变 \( k \) 的值,观察角点数量和质量的变化。 ##### 2.3.2 其他不变,改变σ(k=0.04) - **改变σ的影响**:\( \sigma \) 控制着高斯滤波器的宽度,即对图像的平滑程度。较大的 \( \sigma \) 值会使得图像变得更加平滑,减少细节,但也可能导致部分角点丢失;较小的 \( \sigma \) 值能够保留更多细节,但可能会引入噪声。 - **实验结果**:通过改变 \( \sigma \) 的值,观察角点数量和质量的变化。 通过上述理论分析和实验操作,我们可以更深入地理解Harris角点检测算法的工作原理及其在实际应用中的表现。
- 粉丝: 4
- 资源: 917
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 废料垃圾数据集,yolov7标注,9562张图片,可识别瓶子,纸板,金属,其他的,纸,宠物,塑料,聚丙烯,塑料,皮带
- VirtualTreeview全部示例Demo源码
- SSM 框架下 JSP 赋能房屋租售系统数字化变革浪潮
- 优化博客模板 – pbootcms H5自适应响应式网站模板 - 源码下载
- 洛谷-题单广场-入门1顺序结构前五题
- ABB机器人碰撞报警后回弹功能的相关设置.docx
- Java课程设计-基于Springboot医疗服务系统(前后端源码+数据库)大作业.zip
- 企业人事信息管理系统:SSM 框架 JavaWeb 与 JSP 助力人力管理变革突破
- Java毕业设计-基于Springboot医疗服务系统(前后端源码+数据库).zip
- 农场害虫图像分类数据集【已标注,约1,500张数据】