Harris角点检测学习

1.角点的定义与性质

角点是一种局部特征,具有旋转不变性和不随光照条件变化而变化的特点,一般将图像中曲率足够高或者曲率变化明显的点作为角点。检测得到的角点特征通常用于图像匹配、目标跟踪、运动估计等方面。

2.Harris角点

1)定性描述

该算法中,将图像分为平坦区域、边缘、角点三部分。平坦区域中像素灰度在各个方向上变换都很小,边缘上的像素灰度在某个方向变化很大,但是在另一些方向变化很小;位于角点上的像素灰度则在各个方向上的变化都比较大。这是通过人眼观察得到的直观感受。

2)量化的数学表达

不同区域像素的变化与相似性是相反的关系:变化越大,相似性越小,反之亦然。所以我们可以使用相似性度量其变化程度。图像I(x,y)在中心(x,y)处区域W(x,y)与相对中心(x,y)移动了△x/△y之后的区域相关性可以通过自相关函数给出

w(u,v)是加权函数,可选取常数或者高斯加权函数(一般选取后者)

看到delta标志就会想到泰勒展开式简化,简化流程如下:

所以之前的相似性度量可以近似表达为一个二次项函数

其本质是一个椭圆函数,椭圆的主方向就是图像变化率最大的主要方向。而椭圆的大小又是由M(x,y)的特征值决定的。

套用这套理论到平坦区域、边缘、角点上,则表示为:

(1)边缘;椭圆狭长,一个特征值大、另一个特征值小

(2)平坦区域;两个特征值都很小

(3)角点;两个特征值都很大

所以求出矩阵M(x,y)的两个特征值可以用于检测角点,但是计算量太大。Harris角点检测中避免直接求取特征值,而是利用M(x,y)的性质来计算两个特征值的相对大小

只有两个特征值都比较大的情况下R取值才比较大

3.算法流程

根据前面的描述,只要计算出图像中各个像素对应的R,并根据一个设定的阈值二值化处理即可得到角点。为了滤除局部区域的非极大值,可以使用非极大值抑制法做进一步的处理。算法整理流程如下:

4.opencv实现

个人使用的开发环境是是opencv_2.4.13+vs2012,现将代码贴出

 1 #include <iostream>
 2 #include <core/core.hpp>
 3 #include <highgui/highgui.hpp>
 4 #include <features2d/features2d.hpp>
 5 #include <imgproc/imgproc.hpp>
 6
 7 using namespace std;
 8 using namespace cv;
 9
10 int main(int argc, char* argv[])
11 {
12     /* 1.以bmp格式读取图片,注意该图片此时应该放置于.sln所在目录 */
13     Mat image = imread("../church01.jpg", 0);
14     if(!image.data)
15         return 0;
16
17     namedWindow("originalImage");
18     imshow("originalImage", image);
19
20     /* 2.计算图像沿x/y方向一阶导数 */
21     Mat xKernel = (Mat_<double>(1,3) << -1, 0, 1);
22     Mat yKernel = xKernel.t();
23
24     Mat Ix, Iy;
25     filter2D(image, Ix, CV_64F, xKernel);
26     filter2D(image, Iy, CV_64F, yKernel);
27
28     /* 3.计算矩阵M中的各项 */
29     Mat Ix2, Iy2, Ixy;
30     Ix2 = Ix.mul(Ix);
31     Iy2 = Iy.mul(Iy);
32     Ixy = Ix.mul(Iy);
33
34     /* 注意这里使用的是一阶高斯滤波而非二阶,尚未
35      * 理解其原因
36      */
37     Mat gaussKernel = getGaussianKernel(7,1);
38     filter2D(Ix2, Ix2, CV_64F, gaussKernel);
39     filter2D(Iy2, Iy2, CV_64F, gaussKernel);
40     filter2D(Ixy, Ixy, CV_64F, gaussKernel);
41
42     /* 4.根据公式计算R矩阵 */
43     Mat cornerStrength(image.size(), CV_64F);
44     float alpha = 0.1f;
45     int rows, cols;
46     rows = image.rows;
47     cols = image.cols;
48     for(int i = 0; i < rows; i++)
49     {
50         for(int j = 0; j < cols; j++)
51         {
52             double det_m = Ix2.at<double>(i,j) * Iy2.at<double>(i,j) - Ixy.at<double>(i,j) * Ixy.at<double>(i,j);
53             double trace_m = Ix2.at<double>(i,j) + Iy2.at<double>(i,j);
54             cornerStrength.at<double>(i,j) = det_m - alpha*trace_m*trace_m;
55         }
56     }
57
58     /* 5.阈值化并进行非极大值抑制 */
59     double maxStrength, minStrength;
60     minMaxLoc(cornerStrength, &minStrength, &maxStrength);
61     Mat dilated;
62     Mat localMax;
63     dilate(cornerStrength, dilated, Mat());
64     compare(cornerStrength, dilated, localMax, CMP_EQ);
65
66     double threshold = 0.01 * maxStrength;
67     Mat cornerMap;
68     cornerMap = cornerStrength > threshold;
69     bitwise_and(cornerMap, localMax, cornerMap);
70     namedWindow("cornerMap");
71     imshow("cornerMap", cornerMap);
72
73     /* 6.在原图上绘制角点 */
74     image = imread("../church01.jpg", 0);
75     for(int x = 0;x < cornerMap.cols; x++)
76     {
77         for(int y = 0; y < cornerMap.rows; y++)
78         {
79             if(cornerMap.at<uchar>(y,x))
80             {
81                 circle(image, Point(x,y), 3, Scalar(255), 1);
82
83             }
84         }
85     }
86
87     namedWindow("Harris Corner");
88     imshow("Harris Corner", image);
89     waitKey();
90     return 0;
91 }

代码执行效果如下,originalImage是读入的原图,cornerMap是计算得到的角点(白色显示),Harris Corner是在原图上绘制角点的效果。

5.参考资料

[1]《图像局部不变性特征与描述》

[2]http://www.cnblogs.com/polly333/p/5416172.htmlHarris角点算法

时间: 2024-08-01 23:03:55

Harris角点检测学习的相关文章

Opencv学习笔记--Harris角点检测

image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7391511 文章目录: 一.Harris角点检测基本理论 二.opencv代码实现 三.改进的Harris角点检测 四.FAST角点检测 五.参考文献 六.附录(资料和源码) 一.Harris角点检测基本理论(要讲清楚东西太多,附录提供文档详细说明) 1.1 简略表达: 角点:最直观的印象就是在水平

Harris角点检测中的数学推导

简介 本文主要是对Harris角点检测的数学公式进行推导,更加深入的理解理论知识. 预备知识 椭圆的矩阵方程表示 在高中课本中,我们学习到标准椭圆及其方程(如下图所示): 其实,矩阵在运算中使用非常广泛,现将上述标准方程写成矩阵形式(方便接下来的处理): 椭圆半轴与系数矩阵的关系 一个nxn的矩阵,可以求解其特征值,我们对上述系数矩阵(含a.b)进行求解,则可得到特征值与椭圆半轴(a.b)的关系,过程如下: Harris角点检测原理 Harris算法是利用的窗口内图像灰度的自相关性进行的,设定一

第十一节、Harris角点检测原理

OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比如将许多图像放在一块,然后形成一个360度全景图像. 这里我们将学习使用OpenCV来检测图像特征,并利用这些特征进行图像匹配和搜索.我们会选取一些图像,并通过单应性,检测这些图像是否在另一张图像中. 一 特征检测算法 有许多用于特征检测和提取的算法,我们将会对其中大部分进行介绍.OpenCV最常使

OpenCV Feature Detection and Description -- Harris Corner Detection Harris角点检测

原文链接 https://docs.opencv.org/4.1.2/dc/d0d/tutorial_py_features_harris.html 阅读文档学习opencv 如有问题,大家指出-- Goal In this chapter, We will understand the concepts behind Harris Corner Detection. We will see the functions: cv.cornerHarris(), cv.cornerSubPix()

Harris角点检测原理及实现

一.原理 二.实现 close all; clear all; I=imread('test.tif'); [posX,posY]=harris(I); figure;imshow(I); hold on; plot(posX, posY, 'g*'); function [posX,posY]=harris(I) %Harris角点检测 %I:输入图像 %posX:角点X坐标 %posY:角点Y坐标 I=double(I); [m,n]=size(I); hx=[-1,0,1;-1,0,1;-

Emgucv使用Harris角点检测和Fast角点检测

角点是两个边缘的连接点,代表了两个边缘变化的方向上的点,在这点上图像梯度有很高的变化.是图像中的重要特征点.在opencv中还有改进版的Harris角点检测:Shi-Tomasi 角点检测算法,但在Emgucv里并没有封装,所以目前无法直接使用. 一.Harris角点检测 Harris角点检测通过判断点在水平和竖直方向上的变化程度来判断是否为角点,使用CornerHarris函数,处理后再用阈值来判断是否为角点. public partial class Form1 : Form { publi

openCV2马拉松第19圈——Harris角点检测(自己实现)

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的connerHarris实现角点检测 自己实现Harris算法 下面是自己实现的一个效果图 因为阀值设置比较高,所以房屋周围没有找出来 葵花宝典 在此之前,我们讲过边缘的检测,边缘检测的基本原理就是x方向或者y方向梯度变化很大,角点,顾名思义,就是两个方向的梯度变化都很大. 左1,平滑区域,没有边缘和角点

Harris角点检测

代码示例一: #include<opencv2/opencv.hpp> using namespace cv; int main(){ Mat src = imread("church.jpg", 0); imshow("原始图", src); //进行Harris角点检测找出角点 Mat cornerStrength; cornerHarris(src, cornerStrength, 2, 3, 0.01); //对灰度图进行阈值操作,得到二值图并显

15、角点检测之Harris角点检测

一.引言:关于兴趣点(interest points) 在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <