1、Harris角点检测算法实现步骤
(1)计算图像I(x,y)I(x,y)I(x,y)在XXX和YYY两个方向的梯度Ix,Iy{{I}_{x}},{{I}_{y}}Ix​,Iy​;Ix=∂I∂x=I⊗[−101]{{I}_{x}}=\frac{\partial I}{\partial x}=I\otimes \left[ \begin{matrix} -1 & 0 & 1 \\\end{matrix} \right]Ix​=∂x∂I​=I⊗[−1​0​1​]Iy=∂I∂y=I⊗[−101]T{{I}_{y}}=\frac{\partial I}{\partial y}=I\otimes {{\left[ \begin{matrix} -1 & 0 & 1 \\\end{matrix} \right]}^{T}}Iy​=∂y∂I​=I⊗[−1​0​1​]T(2)计算图像两个方向梯度的乘积;
Ix2=IxIx,Iy2=IyIy,Ixy=IxIyI_{x}^{2}={{I}_{x}}{{I}_{x}},I_{y}^{2}={{I}_{y}}{{I}_{y}},{{I}_{xy}}={{I}_{x}}{{I}_{y}}Ix2​=Ix​Ix​,Iy2​=Iy​Iy​,Ixy​=Ix​Iy​(3)使用高斯函数对Ix2,Iy2,IxyI_{x}^{2},I_{y}^{2},{{I}_{xy}}Ix2​,Iy2​,Ixy​进行高斯加权(取σ=1\sigma =1σ=1),生成矩阵MMM的元素A,B,CA,B,CA,B,C;
A=g(Ix2)=Ix2⊗wA=g(I_{x}^{2})=I_{x}^{2}\otimes wA=g(Ix2​)=Ix2​⊗wB=g(Iy2)=Iy2⊗wB=g(I_{y}^{2})=I_{y}^{2}\otimes wB=g(Iy2​)=Iy2​⊗wC=g(Ixy)=Ixy⊗wC=g({{I}_{xy}})={{I}_{xy}}\otimes wC=g(Ixy​)=Ixy​⊗w(5)在3×33\times 33×3或5×55\times 55×5的邻域内进行非最大值抑制,局部最大值点记为图像中的角点。
2、Matlab实现

close all
clear
clc
%% 0、读取图像并进行灰度处理
img=imread('lena.png');
[m,n,c]=size(img);
if c>1img_gray=rgb2gray(img);
elseimg_gray=img;
end
%% 1、计算两个方向的梯度Ix,Iy
temp=zeros(m+2,n+2);
Ix=temp;
Iy=temp;
temp(2:m+1,2:n+1)=img_gray;
Ix(2:m+1,2:n+1)=temp(2:m+1,3:n+2)-temp(2:m+1,1:n);
Iy(2:m+1,2:n+1)=temp(3:m+2,2:n+1)-temp(1:m,2:n+1);
%% 2、计算图像两个方向的梯度乘积Ix2,Iy2,Ixy
Ix2=Ix(2:m+1,2:n+1).*Ix(2:m+1,2:n+1);
Iy2=Iy(2:m+1,2:n+1).*Iy(2:m+1,2:n+1);
Ixy=Ix(2:m+1,2:n+1).*Iy(2:m+1,2:n+1);
%% 3、使用高斯函数对Ix2,Iy2,Ixy进行高斯加权(sigma=1),生成矩阵M的元素A,B,C
h=fspecial('gaussian',[5,5],1);
A=filter2(h,Ix2);
B=filter2(h,Iy2);
C=filter2(h,Ixy);
%% 4、计算每个像素的Harris响应值R,并对小于阈值t的R置零
R=zeros(m,n);
k=0.06;
Rmax=0;
for i=1:mfor j=1:nM=[A(i,j),C(i,j);C(i,j),B(i,j)];R(i,j)=det(M)-k*(trace(M))^2;if R(i,j)>RmaxRmax=R(i,j); endend
end
t=0.02*Rmax;
%% 5、非极大值抑制
s=5;    % 邻域大小
corner=zeros(m,n);
for i=(s+1)/2:m-(s+1)/2+1for j=(s+1)/2:n-(s+1)/2+1if R(i,j)==max(R(i-(s+1)/2+1:i+(s+1)/2-1,j-(s+1)/2+1:j+(s+1)/2-1),[],'all') && R(i,j)>tcorner(i,j)=1;elsecorner(i,j)=0;endend
end
%% 角点显示
[x,y]=find(corner>0);   % 角点坐标
figure
imshow(img)
hold on
plot(y,x,'r+','MarkerSize',10);
hold off

结果如图所示:

3、OpenCV实现

// Harris角点检测
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;int main()
{Mat img = imread("lena.png");Mat img_gray;if (img.channels() > 1)cvtColor(img, img_gray, COLOR_BGR2GRAY);elseimg_gray = img;Size mn = size(img_gray);int n = mn.height, m = mn.width;float k = 0.06, Rmax = 0, t;img_gray.convertTo(img_gray, CV_32FC1);// 1、计算两个方向的梯度Ix,IyMat temp = Mat::zeros(mn + Size(2, 2), CV_32FC1);Mat R = Mat::zeros(mn, CV_32FC1), corner = R.clone();Mat Ix, Iy, Ix2, Iy2, Ixy, A, B, C, M;temp.copyTo(Ix);temp.copyTo(Iy);img_gray.copyTo(temp(Rect(1, 1, m, n)));Ix(Rect(1, 1, m, n)) = temp(Rect(2, 1, m, n)) - temp(Rect(0, 1, m, n));Iy(Rect(1, 1, m, n)) = temp(Rect(1, 2, m, n)) - temp(Rect(1, 0, m, n));// 2、计算图像两个方向的梯度乘积Ix2,Iy2,IxyIx2 = Ix(Rect(1, 1, m, n)).mul(Ix(Rect(1, 1, m, n)));Iy2 = Iy(Rect(1, 1, m, n)).mul(Iy(Rect(1, 1, m, n)));Ixy = Ix(Rect(1, 1, m, n)).mul(Iy(Rect(1, 1, m, n)));// 3、使用高斯函数对Ix2,Iy2,Ixy进行高斯加权(sigma=1),生成矩阵M的元素A,B,CGaussianBlur(Ix2, A, Size(5, 5), 1, 0);GaussianBlur(Iy2, B, Size(5, 5), 1, 0);GaussianBlur(Ixy, C, Size(5, 5), 1, 0);// 4、计算每个像素的Harris响应值R,并对小于阈值t的R置零for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){M = (Mat_<float>(2, 2) << A.at<float>(i, j), C.at<float>(i, j), C.at<float>(i, j), B.at<float>(i, j));R.at<float>(i, j) = determinant(M) - k * (trace(M).val[0]) * (trace(M).val[0]);if (R.at<float>(i, j) > Rmax)Rmax = R.at<float>(i, j);}}t = 0.02*Rmax;// 5、 非极大值抑制int s = 5;  // 邻域大小for (int i = (s + 1) / 2 - 1; i < n - (s + 1) / 2 + 1; i++){for (int j = (s + 1) / 2 - 1; j < m - (s + 1) / 2 + 1; j++){double Rm;minMaxIdx(R(Rect(j - (s - 1) / 2, i - (s - 1) / 2, s, s)), NULL, &Rm, NULL, NULL);if (fabsf(R.at<float>(i, j) - (float)Rm) < 1e-10 && (R.at<float>(i, j) > t)){corner.at<float>(i, j) = 255;drawMarker(img, Point(j, i), Scalar(0, 0, 255), MARKER_CROSS, 10, 1);}elsecorner.at<float>(i, j) = 0;}}imshow("img", img);waitKey(0);return 0;
}

结果如图所示:

注意:(1)Matlab中图像坐标系xxx轴竖直向下,yyy轴水平向右,OpenCV中图像坐标系xxx轴水平向右,yyy轴水平向右竖直向下;(2)Matlab和OpenCV中的Harris角点检测算法有些许出入,“猜想”是因为:在高斯加权时,Matlab和OpenCV所用的高斯核不一样。

Harris角点检测,及其Matlab和OpenCV实现相关推荐

  1. 测角误差估计算法matlab,Harris角点检测 及 Matlab实验

    目录 1 基础知识 1.1 图像变化的类型 1.2 提取点特征的作用 1.3 什么是好的角点检测算法? 2 Harris 角点检测 2.1 Harris角点检测基本思想 2.2 Harris角点检测: ...

  2. 图像局部特征(二)--Harris角点检测子

     一.角点定义 有定义角点的几段话: 1.角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测.图像匹配.视频跟踪.三维建模和目标识别等领域 ...

  3. Harris 角点检测原理详解

    var html = document.getElementById("artContent").innerHTML; document.getElementById(" ...

  4. OpenCV角点检测之Harris角点检测

    本篇文章中,我们一起探讨了OpenCV中Harris角点检测相关的知识点,学习了OpenCV中实现Harris角点检测的cornerHarris函数的使用方法.此博文一共有两个配套的麻雀虽小但五脏俱全 ...

  5. OpenCV之feature2d 模块. 2D特征框架(1)Harris 角点检测子 Shi-Tomasi角点检测子 定制化创建角点检测子 亚像素级的角点检测 特征点检测

    Harris 角点检测子 目标 本教程中我们将涉及: 有哪些特征?它们有什么用? 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点. 理论 有哪些特征? 在计算机视 ...

  6. OpenCV与图像处理学习十三——Harris角点检测(含代码)

    OpenCV与图像处理学习十三--Harris角点检测(含代码) 一.角点的概念 二.Harris角点检测的实现过程 三.Harris代码应用 一.角点的概念 角点: 在现实世界中, 角点对应于物体的 ...

  7. cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8763369.html 参考文献----------OpenCV-Python-Toturial ...

  8. Python+OpenCV:图像Harris角点检测(Harris Corner Detection)

    Python+OpenCV:图像Harris角点检测(Harris Corner Detection) 理论 corners are regions in the image with large v ...

  9. MATLAB——Harris角点检测

    为完成对棋盘标板的角点检测,特此记录. 角点:最直接的定义为在水平.垂直两个方向上变化均较大的点 最常用的角点检测算法为Harris角点检测方法,原理如下: 计算图像I(x,y)在X和Y两个方向的梯度 ...

最新文章

  1. Spark Streaming与Kafka Streaming对比
  2. LoRDEC的使用(LoRDEC-0.6.tar.gz)
  3. 利用ISCSI存储技术构建IP存储网络(安全篇)
  4. insightface和facenet效果+性能比较
  5. UNITY相关的一些新功能,新想法
  6. 软件工程—团队作业1
  7. 你们觉得这个时代好还是父母那个时代好?
  8. Unity5.X打包与加载AssetBundle简单示例
  9. python字符串函数的使用方法_python字符串的操作函数
  10. mysql 命令类型_mysql 基本命令(3)-数据类型和运算符
  11. 客户机容易随机出现自动重启、游戏卡问题?不妨优化下BIOS中节能技术!
  12. U-net使用, 图像分割(边缘检测)
  13. 【图像融合】基于matlab CBF算法图像融合【含Matlab源码 083期】
  14. mysql ocp考试准备多久_MySQL OCP考试复习系列--开篇:了解MySQL考试
  15. cad卸载不干净_Adobe系列软件总是卸载不干净?试试这个Adobe卸载工具
  16. 《思考的技巧》- 学习总结
  17. 爱快支持服务器网卡嘛,爱快软路由硬件支持
  18. adc0809c语言编程,单片机C语言程序设计之ADC0809数模转换与显示
  19. dockers移盘挂载
  20. 2021-06-11 智能汽车和自动驾驶行业人才状态初探

热门文章

  1. JavaScript 实现雪花效果
  2. 吴枫 python小课账号_吴的解释|吴的意思|汉典“吴”字的基本解释
  3. 【DP】【高精】WZK打雪仗
  4. jzojWZK打雪仗【高精】【DP】【卡特兰数】
  5. win10开机蓝屏_终级解决win10蓝屏代码WHEA_UNCORRECTABLE_ERROR没有之一 心语家园
  6. 【一文学会】vue.js入门到放弃
  7. SIM7600CE TCP AT指令
  8. win10中conda activate激活环境出错的解决办法
  9. 几何造型问题(转载)
  10. python手机版下载-手机python下载