harris角点检测c语言,Harris角点检测原理及实现

本文介绍了角点的基本概念和角点检测的重要性,重点解析了Harris角点检测的原理,包括角点响应函数R的计算,并概述了算法的5个步骤。此外,文章还探讨了Harris角点检测的特性,如旋转不变性、尺度不变性和对亮度对比度变化的不敏感性。最后,展示了如何在OpenCV中使用goodFeaturesToTrack函数以及提供了简化版的C语言实现源代码。
摘要由CSDN通过智能技术生成

为便于理解,先简要介绍角点的概念和角点检测背景

一、角点及角点检测背景:

角点概念:

角点,通常可理解为两条边的角点,也可理解为像素值在多个方向有显著变化的点或局部区域内某个属性明显的点。如多个轮廓的交界处的点、轮廓边缘凸出的点等。对于角点的具体定义,目前并没有一个明确的概念,只需理解其大致含义即可。以下是对角点的一些描述,帮助理解:

(1)、一阶导数(灰度的梯度)的局部最大所对应的像素点;

(2)、两条及两条以上边缘的交点;

(3)、图像中梯度值和梯度方向的变化率都很高的点

(4)、角点处的一阶导数最大、二阶导数为零,指物体边缘变化不连续的方向。

角点检测背景:

目前角点检测可分为三类,基于灰度图的角点检测、基于二值化图像的角点检测和基于轮廓曲线的角点检测。博主目前受实力限制,仅了解基于灰度图的Harris角点检测,后续实力有变,再续更。

二、Harris角点检测原理:

概念:

Harris角点检测可理解为以像素点为中心的窗口向多个方向移动,通过窗口像素值有无显著变化判断有无角点。下面上图,便于理解:

窗口多个方向移动,像素值无      窗口多个方向移动,像素值     窗口多个方向移动,像素值

显著变化            仅在竖直方向有明显变化      在多个方向有明显变化

算法:

对I(x,y)图像中的像素点(x,y),进行自相关平移w(x+∆x、y+∆y)得到自相关函数:

c(x,y,∆x,∆y) = ∑wh(x,y)(I(x,y)-I(x+∆x,y+∆y))2

其中 ∑w表示窗口内的点,h(x,y)表示加权函数,可为高斯函数或常数等,感兴趣可取下方源代码,根据自己喜好进行修改。

有泰勒公式可得:

I(x+∆x,y+∆y) = I(x,y)+∆xIx(x,y)+∆yIy(x,y)+p ≈ I(x,y)+∆xIx(x,y)+∆yIy(x,y)

代入上式(为便于理解和方便(懒),加权函数暂时忽略):

c(x,y,∆x,∆y) = ∑w(I(x,y)-I(x+∆x,y+∆y))2≈∑w((∆xIx(x,y))2+2∆x∆yIx(x,y)Iy(x,y)+(∆yIy(x,y))2)

由于某园对公式输入不太友好,下面取道友的图一用(道友图中,w(x

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Harris角点检测是一种用于图像处理和计机视觉中的角点检测法。该法通过计图像中每个像素点的Harris响应函数来确定角点的位置。 下面是一个简单的Harris角点检测C语言代码示例: ```c #include <stdio.h> #include <math.h> #define IMAGE_WIDTH 100 #define IMAGE_HEIGHT 100 float gaussian(int x, int y, float sigma) { return exp(-(x*x + y*y) / (2*sigma*sigma)); } void HarrisCornerDetection(unsigned char* image, unsigned char* output, float threshold) { float dx, dy; float Ix, Iy, Ixy, Ixx, Iyy; float det, trace, r; int x, y; for (y = 1; y < IMAGE_HEIGHT-1; y++) { for (x = 1; x < IMAGE_WIDTH-1; x++) { Ix = image[(y+1)*IMAGE_WIDTH + x] - image[(y-1)*IMAGE_WIDTH + x]; Iy = image[y*IMAGE_WIDTH + x+1] - image[y*IMAGE_WIDTH + x-1]; Ixx = Ix * Ix; Iyy = Iy * Iy; Ixy = Ix * Iy; dx += Ixx; dy += Iyy; det = Ixx * Iyy - Ixy * Ixy; trace = Ixx + Iyy; r = det - 0.04f * trace * trace; output[y*IMAGE_WIDTH + x] = r > threshold ? 255 : 0; } } } int main() { unsigned char image[IMAGE_WIDTH * IMAGE_HEIGHT]; unsigned char output[IMAGE_WIDTH * IMAGE_HEIGHT]; // 这里可以初始化image数组,加载图像的灰度值 HarrisCornerDetection(image, output, 100); // 输出结果到文件或显示图像 return 0; } ``` 这段代码首先定义了一个高斯函数用于计角点检测的权重,然后实现了一个HarrisCornerDetection函数来执行角点检测。函数中使用了一些局部变量来计Harris响应函数,并通过阈值判断是否为角点。 在主函数中,你可以根据需求初始化image数组,加载图像的灰度值,并将结果输出到文件或显示图像。 注意,这只是一个简化版的Harris角点检测代码示例,实际应用中可能需要更多的图像处理和优化步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值