Harris角点检测算法
Harris角点检测算子

2014.3.30周报 Harris 角点检测算子Harris 角点检测算子是Moravec 角点检测算子的改进(1) Harris 算子用高斯函数代替二值窗口函数,对离中心点越来越近的像素赋予较大的权重,以减少噪声影响。
2222/)(221),(δπδy x ey x w +-=图1 高斯函数(2) Moravec 算子只考虑了每隔45度方向,Harris 算子用Taylor 展开去近似任意方向。
∑-++=yx y x I v y u x I y x w v u E ,2)],(),()[,(),(∑-=yx x v u O u I y x w ,222)],()[,(写成矩阵形式:⎥⎥⎦⎤⎢⎢⎣⎡⊗=⎥⎥⎦⎤⎢⎢⎣⎡=∑22,22),(),(y y x y x x y x y y x y x x I I I I I I y x w I I I I I I y x w M (1-2) ⎥⎦⎤⎢⎣⎡≅v u M v u v u E ],[),( (1-3)式中,lx 为x 方向的差分,ly 为y 方向的差分,w(x,y)为高斯函数。
(3) Harris 采用了一种新的角点判定方法。
矩阵M 的两个特征向量1l 和2l 与矩阵M 的主曲率成正比。
Harris 利用1l ,2l 来表征变化最快和最慢的两个方向,若两个都很大就是角点,一个大一个小就是边缘,两个都小就是在变化缓慢的图像区域。
图2用矩阵M 的特征向量分类图像像素点但是解特征向量需要比较多的计算量,且两个特征值的和等于矩阵M 的迹,两个特征值的积等于矩阵M 的行列式。
所以用(1-4)式来判定角点质量。
(k 常取0.04-0.06)2)(det traceM k M R -= (1-4)(4) Harris 算法总结Step1:对每一像素点计算相关矩阵M2),(x I y x w A ⊗=2),(yI y x w B ⊗= )(),(22y x I I y x w D C ⊗==⎪⎪⎭⎫ ⎝⎛=D C B A MStep2:计算每个像素的Harris 角点响应22)()(B A k CD AB R +-=Step3:在w w *范围内寻找极大值点,若Harris 角点响应大于阈值,则视为角点。
harris方法

harris方法Harris方法是一种计算机视觉中常用的角点检测算法,它可以用于图像特征提取和图像匹配等任务。
该方法由Chris Harris和Mike Stephens于1988年提出,被广泛应用于计算机视觉领域。
Harris方法的核心思想是通过计算图像中每个像素点的灰度值变化来判断其是否为角点。
角点是图像中灰度值变化较大的区域,而平滑区域和边缘区域的灰度值变化较小。
因此,通过检测灰度值变化较大的像素点,我们可以找到图像中的角点。
Harris方法的计算过程如下:首先,我们需要对图像进行灰度化处理,将彩色图像转换为灰度图像。
然后,对每个像素点计算其相邻像素的灰度值变化,通常使用Sobel算子或Scharr算子来计算像素点的梯度。
接着,利用梯度计算出每个像素点的角点响应函数R,该函数用于度量像素点的角点程度。
角点响应函数的计算公式如下:R = det(M) - k * (trace(M))^2其中,det(M)表示M的行列式,trace(M)表示M的迹,k是一个经验参数,用于调节角点响应函数的灵敏度。
计算完所有像素点的角点响应函数后,我们需要对其进行非极大值抑制,以保留具有最大角点响应值的像素点。
非极大值抑制的过程是,对每个像素点,比较其角点响应值与其邻域像素点的角点响应值,如果大于所有邻域像素点的角点响应值,则保留该像素点作为角点。
Harris方法的优点是简单易实现,并且对图像的尺度和旋转变化具有一定的不变性。
此外,它还可以用于图像配准、目标跟踪等应用中。
然而,Harris方法也存在一些局限性。
首先,对于存在噪声的图像,角点的检测可能会受到干扰。
其次,Harris方法对于具有纹理模式的区域也容易将其误判为角点。
此外,Harris方法在存在图像尺度变化较大的情况下,检测效果可能会受到影响。
为了克服Harris方法的局限性,后续的研究提出了许多改进的角点检测算法,如SIFT、SURF和FAST等。
这些算法在角点检测的灵敏度、速度和鲁棒性等方面都有所提升,广泛应用于计算机视觉和图像处理领域。
python实现Harris角点检测算法

python实现Harris⾓点检测算法算法流程:1. 将图像转换为灰度图像2. 利⽤Sobel滤波器求出海森矩阵 (Hessian matrix) :将⾼斯滤波器分别作⽤于Ix²、Iy²、IxIy计算每个像素的 R= det(H) - k(trace(H))²。
det(H)表⽰矩阵H的⾏列式,trace表⽰矩阵H的迹。
通常k的取值范围为[0.04,0.16]。
满⾜ R>=max(R) * th 的像素点即为⾓点。
th常取0.1。
Harris算法实现:import cv2 as cvimport numpy as npimport matplotlib.pyplot as plt# Harris corner detectiondef Harris_corner(img):## Grayscaledef BGR2GRAY(img):gray = 0.2126 * img[..., 2] + 0.7152 * img[..., 1] + 0.0722 * img[..., 0]gray = gray.astype(np.uint8)return gray## Sobeldef Sobel_filtering(gray):# get shapeH, W = gray.shape# sobel kernelsobely = np.array(((1, 2, 1),(0, 0, 0),(-1, -2, -1)), dtype=np.float32)sobelx = np.array(((1, 0, -1),(2, 0, -2),(1, 0, -1)), dtype=np.float32)# paddingtmp = np.pad(gray, (1, 1), 'edge')# prepareIx = np.zeros_like(gray, dtype=np.float32)Iy = np.zeros_like(gray, dtype=np.float32)# get differentialfor y in range(H):for x in range(W):Ix[y, x] = np.mean(tmp[y : y + 3, x : x + 3] * sobelx)Iy[y, x] = np.mean(tmp[y : y + 3, x : x + 3] * sobely)Ix2 = Ix ** 2Iy2 = Iy ** 2Ixy = Ix * Iyreturn Ix2, Iy2, Ixy# gaussian filteringdef gaussian_filtering(I, K_size=3, sigma=3):# get shapeH, W = I.shape## gaussianI_t = np.pad(I, (K_size // 2, K_size // 2), 'edge')# gaussian kernelK = np.zeros((K_size, K_size), dtype=np.float)for x in range(K_size):for y in range(K_size):_x = x - K_size // 2_y = y - K_size // 2K[y, x] = np.exp( -(_x ** 2 + _y ** 2) / (2 * (sigma ** 2)))K /= (sigma * np.sqrt(2 * np.pi))K /= K.sum()# filteringfor y in range(H):for x in range(W):I[y,x] = np.sum(I_t[y : y + K_size, x : x + K_size] * K)return I# corner detectdef corner_detect(gray, Ix2, Iy2, Ixy, k=0.04, th=0.1):# prepare output imageout = np.array((gray, gray, gray))out = np.transpose(out, (1,2,0))# get RR = (Ix2 * Iy2 - Ixy ** 2) - k * ((Ix2 + Iy2) ** 2)# detect cornerout[R >= np.max(R) * th] = [255, 0, 0]out = out.astype(np.uint8)return out# 1. grayscalegray = BGR2GRAY(img)# 2. get difference imageIx2, Iy2, Ixy = Sobel_filtering(gray)# 3. gaussian filteringIx2 = gaussian_filtering(Ix2, K_size=3, sigma=3)Iy2 = gaussian_filtering(Iy2, K_size=3, sigma=3)Ixy = gaussian_filtering(Ixy, K_size=3, sigma=3)# 4. corner detectout = corner_detect(gray, Ix2, Iy2, Ixy)return out# Read imageimg = cv.imread("../qiqiao.jpg").astype(np.float32)# Harris corner detectionout = Harris_corner(img)cv.imwrite("out.jpg", out)cv.imshow("result", out)cv.waitKey(0)cv.destroyAllWindows()实验结果:原图:Harris⾓点检测算法检测结果:以上就是python 实现Harris⾓点检测算法的详细内容,更多关于python Harris⾓点检测算法的资料请关注其它相关⽂章!。
harris角点检测算法的原理

harris角点检测算法的原理宝子!今天咱来唠唠这个超有趣的Harris角点检测算法的原理呀。
你看啊,在图像里呢,角点可是很特别的存在。
就像是人群里那个特别出众的帅哥或者美女,一眼就能被瞅见。
角点不是那种平平无奇的点哦。
比如说在一个方形的图像里,四个角就是很典型的角点。
那这个Harris角点检测算法呢,就像是一个超级侦探,专门去把这些角点给找出来。
想象一下,这个算法是怎么看待图像的呢?它把图像看成是一个充满变化的小世界。
对于图像中的每个小区域,算法会去研究这个区域周围的像素是怎么变化的。
就好比你站在一个小广场上,看看周围的人是怎么分布的,是均匀散开呢,还是有某个方向特别密集或者稀疏。
这个算法有个很关键的东西叫自相关函数。
这函数就像是一个小魔法棒,它会去计算每个小区域在不同方向上的像素变化情况。
如果在某个点的周围,不管你朝哪个方向去看,像素的变化都很明显,那这个点就很有可能是角点啦。
比如说,你在一个十字街头,不管你是看南北方向的街道,还是东西方向的街道,周围的景色(也就是像素)变化都很大,那这个十字路口就像是图像里的角点一样。
那这个算法具体是怎么操作的呢?它会先建立一个小的窗口,就像拿着一个小放大镜在图像上到处看。
这个窗口会在图像上滑动,每到一个地方,就开始计算这个地方的自相关函数。
这个计算过程呢,其实就是在看这个小窗口里的像素和周围像素的关系。
如果这个关系在各个方向上都很独特,那就有可能是角点啦。
你知道吗,这个算法还会用到矩阵呢。
不过别被矩阵吓到,它就像是一个小账本,记录着这个小区域像素变化的各种信息。
比如说,矩阵会告诉你这个区域在水平方向和垂直方向上像素变化的快慢呀之类的。
如果这个矩阵的特征值有某种特殊的情况,那就说明这个点很可能是角点。
就好像是这个小账本上的某些数字组合起来,就指向了这个特别的角点。
而且哦,这个Harris角点检测算法还有个很贴心的地方。
它不是那种很死板的算法,它会根据不同的图像特点去调整自己的判断标准。
harris方法

harris方法Harris方法是一种经典的计算机视觉算法,被广泛应用于图像特征提取和图像匹配问题中。
它由Harris和Stephens于1988年提出,主要用于检测图像中的角点。
本文将从原理、特点和应用三个方面介绍Harris方法。
一、原理Harris方法的核心思想是通过计算图像像素的灰度值变化来判断是否存在角点。
角点是图像中灰度值变化显著的点,通常对应着物体的边缘或角落。
Harris方法通过计算图像中每个像素点的Harris响应函数来确定角点的位置。
Harris响应函数的计算公式为:R = det(M) - k(trace(M))^2其中,M是一个2x2的矩阵,表示每个像素点附近的灰度值变化情况。
det(M)表示矩阵M的行列式,trace(M)表示M的迹,k是一个常数。
二、特点Harris方法具有以下特点:1. 不受图像旋转和尺度变化的影响,对于图像的平移和旋转具有很好的鲁棒性;2. 对于噪声和光照变化具有一定的抗干扰能力;3. 可以检测出图像中的角点,并将其与其他特征点进行区分。
三、应用Harris方法在计算机视觉领域具有广泛的应用,主要包括以下几个方面:1. 特征点提取:Harris方法可以用于提取图像中的角点作为特征点,用于图像配准、目标跟踪等任务。
2. 特征匹配:通过计算两幅图像中的特征点之间的距离和相似度,可以实现图像的匹配和对齐。
3. 三维重建:通过对多幅图像进行特征点提取和匹配,可以实现三维场景的重建和建模。
4. 目标检测:通过检测图像中的角点,可以实现目标的检测和识别。
总结:Harris方法是一种经典而有效的图像特征提取算法,具有鲁棒性和抗干扰能力,广泛应用于计算机视觉领域。
它通过计算图像像素的灰度值变化来检测角点,可以用于特征点提取、特征匹配、三维重建和目标检测等任务。
在实际应用中,我们可以根据具体需求选择合适的参数和方法,以提高算法的性能和效果。
以上就是关于Harris方法的介绍,希望对读者对该方法有所了解,并能在实际应用中加以运用。
特征匹配-Harris角点检测

特征匹配-Harris⾓点检测⼀、harris算法简介1.⾓点概述⾓点是图像很重要的特征,对图像图形的理解和分析有很重要的作⽤。
⾓点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很⾼,有效地提⾼了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。
从图像分析的⾓度来定义⾓点可以有以下两种定义:⾓点可以是两个边缘的⾓点;⾓点是邻域内具有两个主⽅向的特征点;前者往往需要对图像边缘进⾏编码,这在很⼤程度上依赖于图像的分割与边缘提取,具有相当⼤的难度和计算量,且⼀旦待检测⽬标局部发⽣变化,很可能导致操作的失败。
基于图像灰度的⽅法通过计算点的曲率及梯度来检测⾓点,避免了第⼀类⽅法存在的缺陷,此类⽅法主要有Moravec算⼦、Forstner算⼦、Harris算⼦、SUSAN算⼦等。
本⽂主要介绍的Harris⾓点检测的算法原理。
2.Harris⾓点检测基本原理⼈眼对⾓点的识别通常是在⼀个局部的⼩区域或⼩窗⼝完成的。
如果在各个⽅向上移动这个特征的⼩窗⼝,窗⼝内区域的灰度发⽣了较⼤的变化,那么就认为在窗⼝内遇到了⾓点。
如果这个特定的窗⼝在图像各个⽅向上移动时,窗⼝内图像的灰度没有发⽣变化,那么窗⼝内就不存在⾓点;如果窗⼝在某⼀个⽅向移动时,窗⼝内图像的灰度发⽣了较⼤的变化,⽽在另⼀些⽅向上没有发⽣变化,那么,窗⼝内的图像可能就是⼀条直线的线段。
如下图:3、特征匹配流程3.1、根据准则,提取图像中的特征点3.2、提取特征点周围的图像块,构造特征描述符3.3、通过特征描述符对⽐,实现特征匹配⼆、Harris⾓点检测声明:为了更好地对 Harris⾓点检测算法进⾏分析,本次实验⼀共收集了纹理平坦、垂直边缘多、垂直边缘多的三个不同的场景,每个场景各收集了五幅的图⽚。
然后通过每个场景中正⾯、侧⾯、旋转、远近、光照五个不同的⽅⾯进⾏对⽐试验。
2.1、纹理平坦的场景(以书本为例)2.1.1、正⾯图及检测结果2.1.2、侧⾯图及检测结果2.1.3、旋转图及检测结果2.1.4 、远距离图及检测结果2.1.5 、光照图及检测结果实验结果分析与总结:Harris⾓点检测算⼦具有旋转不变性。
harris角点检测实验报告

harris角点检测实验报告Harris 角点检测实验报告一、引言二、Harris 角点检测算法原理Harris 角点检测算法的核心思想是基于局部自相关函数。
对于图像中的每个像素点,通过计算其在一定邻域内的灰度变化情况来判断是否为角点。
具体来说,首先对图像进行灰度化处理,然后计算每个像素点的梯度。
接着,构建一个二阶矩矩阵(也称为结构张量),其元素是像素点邻域内梯度的乘积。
通过分析这个二阶矩矩阵的特征值,可以判断该像素点是否为角点。
如果两个特征值都很大,说明在两个方向上灰度变化都很显著,即为角点;如果一个特征值大一个特征值小,说明在一个方向上灰度变化明显,为边缘;如果两个特征值都很小,说明灰度变化不明显,不是角点或边缘。
三、实验环境与准备(一)实验环境本次实验使用的编程语言为Python,使用的图像处理库为OpenCV。
(二)准备工作1、安装所需的 Python 库,如 OpenCV。
2、准备实验所需的图像数据集,包括各种类型的图像,如自然风景、人物、建筑物等。
四、实验步骤(一)图像读取与灰度化使用 OpenCV 的`imread`函数读取图像,并使用`cvtColor`函数将其转换为灰度图像。
```pythonimport cv2image = cv2imread('imagejpg')gray_image = cv2cvtColor(image, cv2COLOR_BGR2GRAY)```(二)计算梯度使用 Sobel 算子计算灰度图像的水平和垂直梯度。
```pythonsobelx = cv2Sobel(gray_image, cv2CV_64F, 1, 0, ksize=3)sobely = cv2Sobel(gray_image, cv2CV_64F, 0, 1, ksize=3)```(三)构建二阶矩矩阵根据梯度计算二阶矩矩阵的元素。
```pythonIxx = sobelx 2Ixy = sobelx sobelyIyy = sobely 2```(四)应用高斯滤波对二阶矩矩阵进行高斯滤波,以减少噪声的影响。
Harris角点检测

Harris⾓点检测⽬录OpenCV可以检测图像的主要特征,然后提取这些特征、使其成为图像描述符,这类似于⼈的眼睛和⼤脑。
这些图像特征可作为图像搜索的数据库。
此外,⼈们可以利⽤这些关键点将图像拼接起来,组成⼀个更⼤的图像,⽐如将许多图像放在⼀块,然后形成⼀个360度全景图像。
这⾥我们将学习使⽤OpenCV来检测图像特征,并利⽤这些特征进⾏图像匹配和搜索。
我们会选取⼀些图像,并通过单应性,检测这些图像是否在另⼀张图像中。
⼀特征检测算法有许多⽤于特征检测和提取的算法,我们将会对其中⼤部分进⾏介绍。
OpenCV最常使⽤的特征检测和提取算法有:Harris:该算法⽤于检测⾓点;SIFT:该算法⽤于检测斑点;SURF:该算法⽤于检测⾓点;FAST:该算法⽤于检测⾓点;BRIEF:该算法⽤于检测斑点;ORB:该算法代表带⽅向的FAST算法与具有旋转不变性的BRIEF算法;通过以下⽅法进⾏特征匹配:暴⼒(Brute-Force)匹配法;基于FLANN匹配法;可以采⽤单应性进⾏空间验证。
⼆特征定义那么,究竟什么是特征呢?为什么⼀副图像的某个特定区域可以作为⼀个特征,⽽其他区域不能呢?粗略的讲,特征就是有意义的图像区域,该区域具有独特特征和易于识别性。
因此⾓点及⾼密度区域都是很好的特征,⽽⼤量重复的模式或低密度区域(例如图像中的蓝⾊天空)则不是很好的特征。
边缘可以将图像分为两个区域,因此也可以看做好的特征。
斑点是与周围有很⼤差别的像素区域,也是有意义的特征。
⼤多数特征检测算法都会涉及图像的⾓点、边和斑点的识别,也有⼀些涉及脊向的概念,可以认为脊向是细长物体的对称轴,例如识别图像中的⼀条路。
⾓点和边都好理解,那什么是斑点呢?斑点通常是指与周围有着颜⾊和灰度差别的区域。
在实际地图中,往往存在着⼤量这样的斑点,如⼀颗树是⼀个斑点,⼀块草地是⼀个斑点,⼀栋房⼦也可以是⼀个斑点。
由于斑点代表的是⼀个区域,相⽐单纯的⾓点,它的稳定性要好,抗噪声能⼒要强,所以它在图像配准上扮演了很重要的⾓⾊。
harris角点检测的原理

harris角点检测的原理
Harris角点检测是一种计算机视觉算法,用于寻找图像中的角
点(即具有明显的边缘变化的局部区域)。
其原理如下:
1. 图像灰度化:将彩色图像转换为灰度图像,以便后续处理。
2. 梯度计算:根据图像灰度值计算每个像素的梯度,通常使用Sobel算子进行图像梯度计算。
3. 计算自相关矩阵:对于每个像素,计算其周围窗口内梯度的自相关矩阵。
自相关矩阵是一个2x2的矩阵,包含了图像的二阶梯度信息。
4. 计算Harris响应函数:根据自相关矩阵计算Harris响应函数,该函数用于评估每个像素周围区域是否为角点。
Harris响应函
数定义为:
R = det(M) - k(trace(M))^2
其中,M是自相关矩阵,det(M)和trace(M)分别表示矩阵的行
列式和迹,k是一个经验参数,用于调整角点检测的灵敏度。
5. 非最大抑制:对于Harris响应函数计算得到的角点,使用非最大抑制算法排除冗余的角点。
非最大抑制通常根据角点的Harris响应值大小和邻域内角点的距离来决定是否保留一个角点。
6. 阈值处理:根据Harris响应函数的阈值,将不满足要求的角点剔除。
通常会通过设定一个合适的阈值,以过滤掉噪声和不
显著的角点。
通过以上步骤,Harris角点检测算法可以在图像中准确地检测到具有明显边缘变化的角点,并过滤掉不相关的点和噪声。
完整版Harris角点检测算法编程步骤及示例演示

Harris 角点检测算法编程步骤及示例演示也不说那么多废话了,要介绍啥背景意义之类的,角点检测,顾名思义,就是检测角点,最简单的就是两条线的交点了,还有比如下国际象棋的棋盘格子的交点之类的,反正就是检测这些点。
简单将Harris 角点检测算法的思想说下,就是拿一个小窗在图像中移动,通过考察这个小窗口内图像灰度的平均变换值来确定角点。
1)如果窗口内区域图像的灰度值恒定,那么所有不同方向的偏移几乎不发生变化;2)如果窗口跨越一条边,那么沿着这条边的偏移几乎不发生变化,但是与边垂直的偏移会发生很大的变化;3)如果窗口包含一个孤立的点或者角点,那么所有不同方向的偏移会发生很大的变化。
面给出具体数学推导:设图像窗口平移量为( u,v) ,产生的灰度变化为E(u,v),有E(u,v)二sum[w(x,y)[l(x+u,y+v)-l(x,y)F2棋中w(x,y)为窗口函数, l(x+u,y+v为平移后的灰度值,l(x,y)为平移前的灰度值。
有泰勒公式展开可得:l(x+u,y+v)=l(x,y)+lx*u+ly*v+0(uA2,v八2);lx,ly分别为偏微分,在图像中为图像的方向导数因此E(u,v)=sum[w(x,y) [lx*u+ly*v+O(u八2,v八2)]八2],可以近似得到E(u,v)=sum[w(x,y) [lx*u+ly*v]^2],即E(u,v)二[u,v][lx八2,lx*ly;lx*ly,ly八2][u,v]T令M=[lx八2,lx*ly;lx*ly,ly八2],因此最后对角点的检测成了对矩阵M的特征值的分析了,令M 其特征值为x1,x2;当x1>>x2或者x2>>x1,则检测到的是边缘部分;当x1,x2都很小,图像窗口在所有移动的方向上移动灰度级都无明显变化.当X1,X2都很大时且相当,检测到的是角点。
编程时用x1,x2不方便,因此定义角点响应函数;R二det(M)-k(trace(M))八2;其中det(M)为矩阵M的行列式,trace(M)为矩阵M的迹。
Harris角点检测原理及实现

Harris⾓点检测原理及实现为便于理解,先简要介绍⾓点的概念和⾓点检测背景1 背景⾓点检测⼤致可分为三类:基于灰度图的⾓点检测、基于⼆值化图像的⾓点检测和基于轮廓曲线的⾓点检测。
Harris属于基于灰度图的⾓点检测。
2 Harris特征原理2.1 概述Harris⾓点检测根据窗⼝向多个⽅向,通过判断窗⼝内像素值有⽆明显变化判断有⽆⾓点。
如下图: 第⼀幅图像中,窗⼝内像素值⽆明显变化,⽆⾓点。
第⼆幅图像中,窗⼝⽔平移动时有明显变化,⽆⾓点。
第三幅图中,窗⼝多个⽅向移动时有明显变化,有⾓点。
Harris⾓点检测可分为三步:梯度计算、响应值计算、⾓点提取。
下⾯按步骤介绍。
2.2梯度计算: 对图像中的任意⼀像素点I(x,y),进⾏⾃相关平移w(x+Δx、y+Δy)得到⾃相关函数: c(x,y,Δx,Δy) = ∑w h(x,y)(I(x,y)-I(x+Δx,y+Δy))2 其中 ∑w表⽰窗⼝内的点,h(x,y)表⽰加权函数,加权函数可根据⾃⼰需要进⾏修改(通过修改源代码)。
由泰勒可得: I(x+Δx,y+Δy) = I(x,y)+ΔxI x(x,y)+ΔyI y(x,y)+p ≈I(x,y)+ΔxI x(x,y)+ΔyI y(x,y)代⼊⾃相关函数可得(加权函数暂时忽略): c(x,y,Δx,Δy) = ∑w(I(x,y)-I(x+Δx,y+Δy))2 ≈ ∑w((ΔxI x(x,y))2+2ΔxΔyI x(x,y)I y(x,y)+(ΔyI y(x,y))2) 将上公式⽤图表⽰如下: 其中,u和v分别表⽰Δx和Δy,w(x,y)表⽰加权函数。
Harris算法是通过判断像素值是否在多个⽅向上有明显变化可转换为为是否在x和y⽅向上像素值均有明显变化,再转换为Ix或Iy的变化,再转换为M矩阵的特征值λ1,λ2的变化,如下图:2.3响应值计算:上⾯计算不易于通过编程实现,Harris通过定义⾓点响应函数R的⽅式,⽤于表⽰⼀个⾓点的Harris响应值:trace表⽰为矩阵的迹,det为矩阵的⾏列式(矩阵的迹:主对⾓线上的值相加即所有特征值的和),k为经验常数,⼀般取0.04~0.06。
harris角点检测算法步骤

harris角点检测算法步骤Harris角点检测算法步骤:一、引言Harris角点检测算法是计算机视觉中常用的角点检测算法之一。
它通过分析图像的局部灰度变化来寻找图像中的角点,被广泛应用于图像处理、物体识别、图像匹配等领域。
本文将介绍Harris角点检测算法的步骤及其原理。
二、灰度处理Harris角点检测算法首先需要将彩色图像转换为灰度图像,这是因为角点检测主要关注图像的灰度变化而非颜色信息。
通过将彩色图像的每个像素的RGB值加权平均,可以得到相应的灰度值。
三、计算梯度接下来,对灰度图像进行梯度计算。
梯度表示图像中的灰度变化,是图像中像素灰度值变化最快的方向。
通过对图像使用Sobel算子或其他梯度计算算法,可以计算出每个像素的梯度幅值和方向。
四、计算结构张量在Harris角点检测算法中,结构张量是一个重要的概念。
对于每个像素点,结构张量是一个2x2的矩阵,它描述了该像素点周围区域的灰度变化情况。
结构张量的计算公式包括对梯度幅值的平方、梯度幅值的乘积以及梯度方向的加权。
五、计算角点响应函数角点响应函数是Harris角点检测算法的核心。
它通过对结构张量进行特征值分解,得到每个像素点的角点响应值。
角点响应值的计算公式是通过特征值的乘积减去特征值的和,再乘以一个经验系数。
如果特征值的乘积较大,说明该像素点是角点。
六、非极大值抑制由于角点响应函数在角点处达到最大值,但在边缘和平坦区域也可能有较大值,为了提取出准确的角点,需要进行非极大值抑制。
在非极大值抑制过程中,对于每个像素点,比较其角点响应值与周围像素点的角点响应值,如果大于周围像素点的角点响应值,则保留,否则抑制。
七、阈值处理为了进一步提取出准确的角点,可以根据角点响应值设置一个阈值。
只有角点响应值大于阈值的像素点才被认为是角点。
阈值的选择是一个关键问题,需要根据具体应用场景和图像特点进行调整。
八、角点标记最后一步是将检测到的角点在原始图像上进行标记。
harris角点检测算法原理

harris角点检测算法原理Harris角点检测算法原理引言:角点检测是计算机视觉中一项重要的任务,它可以帮助计算机识别和跟踪图像中的角点特征。
Harris角点检测算法是一种经典的角点检测方法,它通过计算图像中像素点的角点响应函数来确定角点的位置。
一、角点的定义和特点角点是图像中突然变化的区域,其特点是在多个方向上都具有较大的灰度变化。
由于角点在图像中具有明显的特征,因此检测角点可以帮助计算机识别和跟踪物体。
二、角点响应函数Harris角点检测算法通过计算每个像素点的角点响应函数来确定是否为角点。
角点响应函数的计算公式如下:R = det(M) - k * trace^2(M)其中,M是一个2×2的矩阵,表示像素点附近的灰度变化情况。
det(M)表示矩阵M的行列式,trace(M)表示矩阵M的迹,k是一个常数。
三、角点响应函数的计算步骤1. 图像梯度计算:首先,对图像进行梯度计算,得到每个像素点的梯度幅值和梯度方向。
2. 构建自相关矩阵:对于每个像素点,根据其周围像素点的梯度幅值和梯度方向,构建一个2×2的自相关矩阵M。
3. 计算角点响应函数:根据自相关矩阵M的行列式和迹,计算角点响应函数R。
4. 阈值化和非极大值抑制:对于每个像素点,根据角点响应函数的值,进行阈值化操作,并对超过阈值的像素点进行非极大值抑制。
四、Harris角点检测算法的优缺点1. 优点:(1)计算简单:Harris角点检测算法的计算量相对较小,适合在实时应用中使用。
(2)稳定性好:Harris角点检测算法对图像的旋转、缩放和亮度变化具有较好的稳定性。
(3)可靠性高:Harris角点检测算法在各种场景下都能够较为准确地检测到角点。
2. 缺点:(1)对噪声敏感:Harris角点检测算法对噪声比较敏感,噪声会影响角点的检测结果。
(2)对尺度变化不敏感:Harris角点检测算法对于图像的尺度变化比较不敏感,可能会漏检或误检角点。
harris评分计算方法

harris评分计算方法Harris评分计算方法引言:Harris评分是一种常用于图像处理和计算机视觉领域的算法,用于衡量图像中角点的显著程度。
它可以帮助我们在图像中自动检测和定位角点,从而实现特征提取和图像匹配等应用。
本文将介绍Harris评分的计算方法,并探讨其原理和应用。
一、Harris评分的原理Harris评分方法是基于图像的灰度变化来计算角点的显著程度。
其基本思想是,在角点附近进行灰度变化的某个方向上,无论是水平方向还是竖直方向,都应该出现较大的梯度变化。
因此,我们可以通过计算图像中每个像素点的梯度变化来判断其是否为角点。
二、Harris评分的计算步骤1. 预处理我们需要对图像进行预处理,以便更好地计算Harris评分。
常见的预处理方法包括灰度化、高斯滤波等。
灰度化是将彩色图像转换为灰度图像,而高斯滤波则是平滑图像,以减少噪声的影响。
2. 计算梯度在图像预处理完成后,我们需要计算每个像素点的梯度。
梯度可以表示图像中每个像素点的灰度变化情况,通常用Sobel算子来计算。
Sobel算子可以分别计算出水平和竖直方向上的梯度值,然后通过计算梯度的大小和方向来得到每个像素点的梯度。
3. 计算Harris矩阵Harris矩阵是衡量角点显著程度的关键指标。
它由每个像素点的梯度信息构成,计算方法如下:- 对每个像素点,计算其梯度在水平和竖直方向上的乘积;- 对乘积结果进行高斯加权平均,以降低噪声的影响;- 对加权平均结果进行卷积操作,得到Harris矩阵。
4. 计算Harris响应函数Harris响应函数用于衡量每个像素点的角点程度。
它的计算公式如下:R = det(M) - k * trace(M)^2其中,M是Harris矩阵,det(M)和trace(M)分别表示M的行列式和迹,k是一个常数,用于调节响应函数的灵敏度。
5. 阈值处理在计算Harris响应函数后,我们需要对其进行阈值处理,以筛选出显著的角点。
harris角点检测算法 题目

harris角点检测算法题目Harris角点检测算法是一种用于检测图像中角点的算法。
角点是图像中具有明显方向变化的地方,通常对应于场景中的边缘或拐点。
Harris角点检测算法具有较好的抗噪声性能和稳健性,因此在计算机视觉和图像处理领域得到了广泛应用。
题目:Harris角点检测算法的实现与应用一、问题描述Harris角点检测算法是一种广泛应用于图像处理和计算机视觉领域的角点检测算法。
该算法通过分析图像局部区域的灰度变化来确定角点位置,具有较好的稳定性和准确性。
本题目要求实现Harris角点检测算法,并探讨其在图像处理和计算机视觉领域的应用。
二、实现步骤1. 导入必要的库和模块,包括NumPy、OpenCV等。
2. 读取待处理的图像,并将其转换为灰度图像。
3. 定义Harris角点检测函数,包括计算图像中每个像素点的Harris响应值和确定角点位置等步骤。
4. 对灰度图像中的每个像素点应用Harris角点检测函数,得到每个像素点的Harris响应值。
5. 根据Harris响应值的大小,确定角点位置,并将其标记在图像上。
6. 可选:对检测到的角点进行可视化展示,以便更好地理解角点位置和分布情况。
三、应用示例1. 特征匹配:利用Harris角点检测算法检测两幅图像中的相似区域,通过特征匹配实现图像拼接、目标跟踪等功能。
2. 运动估计:利用Harris角点检测算法提取视频序列中的关键帧,通过对关键帧中角点的运动轨迹分析,估计视频中物体的运动轨迹和方向。
3. 3D重建:结合Harris角点检测算法和立体视觉技术,从多视角图像中提取角点信息,通过立体匹配和三维重建技术,重建出场景的三维结构。
4. 目标识别:利用Harris角点检测算法提取图像中的角点特征,结合分类器对目标进行识别和分类,如人脸识别、手势识别等。
5. 增强现实:通过Harris角点检测算法确定图像中的特征点位置,将虚拟物体与实际场景中的特征点进行配准,实现增强现实的效果。
matlab的角点识别方法 -回复

matlab的角点识别方法-回复Matlab的角点识别方法摘要:角点是图像中特殊的像素点,通常位于边缘的转折处。
角点在计算机视觉和图像处理中起着重要的作用,常被用于目标跟踪、图像配准、三维重建等应用。
在本文中,我们将探讨一些常见的基于Matlab的角点识别方法。
引言:角点识别是图像处理领域中的一个重要问题,对于计算机视觉和图像处理任务具有很大的价值。
角点的识别可以帮助我们定位图像中的关键特征点,以便进行后续的图像分析和处理。
在Matlab中,有许多用于角点识别的函数和工具箱,我们将在本文中介绍其中一些常用的方法。
一、Harris角点检测算法Harris角点检测算法是由Chris Harris和Mike Stephens在1988年提出的,是一种广泛使用的角点检测算法。
该算法通过计算图像的灰度梯度和结构矩阵,来检测图像中的角点。
1. 计算图像的灰度梯度:第一步是计算图像的灰度梯度,可以使用Matlab中的函数'imgradient'来实现。
该函数可以计算图像在x和y方向上的梯度。
2. 计算结构矩阵:灰度梯度计算完成后,接下来需要计算结构矩阵,可以使用Matlab中的函数'imgradientxy'来实现。
该函数可以计算图像在x和y方向上的梯度,并通过计算梯度的乘积来获得结构矩阵。
3. 计算角点响应函数:使用上一步中计算得到的结构矩阵,可以计算每个像素处的角点响应函数。
角点响应函数可用于判断某个像素点是否为角点。
角点响应函数的计算公式如下:R = det(M) - k * trace(M)^2其中M为结构矩阵,det(M)为其行列式,trace(M)为其迹,k为常数。
4. 提取角点:最后一步是根据计算得到的角点响应函数,通过设定一个阈值,提取出图像中的角点。
可以使用Matlab中的函数'imregionalmax'来寻找局部最大值,并将它们作为图像中的角点。
基于角点特征的提取算法比较研究

基于角点特征的提取算法比较研究随着计算机视觉和图像处理领域的快速发展,基于角点特征的提取算法成为了其中一个研究热点。
在处理图像和视频的过程中,角点是一种表现出明显的边界变化的像素,通常被认为是图像中最重要的特征点之一。
本文将对几种常见的基于角点特征的提取算法进行比较研究,分析它们各自的优缺点和适用场景,以期为读者提供一些有价值的参考。
1. Harris角点检测算法Harris角点检测算法是一种基于像素梯度局部变化率的方法,最初由Chris Harris和Mike Stephens于1988年提出。
该算法计算了图像中每个像素点的局部对极性(local polarities),来确定角点的位置。
其基本思想是利用一个2x2的方形窗来计算每个像素点的局部二阶导数矩阵M,再用特征值判别式来度量这个矩阵对应的特征向量的重要性,最后将得分高的像素点作为角点。
该算法以高效简单和检测效果优秀而著称,在许多计算机视觉应用中得到广泛应用,如目标跟踪、图像匹配、三维建模等。
但是,它在特定情况下容易发生误检或漏检,如受噪声干扰或存在角点被覆盖的情况等。
2. Shi-Tomasi角点检测算法Shi-Tomasi角点检测算法是基于Harris算法的一种改进方法,它是由J. Shi和C. Tomasi于1994年提出的。
与Harris算法不同的是,Shi-Tomasi算法使用了一个新的得分函数,即最小的特征值,来度量一个像素点是否为角点。
这是因为,最小的特征值比其他特征值更容易受到噪声的影响,因此更适合用于角点检测。
Shi-Tomasi算法与Harris算法相比,更加鲁棒,能够在更多噪声情况下检测到角点。
但是,它在计算速度方面略逊于Harris算法,并且在某些情况下仍然容易发生误检或漏检。
3. FAST算法各种基于像素梯度的角点检测算法通常较为耗时。
FAST算法是一种基于像素灰度值的角点检测算法,由Edward Rosten和Tom Drummond于2006年提出。
特征点检测算法

特征点检测算法特征点检测算法是计算机视觉领域中一项重要的技术,它能够自动地从图像中提取出具有特殊意义的关键点。
这些特征点可以用于图像匹配、目标跟踪、三维重建等应用中。
本文将介绍三种常见的特征点检测算法:Harris角点检测算法、SIFT算法和SURF算法。
一、Harris角点检测算法Harris角点检测算法是一种经典的特征点检测算法,它通过检测图像中的角点来寻找图像中的显著特征。
该算法的基本思想是通过计算图像中每个像素点的灰度值在水平和垂直方向上的变化程度,然后根据这些变化程度来判断该像素点是否是角点。
具体而言,该算法通过计算每个像素点的结构函数矩阵,然后根据结构函数矩阵的特征值来确定像素点的角度和强度。
二、SIFT算法SIFT(Scale Invariant Feature Transform)算法是一种基于尺度不变性的特征点检测算法,它能够在不同尺度、不同旋转和不同亮度条件下检测出相同的特征点。
该算法的基本思想是通过构建高斯金字塔和差分金字塔来寻找图像中的关键点,然后通过计算关键点的梯度和方向来确定其描述子。
SIFT算法具有较好的尺度不变性和旋转不变性,因此在图像匹配和目标跟踪等应用中得到广泛应用。
三、SURF算法SURF(Speeded Up Robust Features)算法是一种快速且具有鲁棒性的特征点检测算法,它通过采用积分图像和快速哈希表等技术来加速特征点的检测和匹配过程。
该算法的基本思想是通过计算图像中每个像素点的Haar小波响应来确定其特征点。
与SIFT算法相比,SURF算法具有更快的速度和更好的鲁棒性,因此在实时性要求较高的图像处理应用中得到广泛应用。
特征点检测算法在计算机视觉领域中具有重要的应用价值,它能够从图像中提取出具有特殊意义的关键点,为图像匹配、目标跟踪、三维重建等应用提供了重要的基础。
本文介绍了三种常见的特征点检测算法:Harris角点检测算法、SIFT算法和SURF算法。
harris角点检测原理步骤说明[技巧]
![harris角点检测原理步骤说明[技巧]](https://img.taocdn.com/s3/m/a25b68750a1c59eef8c75fbfc77da26925c596dc.png)
一、Harris角点检测基本理论1.1 简略表达:角点:最直观的印象就是在水平、竖直两个方向上变化均较大的点,即Ix、Iy都较大边缘:仅在水平、或者仅在竖直方向有较大的变化量,即Ix和Iy只有其一较大平坦地区:在水平、竖直方向的变化量均较小,即Ix、Iy都较小角点响应R=det(M)-k*(trace(M)^2) (附录资料给出k=0.04~0.06,opencv指出是0.05-0.5,浮动较大)det(M)=λ1*λ2trace(M)=λ1+λ2R取决于M的特征值,对于角点|R|很大,平坦的区域|R|很小,边缘的R为负值。
1.2 详细描述:见附录里的ppt1.3 算法步骤其中,局部极大值可用先膨胀后与原图比较的方法求得,具体见二中源码。
二、opencv代码实现harris类[cpp]view plaincopyprint?1. #ifndef HARRIS_H2. #define HARRIS_H3. #include "opencv2/opencv.hpp"4.5. class harris6. {7. private:8. cv::Mat cornerStrength; //opencv harris函数检测结果,也就是每个像素的角点响应函数值9. cv::Mat cornerTh; //cornerStrength阈值化的结果10. cv::Mat localMax; //局部最大值结果11. int neighbourhood; //邻域窗口大小12. int aperture;//sobel边缘检测窗口大小(sobel获取各像素点x,y方向的灰度导数)13. double k;14. double maxStrength;//角点响应函数最大值15. double threshold;//阈值除去响应小的值16. int nonMaxSize;//这里采用默认的3,就是最大值抑制的邻域窗口大小17. cv::Mat kernel;//最大值抑制的核,这里也就是膨胀用到的核18. public:19. harris():neighbourhood(3),aperture(3),k(0.01),maxStrength(0.0),threshold(0.01),nonMaxSize(3){20.21. };22.23. void setLocalMaxWindowsize(int nonMaxSize){24. this->nonMaxSize = nonMaxSize;25. };26.27. //计算角点响应函数以及非最大值抑制28. void detect(const cv::Mat &image){29. //opencv自带的角点响应函数计算函数30. cv::cornerHarris (image,cornerStrength,neighbourhood,aperture,k);31. double minStrength;32. //计算最大最小响应值33. cv::minMaxLoc (cornerStrength,&minStrength,&maxStrength);34.35. cv::Mat dilated;36. //默认3*3核膨胀,膨胀之后,除了局部最大值点和原来相同,其它非局部最大值点被37. //3*3邻域内的最大值点取代38. cv::dilate (cornerStrength,dilated,cv::Mat());39. //与原图相比,只剩下和原图值相同的点,这些点都是局部最大值点,保存到localMax40. cv::compare(cornerStrength,dilated,localMax,cv::CMP_EQ);41. }42.43. //获取角点图44. cv::Mat getCornerMap(double qualityLevel) {45. cv::Mat cornerMap;46. // 根据角点响应最大值计算阈值47. threshold= qualityLevel*maxStrength;48. cv::threshold(cornerStrength,cornerTh,49. threshold,255,cv::THRESH_BINARY);50. // 转为8-bit图51. cornerTh.convertT o(cornerMap,CV_8U);52. // 和局部最大值图与,剩下角点局部最大值图,即:完成非最大值抑制53. cv::bitwise_and(cornerMap,localMax,cornerMap);54. return cornerMap;55. }56.57. void getCorners(std::vector<cv::Point> &points,58. double qualityLevel) {59. //获取角点图60. cv::Mat cornerMap= getCornerMap(qualityLevel);61. // 获取角点62. getCorners(points, cornerMap);63. }64.65. // 遍历全图,获得角点66. void getCorners(std::vector<cv::Point> &points,67. const cv::Mat& cornerMap) {68.69. for( int y = 0; y < cornerMap.rows; y++ ) {70. const uchar* rowPtr = cornerMap.ptr<uchar>(y);71. for( int x = 0; x < cornerMap.cols; x++ ) {72. // 非零点就是角点73. if (rowPtr[x]) {74. points.push_back(cv::Point(x,y));75. }76. }77. }78. }79.80. //用圈圈标记角点81. void drawOnImage(cv::Mat &image,82. const std::vector<cv::Point> &points,83. cv::Scalar color= cv::Scalar(255,255,255),84. int radius=3, int thickness=2) {85. std::vector<cv::Point>::const_iterator it=points.begin();86. while (it!=points.end()) {87. // 角点处画圈88. cv::circle(image,*it,radius,color,thickness);89. ++it;90. }91. }92.93. };94.95. #endif // HARRIS_H相关测试代码:[cpp]view plaincopyprint?1. cv::Mat image, image1 = cv::imread ("test.jpg");2. //灰度变换3. cv::cvtColor (image1,image,CV_BGR2GRAY);4.5.6. // 经典的harris角点方法7. harris Harris;8. // 计算角点9. Harris.detect(image);10. //获得角点11. std::vector<cv::Point> pts;12. Harris.getCorners(pts,0.01);13. // 标记角点14. Harris.drawOnImage(image,pts);15.16. cv::namedWindow ("harris");17. cv::imshow ("harris",image);18. cv::waitKey (0);19. return 0;相关测试结果:三、改进的Harris角点检测从经典的Harris角点检测方法不难看出,该算法的稳定性和k有关,而k是个经验值,不好把握,浮动也有可能较大。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Harris角点检测算法
软工1303陈伟峰
1.算法介绍
1988年Harris在Moravec算法的基础上提出了Harris算法。
Harris算法是对moravec算法的改进和提高,harris算法使用高斯函数替代moravec算法的二值窗口函数,另外在moravec中只考虑每个45度的方向的灰度变化,二harris利用泰勒展开式,去近似计算每个方向的灰度变化情况。
2.Harris算法
(1)算法思想
Harris角点检测算法思想就是拿一个小窗在图像中移动,通过考察这个小窗口内图像灰度的平均变换值来确定角点。
相应的会有三种情况发生。
(1)如果窗口内区域图像的灰度值恒定,那么所有不同方向的偏移几乎不发生变化,这个区域属于平坦区域;
(2)如果窗口跨越一条边,那么沿着这条边的偏移几乎不发生变化,但是与边垂直的偏移会发生很大的变化,这个区域属于边缘区域;
(3)如果窗口包含一个孤立的点或者角点,那么所有不同方向的偏移会发生很大的变化。
图1 Harris角点检测基本思想
(2)算法推导
假设窗口W发生位置偏移(u,v);比较偏移前后窗口中每一个像素点的灰度变化值;使用灰度误差平方和来构造一个误差函数E(u,v),其中的窗口函数是用来滤波的。
平坦区域:
任意方向移动,无灰度变化边缘:
沿着边缘方向移
动,无灰度变化
角点:
沿任意方向移动,
明显灰度变化
其中w(x,y)为窗口函数,I(x+u,y+v)为平移后的灰度值,I(x,y)为平移前的灰度值。
由Taylor展开式可以得到:
我们定义:
H称为自相关矩阵, λmax和λmin是自相关矩阵的特征值。
如图2所示,其中E(u,v)是一个二次型函数,二次型函数的本质就是一个椭圆,椭圆的扁率和尺寸是由H的特征值λmax和λmin决定的,椭圆的方向由H的特征向量决定。
图2 E(u,v)的椭圆形式
图3 椭圆与点线面的关系
根据图3我们可以看到,当λmax和λmin两者都比较大,并且大小相当时对应点为角点,两者都非常小时为平坦区域;一大一小时为边界区域。
图4 两个特征值的大小对图像点进行分类
因为λmax和λmin在编程时比较难求解,因此1988年,哈里斯在其论文《A combined corner and edge detector》里给出了更有效的角点响应函数:
R为正值时,检测到的是角点;R为负时检测到的是边;R很小时检测到的是平坦区域,由此也就有了更便于计算的数学公式。
3.算法代码实现
clear;
filenema = '图1.jpg';
img = imread(filenema); % 读取图像
Info = imfinfo(filenema); %获取图像相关信息
%%灰度转换
if (Info.BitDepth > 8)
img = rgb2gray(img);
end
%M=[Ix2,Ixy;Ixy,Iy2]
ori_im = double(img) / 255; %unit8转化为64为双精度double64
fx = [-2 -1 0 1 2]; % x方向梯度算子
%filter2表示二维滤波器
Ix = filter2(fx, ori_im); % x方向滤波
fy = [-2; -1; 0; 1; 2]; % y方向梯度算子
Iy = filter2(fy, ori_im); % y方向滤波
Ix2 = Ix .^ 2;
Iy2 = Iy .^ 2;
Ixy = Ix .* Iy;
%%创建一个高斯平滑滤波器
%fspecial创建一个滤波器,参数说明,‘gaussian’表示滤波器类型,Gaussian lowpass %filter,[7,7]表示窗口大小,2表示标准误差
h= fspecial('gaussian', [7,7], 2); % 产生7*7的高斯窗函数,sigma=2
Ix2 = filter2(h,Ix2);
Iy2 = filter2(h,Iy2);
Ixy = filter2(h,Ixy);
[height,width] = size(ori_im);
result = zeros(height, width); %%创建一个矩阵记录角点位置,角点处值为1
R = zeros(height, width);
Rmax = 0; % %设置最大的R值,初始为0
k = 0.04; %k为常系数,经验取值范围为0.04~0.06
%%利用M计算对应于每个像素的角点响应函数R=det(M)-k*(trace(M))^2
for i = 1 : height
for j = 1 : width
M = [Ix2(i, j) Ixy(i, j); Ixy(i, j) Iy2(i, j)]; % 自相关矩阵
% 计算R值,det()求一个方阵的行列式;trace()求方阵的迹,即该方阵对角线上元素之和
R(i,j) = det(M) - k * (trace(M)) ^ 2;
if R(i,j) > Rmax
Rmax = R(i, j);
end;
end;
end;
T = 0.1 * Rmax;%固定阈值,当R(i, j) > T时,则被判定为候选角点
%%下面是进行角点检测记录和局部非极大的检验
winr = floor(7 / 2);
for i = (winr + 1) : (height - winr)
for j = (winr + 1) : (width - winr)
subr = R(((i-winr) : (i + winr)),((j-winr) : (j+ winr)));
submax = max(max(subr));
if((R(i,j) > T) & (R(i,j) == submax))
result(i,j) = 1; %result矩阵中为1表示是角点
end
end
end
[posc, posr] = find(result == 1);%记录角点的位置
figure,imshow(ori_im);
hold on;
plot(posr, posc, 'r+');
实验结果:
第一组(尺寸694*502)
处理前处理后
角点个数:372
第二组(尺寸:556*402)
处理前处理后
角点个数:285
4.总结
Harris角点检测算法是对Moravec算法的改进和提高,在两次实验中我也深有体会,相对来说,Moravec算法比较简单,容易编程,但是结果相对来说不是很准确,而Harris算法,利用高斯窗函数和泰勒展开式,增加了角点检测算法的准确性,相对编程的难度也有所增加。
在没有图像尺度变化的条件下, Harris 角点检测子对图像的旋转变化、视角变化以及图像噪声具有比同类检测子更好的稳定性.。
然而Harris 角点检测子对图像的尺度变化非常敏感,小的尺度变化就会造成Harris 角点的复现率快速下降。
这个特点在上面的实验可以看出来。
图像的尺度伸缩将使得由Harris 检测子提取的特征不具有可重复性。