EMGU.CV入门(十九、图像角点)

本文介绍了图像处理中的Harris角点检测算法,包括角点、边缘和平坦区域的概念,详细阐述了Harris算法的数学原理和实现步骤。通过一阶泰勒展开和特征值分析,解释了如何判断图像中的角点、边缘和平坦区域。并展示了Harris算法在实际图像上的应用效果,包括原图、未进行极大值抑制的结果以及最终的角点和边缘检测结果。同时,提供了C#代码示例,演示了从读取图像到应用Harris算法的完整过程。
摘要由CSDN通过智能技术生成

一、理论

1.1 角点、边缘、团块

  1. 边缘(edge)
  2. 团块(flat)
  3. 角点(corner)
    角点:极值点,

1.2 Harris算法思想

思想是用小窗口在图像上平移,如果窗口内像素:

  1. 沿任意方向变化不明显(flat)
  2. 沿某一方向变化不明显(edge)
  3. 沿任意方向明显变化(corner)

在这里插入图片描述

1.3 Harris算法实现

  1. 移动区域前后对应位置差的平方
    其中 W为权重,x,y为移动方向,u,v为在x,y上的偏移量
    在这里插入图片描述

  2. 一阶泰勒展开
    在这里插入图片描述

  3. 将2代入1,化简
    在这里插入图片描述

  4. 将M代入
    在这里插入图片描述
    其中:
    在这里插入图片描述

  5. n阶实对称矩阵A必有n个线性不相关特征向量,则M可以转换为
    在这里插入图片描述
    在这里插入图片描述

二次项函数本质上就是一个椭圆函数。椭圆的扁率和尺寸是由M(x,y)的特征值λ1、λ2决定的,椭贺的方向是由M(x,y)的特征矢量决定的,如下图所示,椭圆方程为:

[Δx,Δy]M(x,y)[ΔxΔy]=1

  1. 因此有三种情况

在这里插入图片描述
图像中的直线。一个特征值大,另一个特征值小,λ1≫λ2或λ2≫λ1。自相关函数值在某一方向上大,在其他方向上小。
图像中的平面。两个特征值都小,且近似相等;自相关函数数值在各个方向上都小。
图像中的角点。两个特征值都大,且近似相等,自相关函数在所有方向都增大。

  1. 即以下公式
    R 约等于 0 平坦区
    R 大于 0 角点
    R 小于 0 边缘

在这里插入图片描述

二、 效果

2.1 原图

在这里插入图片描述

2.2 Harris 不做极大值抑制

绿色为边缘,红色为角点
在这里插入图片描述

2.3 Harris 极大值抑制

在这里插入图片描述

三、代码

 // 1. 读取原图
 var imgO = CvInvoke.Imread("WB.png");
 var imgO1 = imgO.ToImage<Bgr, byte>();
 CvInvoke.Imshow("imgO",imgO);

 // 2. 灰度
 var imgGray = CvInvoke.Imread("WB.png", 0);
 CvInvoke.Imshow("imgGray", imgGray);

 // 3. harris
 Mat harrisResponse = new Mat();    
 CvInvoke.CornerHarris(imgGray,harrisResponse,2,3,0.04);

 // 4. 求取最大值,最小值
 double minValue=0, maxValue=0;
 Point minLoc = new Point();
 Point MaxLoc = new Point();
 CvInvoke.MinMaxLoc(harrisResponse,ref minValue,ref maxValue,ref minLoc,ref MaxLoc);

 // 5. 极大值抑制
 Matrix<float> matrix = new Matrix<float>(imgGray.Size);
 harrisResponse.CopyTo(matrix);
 for (int i = 0; i < matrix.Rows; i++) {
     for (int j = 0; j < matrix.Cols; j++) {
         if (matrix[i, j] > maxValue*0.001) {
             imgO1[i,j] = new Bgr(0,0,255);
         }
         if (matrix[i, j] < minValue*0.1)
         {
             imgO1[i, j] = new Bgr(0, 255, 0);
         }
     }
 }
 CvInvoke.Imshow("imgO1", imgO1);

 CvInvoke.WaitKey(0);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值