1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 计算机视觉图像基本处理--Harris角点检测

计算机视觉图像基本处理--Harris角点检测

时间:2024-06-07 17:22:34

相关推荐

计算机视觉图像基本处理--Harris角点检测

文章目录

1.Harris角点检测基本思想1.1基本思想1.2 数学表达 2.简单代码实现2.1 对于纹理平坦的图2.1.1 正面图像运行结果如下结果分析 2.1.2 侧面图像运行结果如下结果分析 2.1.3 旋转角度图像运行结果如下结果分析 2.1.4 远近不同运行结果如下结果分析 2.1.5 亮度不同运行结果如下结果分析 结论 2.2.边缘较多的图像2.2.1 正面图像运行结果如下结果分析 2.2.2 侧面图像运行结果如下结果分析 2.2.3 旋转角度不同运行结果如下结果分析 2.2.4 远近不同运行结果如下结果分析 结论 2.3 角点丰富的图像2.3.1 正面图像运行结果如图结果分析 2.3.2 侧面图像运行结果如图结果分析 2.3.3 远近不同运行结果如图结果分析 2.3.4 旋转角度不同运行结果如图结果分析 结论 3.实验结果分析

1.Harris角点检测基本思想

1.1基本思想

从图像局部的小窗口观察图像信息窗口向任意方向移动都导致图像灰度的明显变化,窗口所在位置即为角点,如下图所示

Harris角点检测在检测三种不同区域时:

1.2 数学表达

设以目标像素为中心的矩形窗口W在任意方向上的以为(u,v)的灰度变换为E(u,v),定义如下: E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x , y ) − I ( x + u , y + u ) ] 2 … … … … ( 1 ) E(u,v)=\sum_{x,y} w(x,y)[I(x,y)-I(x+u,y+u)]^2…………(1) E(u,v)=x,y∑​w(x,y)[I(x,y)−I(x+u,y+u)]2…………(1)

其中 w ( x , y ) = e x p ( − ( x 2 + y 2 ) / σ 2 w(x,y)=exp(-(x^2+y^2)/σ^2 w(x,y)=exp(−(x2+y2)/σ2为高斯核函数。

求解此表达式可用泰勒级数展开。

由泰勒级数可知

其中 A = I x ∗ w , B = I y ∗ w , C = ( I y I y ) ∗ w A=I_x*w,B=I_y*w,C=(IyI_y)*w A=Ix​∗w,B=Iy​∗w,C=(IyIy​)∗w。矩阵M称为自相关矩阵,易知该矩阵为Hessian矩阵,也就是说其特征值( λ 1 , λ 2 λ_1,λ_2 λ1​,λ2​,)反映了自相关函数 E ( u , v ) E(u,v) E(u,v)的曲率,当两个特征值都较小时,表示平坦区域,一个较大另一个较小为边缘区域,两个都较大为角点。

为了避免求解特征值,通常使用如下角点响应函数:

其中| -|表示矩阵的行列式,tr表示矩阵的迹,k一般取值0.04-0.06,此时可利用R的取值来确实目标像素点的特征,R绝对值较小时为平坦区域,负表示边界,正表示角点。

归纳入下:

2.简单代码实现

Harris_1.py

# -*- coding: utf-8 -*-from pylab import *from PIL import Imagefrom PCV.localdescriptors import harris"""Example of detecting Harris corner points (Figure 2-1 in the book)."""# 读入图像im = array(Image.open('data/flat/flat_zheng.jpg').convert('L'))# 检测harris角点harrisim = pute_harris_response(im)# Harris响应函数harrisim1 = 255 - harrisimfigure()gray()#画出Harris响应图subplot(2,2,1)imshow(harrisim1)print(harrisim1.shape)axis('off')axis('equal')threshold = [0.01, 0.05, 0.1]for i, thres in enumerate(threshold):filtered_coords = harris.get_harris_points(harrisim, 6, thres)subplot(2, 2, i+2)imshow(im)print(im.shape)plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')axis('off')for item in filtered_coords:print(item)#原书采用的PCV中PCV harris模块#harris.plot_harris_points(im, filtered_coords)# plot only 200 strongest# harris.plot_harris_points(im, filtered_coords[:200])show()

2.1 对于纹理平坦的图

2.1.1 正面图像

运行结果如下

左边的大图为图像的原图,右边figure中的4副小图为检测结果。

结果分析

检测结果中图1应该为轮廓图,但是由于图像中的物品纹理平坦,所以轮廓很不清晰。图2中聚集了一大堆点的地方是光线,往下几个稀疏的点是图中原本的几个黑点。从图2到图4,可以看出,图中的点逐渐变少,直到最后,只剩下原图中的几个黑点又被标记。

2.1.2 侧面图像

运行结果如下

结果分析

侧面图像的运行结果和正面图像相差不大。

2.1.3 旋转角度图像

运行结果如下

结果分析

相比正面和侧面图像,也只是点的位置略有不同。

2.1.4 远近不同

本次运行用的图片相比于正面使用的图像,摄像头更加近。

运行结果如下

结果分析

图2出现了大量点狙击的情况,是因为由于摄像头较近,光源在我身后,导致图中的木板反射了较大片亮光,导致右上区域的灰度变换较大,所以相比上面才有更多的点聚集,图3和图4与其他相差不大。

2.1.5 亮度不同

本次运行用的图片相比于正面图像,更加暗。

运行结果如下

结果分析

可以看到,由于亮度变暗,图中的物品没有反光,所以图2并没有出现大量点聚集的情况。

结论

对于纹理平坦的图片,光线对Harris的检测结果影响较大,其他的条件影响较小。

2.2.边缘较多的图像

2.2.1 正面图像

运行结果如下

结果分析

图片中的房子有很多的方形窗户,随着阈值的不断增大,检测的结果越来越清晰。

2.2.2 侧面图像

运行结果如下

结果分析

与正面结果对比,随着阈值增大,检测出来的点越来越,点也越来越靠近边缘。

2.2.3 旋转角度不同

运行结果如下

结果分析

即使是角度不同,也仍然能检测出图像中的边缘(房子的窗户等)。

2.2.4 远近不同

运行结果如下

本次运行相对于侧面图像,建筑更小。亮度也较暗。

结果分析

与上面结果无较大差别。

结论

对于边缘较多的图像,如果阈值从0.01变为0.05(图2到图3的变化),图中的点会显著减少,但是当阈值从0.05变化为0.1时,图像检测的变化并不明显。而且亮度较暗的图像检测出的角点较少。

2.3 角点丰富的图像

2.3.1 正面图像

运行结果如图

结果分析

随着阈值增大,检测的角点变少,图4中地板中的角点甚至没有检测出来

2.3.2 侧面图像

运行结果如图

结果分析

正面和侧面对角点检测影响不大。

2.3.3 远近不同

运行结果如图

结果分析

角度变化对检测结果影响不大。只是图1相比于其他图片中的图1对地板的角点检测效果更好。

2.3.4 旋转角度不同

运行结果如图

结果分析

检测结果与上面的无较大差别,由于角度变换,树旁边多了更多的地板,图3对地板的角点检测效果最好。

结论

对于角点丰富的图片,旋转角度对角点的检测来说差别不大。

3.实验结果分析

不管是平坦的图片,角点丰富的还是边缘丰富的,检测时如果光线较好,角点越多,在平坦纹理的图中标新更加明显。

随着阈值增大,图片的角点检测结果,检测出的角点越少,本次实验的三个阈值,0.01,0.05,0.1,其中0.05的检测效果最好。

光线不变的情况下,即使图片再怎么旋转,再怎么换角度拍,得到的角点也不会相差太大。

关于远近问题,近可能会增加图片中的详细信息,进而检测出更多角点。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。