zoukankan      html  css  js  c++  java
  • Harris角点检测及数据分析-python实现

    一实验原理

     1.1角点

     1.2角点检测算法的好处

     1.3Harris算法

        1.3.1Harris算法

        1.3.2数学表达

    二、代码实现及结果截图及实验分析

    三、实验总结

    1.1角点

    局部窗口沿各方向移动,均产生明显变化的点,图像局部曲率突变的点,是在某些属性上强度最大或者最小的孤立点、线段的终点。 对于图像而言,如图所示圆圈内的部分,即为图像的角点,其是物体轮廓线的连接点

                                                                                                                        图一

      第一个是直角角点,第二个是y角点,第三个是T角点,第四个是箭头角点,第五个是交叉角点

                                                                                                     图二

    这两张每个图像都有多个角点

    CSS角点检测

                                                                                                           图三

     1.2角点检测算法的好处

    检测出图像中“真实的”角点
    准确的定位性能
    很高的稳定性
    具有对噪声的鲁棒性
    具有较高的计算效率
     
    1.3Harris算法

    1.3.1Harris角点检测基本思想

                            图四

    从图像局部的小窗口观察图像特征,角点定义<-窗口向任意方向的移动都导致图像灰度的明显变化

                              

                

       平坦区域:任意方向移动  ,无灰度变化                  边缘:沿着边缘方向移动,无灰度变化                    角点:沿任意方向移动,明显灰度变化

     1.3.2数学表达

    假设图像像素点(x,y)的灰度为 I(x,y),以像素点为中心的窗口沿 x 和 y 方向分别移动 u 和 v 的灰度强度变化的表达式为:

    其中 E(u,v)是灰度变化,w(x,y) 是窗口函数,一般是高斯函数,所以可以把w(x,y)看做是高斯滤波器。I(x,y)是图像灰度, I(x+u,y+v)是平移后的图像灰度。
    收到泰勒公式的启发,在这里我们可以将 I(x+u,y+v)函数在(x,y)处泰勒展开,为了提高抗干扰的能力并且简化运算,我们取到了一阶导数部分,后面的无穷小量可以忽略,整理得到表达式如下:

     

    将[ Ixu+Iyv ]展开后整理可以用矩阵表达为:


    最后我们可以近似得到E(x,y)的表达式,将其化为二次型后得到:

    其中M是一个2X2的矩阵,称为像素点的自相关矩阵,可以由图像的导数求得。M=窗口函数*偏导矩阵,表达式为:


    因为u,v是局部微小的移动变量,所以我们对M进行讨论,M是一个2X2的矩阵,M的表达式中与点的位置(x,y)具体强相关性,记M得特征值为λ1,λ2,关于特征值的意义太过抽象,这里就不展开,但是我们可以简单理解为该点的灰度值变化速度,那么a1和a2可以分别看做是x方向和y方向的灰度变化速率,就可以用a1,a2两者的大小关系来进行分类。
    当两个特征值λ1和λ2都偏小的时候,表示窗口沿任意方向移动都会使灰度变化很细微,该点处于图像的平坦区域。
    当λ1>>λ2或者λ1<<λ2时,说明该点向水平(垂直)方向移动时变化会很明显,而向垂直(水平)方向则变化不明显,该点处于图像的边缘区。
    当两个特征值λ1和λ2都很大的时候,表示窗口沿任意方向移动都会使灰度变化很明显,该点位置就是图像角点的位置。

    然而在实际中,经常使用的是角点响应函数CRF这一概念,以此更加准确的计算所需角点,方法如下:


    det M是矩阵M的行列式,Trace(M)为矩阵M的迹。k为修正值,是一个常数,经验取值为0.04-0.06。算出响应值之后,根据R与阈值T的比较来判断是否为角点。

    当|R|很小时,R<T , 认为该点处于图像的平坦区域。
    当R<0时,R<T , 认为该点处于图像的边缘区。
    当R>0时,R>T, 认为该点位置就是图像角点。

     

    二、代码实现

    代码:

     1 # -*- coding: utf-8 -*-
     2 from pylab import *
     3 from PIL import Image
     4 from PCV.localdescriptors import harris
     5 """
     6 Example of detecting Harris corner points (Figure 2-1 in the book).
     7 """
     8 # 读入图像
     9 im = array(Image.open(r'D:\new\photos\11.jpg').convert('L'))
    10 # 检测harris角点
    11 harrisim = harris.compute_harris_response(im)
    12 # Harris响应函数
    13 harrisim1 = 255 - harrisim
    14 figure()
    15 gray()
    16 #画出Harris响应图
    17 subplot(141)
    18 imshow(harrisim1)
    19 print harrisim1.shape
    20 axis('off')
    21 axis('equal')
    22 threshold = [0.01, 0.05, 0.1]
    23 for i, thres in enumerate(threshold):
    24     filtered_coords = harris.get_harris_points(harrisim, 6, thres)
    25     subplot(1, 4, i+2)
    26     imshow(im)
    27     print im.shape
    28     plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
    29     axis('off')
    30 show()

    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.2.5 旋转图:

     

    结果截图:

     实验结果分析:五个角度拍摄的有纹理的图像,运行出来,有光图的角点很稀疏,旋转图跟正面远图图检测出来的角点差不多,正面图的角点比正面远图的少一点点,侧面图也很稠密,不过比旋转图和正面远图的少。

    2.3 角度丰富:

    2.3.1 正面远图:

    结果截图:

    2.3.2 正面图:

     

    结果截图:

    2.3.3 旋转图

    结果截图:

     

    2.3.4 有光图

    结果截图:

    2.3.5 侧面图

    结果截图:

     实验结果分析:侧面图的角点比较稠密,远景图的相比正面图和旋转图较多一点,有光图的相比就会比较少。

    四、实验结论

    4.1这次实验,依然是软件问题,软件上次调整可以运行,但是不知道为什么这次蹦了,然后就在调整软件的时间浪费了很多时间,主要是感谢学长学姐,一直在帮助我调整我的软件。在调整软件的过程中遇到的问题是

     刚开始是以为可以直接导入,然后语句运行报错,然后我在此网址https://blog.csdn.net/miss_codfish/article/details/79462753找到了解决方法

     然后我就解决了这个问题。一定要注意我输错的语句,不是pip install pylab而是import pylab。

    4.2、想要安装opencv-python时   出现报错UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc1 in position 7: ordinal not in range(128)

     是因为win1064系统,安装的是python2.7版本的,所以pip安装第三方包的时候,提示了错误。

    解决方法:先给pip升级,因为版本过低也会影响

    1 python -m pip install –upgrade pip

    之后就是换源

    在windows资源管理器下键入%APPDATA%(C:UsersAdministratorAppDataRoaming)中建立pip文件,然后建立pip.ini文件,用记事本打开,保存时选择ini就可,打开后在文件里输入

    1 [global] 
    2 timeout = 6000 
    3 index-url = http://pypi.douban.com/simple 
    4 trusted-host = pypi.douban.com 

    此方法是根据此网址https://blog.csdn.net/gdsfga/article/details/83040486?tdsourcetag=s_pctim_aiomsg查找的。

    4.3实验总结:

    这次实验,三组不同的图,看出了原图的角点数量跟旋转图数量的角点没有什么区别,不会因为角度而改变,侧面的角点数量原图和远向图的角点数量还会有一定影响的,图像被放大或者缩小角点数量都会发生变化。对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响角点检测的数量。特征点的提取过程可以减少噪声的影响,对灰度变化、图像形变以及遮挡等都有较好的适应能力。位置也会影响角点数量,特征点的匹配度量值相对位置变化比较敏感,可以提高匹配的精度。最后阀值对角点数量的影响也很大,阀值越大,角点数量就会越少。

  • 相关阅读:
    日期转换DateTime
    linux 常用命令
    springcloud集成 xxl-job
    maven-阿里云镜像
    mysql 8.0+忘记root密码-linux
    java注解与自定义注解
    mysql联合索引的生效规则
    Maven常用命令及其作用、常见问题、常用命令使用场景举例
    反射的理解
    VirtualBox创建centos
  • 原文地址:https://www.cnblogs.com/wyf-1999-1--6/p/12364581.html
Copyright © 2011-2022 走看看