学习之角点检测Harris

本文介绍了角点检测的重要性和类别,重点讨论了基于图像灰度的Harris算子。Harris算子因其平移、旋转不变性和对光照变化的不敏感性而受到青睐。该算法涉及计算梯度、应用高斯加权、生成响应矩阵并进行非最大值抑制,以准确、稳定地检测图像中的角点。
摘要由CSDN通过智能技术生成

      角点是图像亮度发生剧烈变化或者图像边缘曲线上曲率极大值的点。角点检测方法主要分两类:基于图像边缘的方法和基于图像灰度的方法。前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割和边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很有可能导致操作的失败。基于图像灰度的方法通过计算点的曲率及梯度来检测角点,避免了第一类方法存在的缺点,是目前研究的重点。评价角点检测算法性能优劣主要从以下5个方面:

     (1)准确性:即使很细小的角点,也能检测到;

     (2)定位性:检测到的角点应尽可能地接近它们在图像中的真实位置;

     (3)稳定性:对相同场景拍摄的多幅图片,每一个角点的位置都不应该移动;

     (4)实时性:角点检测算法的计算量越小,运行速度越快越好;

     (5)鲁棒性:对噪声具有抗干扰性。

      基于图像边缘:Rosenfeld和Freeman等人的方法,后期有CCS等方法。基于图像灰度:Moravec算子、Forstener算子、Harris算子、SUSAN算子等。本文先介绍Harris算子,Harris算子具有平移和旋转不变性,对光照条件的变化不敏感:

      1、先调用MATLAB函数检测图像Harris角点特征,其中I是输入的图像矩阵,C为角点量度矩阵,用来检测图像I中的角点信息,并与I同尺寸,C的值越大表示图像I中的像素越有可能是一个角点。

clear all;close all;clc;
I=imread('5.jpg');
I=rgb2gray(I);
subplot(1,3,1);imshow(I);title('yuan');

%生成角点度量矩阵
C=cornermetric(I,'harris');
C_adjusted=imadjust(C);%imadjust在数字图像处理中用于进行图像的灰度变换
subplot(1,3,2);imshow(C_adjusted);title('角点矩阵');

%寻找并显示Harris角点
corner_peaks=imregionalmax(C);
corner_idx=find(corner_peaks==true);
[r b g]=deal(I);
r(corner_idx)=255;
g(corner_idx)=255;
b(corner_idx)=0;
RGB=cat(3,r,g,b);
subplot(1,3,3);imshow(RGB);title('检测出的Harris角点');


2、(1)计算图像I(x,y)在X和Y方向的梯度Ix、Iy.

       (2)计算图像两个方向梯度的乘积

       (3)使用高斯函数对Ix^2、Iy.^2和Ixy进行高斯加权,生成矩阵M的元素A,B和C

       (4)计算每个像元的Harris相应值R,并对于小于某一阈值t的R置为零

       (5)在3*3,或5*5的领域内进行非最大值抑

import cv2 as cv import numpy as np """"" cv2.cornerHarris() 可以用来进行角点检测。参数如下: • img - 数据类型为 float32 的输入图像。 • blockSize - 角点检测中要考虑的领域大小。 • ksize - Sobel 求导中使用的窗口大小 • k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06] """"" src_inital = cv.imread("E:/opencv/picture/building.jpg") src = cv.cvtColor(src_inital,cv.COLOR_BGR2GRAY) src = np.float32(src) dst = cv.cornerHarris(src,3,3,0.04) #R值是由det(M)-K(trace(M))*(trace(M)),当该点是角点时,该点所对应的R值就会很大,通过设置对R的阈值,就可以筛选得到角点 #这里的dst就是R值构成的灰度图像,灰度图像坐标会与原图像对应,R值就是角点分数,当R值很大的时候 就可以认为这个点是一个角点 print(dst.shape) src_inital[dst>0.08*dst.max()]=[0,0,255] """"" src_inital[dst>0.08*dst.max()]=[0,0,255] 这句话来分析一下 dst>0.08*dst.max()这么多返回是满足条件的dst索引值,根据索引值来设置这个点的颜色 这里是设定一个阈值 当大于这个阈值分数的都可以判定为角点 dst其实就是一个个角度分数R组成的,当λ1和λ2都很大,R 也很大,(λ1和λ2中的最小值都大于阈值)说明这个区域是角点。 那么这里为什么要大于0.08×dst.max()呢 注意了这里R是一个很大的值,我们选取里面最大的R,然后只要dst里面的值大于百分之八的R的最大值  那么此时这个dst的R值也是很大的 可以判定他为角点,也不一定要0.08可以根据图像自己选取不过如果太小的话 可能会多圈出几个不同的角点 """"" cv.imshow("inital_window",src_inital) cv.waitKey(0) cv.destroyAllWindows() 目标: 理解Harris角点检测的概念 使用函数cv2.cornerHarris(),cv2.cornerSubPix() 原理: Harris 角点检测的方法大概原理就是建立一个窗口区域,然后以当前窗口为中心向各个方向进行偏移。 如上图所示,第一个窗口向各个方向偏移的时候,像素值没有变化,因为窗口偏移的时候没有遇到任何边缘信息。 第二个图,窗口当中有一个直线(即block是在边缘上),如果当前窗口进行上下的移动,也没有像素值发生变化(在其他方向上灰度值也会变化)。 第三个图,窗口覆盖了一个“拐角”,如果窗口进行偏移,任何方向上都会有像素变化。 所以,第三张图片判断为检测到角点。 判断特征点是否为角点的依据:R只与M值有关,R为大数值正数时特征点为角点,R为大数值负数时为边缘,R为小数值时为平坦区 寻找R位于一定阈值之上的局部最大值,去除伪角点。 方向导数IxIx和IyIy可以使用cv2.Sobel()函数得到 Harris角点检测的结果是灰度图,图中的值为角点检测的打分值。需要选取合适的阈值对结果进行二值化来检测角点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值