一、引言

读者们跟着小编学了这么久的数字图像处理,是时候带领大家看看我们学校的建筑啦!(这是小编所在大学的计算机学院,没准小编还能遇到校友呢)

相信不少的读者都注意到了左上角的A、B、C,并且喃喃的吐槽道,小编,你又在怀什么坏心思啊,肯定不是让我们欣赏建筑这么简单吧!

安啦安啦,小编这么单纯又可爱,怎么会有坏心思呢(坏笑)。但大家既然注意到了左上角的ABC,那么就请大家找找看,这三个小图对应的是大图的哪一部分。

相信很多读者都是这么思考的。对于图A,它对应的是平坦部分,有很多个部分都有,它没有自己的一个特点,完全不能精准的找到,对于图B,它对应的是一个“边缘”部分,我们大致能找出是在哪一个边缘所截取的,而对于图C,由于有一个阴影与阳光所形成的“小角”,我们能够很快的定位出它在哪一部分。

我们把类似于图C这样有很明显的“角”的点称之为“角点”--------这也是我们今天的主角。

二、Harris角点检测

1、数学依据

①SSD平方差之和

对于上图来说,假设我们只考虑一个小窗口的像素值变化。对于左图来说,也就是平坦区域部分,我们移动窗口时,不论往上面方向去移动,窗口的像素值均不会发生变化;对于中图来说,也就是边缘区域,我们移动窗口时,如果是沿着边缘方向移动,窗口的像素值不会发生变化,但如果是其他方向移动,像素值变化还是挺大的;而对于右图来说,也就是角区域,不论是从哪个方向去移动,均会发生天翻地覆的像素值变化。

那么,我们如何用数学公式去描述这种差异呢?

我们假设此窗口为W,且它是一个矩形窗口(也就是说该窗口下的每一个像素值权重相同)。假设以的方向去移动这个窗口,我们会使用平方差之和(Sun of Squared Differences 简称SSD)来描述移动前与移动后的像素差异。SSD差异E(u,v)的数学定义为:

从理论上分析来说,这个值越大越有特征,但是缺点是精确计算较为复杂,毕竟每个窗口有很多个像素,算完了还得求和。并且向量(u,v)并不是唯一的,可以给定很多组向量值。

②泰勒展开式

马克思主义哲学告诉我们,共性是寓于个性之中的,我们并不满意于如此大的计算量,所以我们就是要从这么多组向量值挨个计算后的值中找到这些值的“共性”。

大家应该都学习过泰勒展开式吧,对于一元函数的泰勒展开式,我们有皮亚诺余项以及拉格朗日余项。其公式如下图:

Rn(x)的不同代表着泰勒展开余项类型的不同。而众所周知,图像是一个“二元”的,有x方向上的变化以及y方向上的变化,所以,小编想讲述的是二元函数泰勒展开式,它的表达式为:

也就是说,我们可以对E(u,v)的数学公式进行泰勒展开再化简。我们将用如下的式子去代替I(x+u,y+v):

而在原公式里就有I(x+u,y+v)的差值,刚好能够消掉,如下图(Ix、Iy分别代表I对x的偏导以及I对y的偏导):

仔细观察,这个表达式其实代表了一个椭圆,要是一时半会没看出来也没关系,下面是它的展开表达式:

而ABC也构成了一个系数矩阵,经过一些数学推导,可以发现这个矩阵的两个特征值分别为椭圆长半轴平方的倒数以及短半轴平方的倒数,特征向量的方向为两个轴的方向。

2、结论

自此,我们可以通过衡量特征值的大小来判断该点是不是角点。对于一个窗口,对它的系数矩阵而言,我们有如下结论:

①两个特征值均很大,则该部分为角点

②一个特征值远大于另一个特征值,则该部分为边缘

③两个特征值均很小,则该部分为平坦区域

还有另一种方法,就是将较小的特征值与一个阈值进行判断。如下图,两个特征值分别代表不同的意义。

min又与Harris算子的值相近,Harris算子的计算方式如下图:

但是“均很大 ”是指多大,“均很小 ”又是指多小呢?“阈值”又应该取多少呢?我们很难通过感性去判断,所以,我们可以采用CRF角点响应函数来判断图像的信息。

k一般取值为0.04~0.06,对此函数,有如下结论

①R值大于0,则该部分为角点

②R值小于0,则该部分为边缘

③R值接近0,则该部分为平坦区域

3、代码实现

dst=cornerHarris(src,blocksize,ksize,k)

参数含义:

dst:输出图像

src:输入图像

blocksize:窗口W的大小(例如2代表窗口大小2*2)

ksize:卷积核

k:权重系数,一般为0.04~0.06

实战一下,选择一张图片并用红点标记出角点位置:

import cv2
import numpy as npimg=cv2.imread("dog.jpg",-1)
#gray为img的灰度图片
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#计算每个像素的R值
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
#如果大于最大值的1%我们就将此点显示出来
img[dst > 0.01*dst.max()] = [0, 0, 255]
cv2.imshow("corner",img)
cv2.imwrite("dog_corner.jpg",img)cv2.waitKey()
cv2.destroyAllWindows()

结果如下图,左边为原图,右边为加上角点(红点)后的图。

三、Harris角点检测器的性质

在探究窗口不变的前提下,图像的几何变换与光学变换下对角点检测的影响之前,我们先来介绍角点的不变性与等变性的概念。角点的不变性是指,图像变换但图像的角点位置不变,而角点的等变性是指如果我们有一张图片和这张图片的变换版本,角点特征仍然能在相对位置上找到。显然我们希望几何变换后,角点具有等变性而光学变换后角点具有不变性。

1、几何变换

①旋转

闭上眼睛,让我们脑补一张埃菲尔铁塔的图片。很明显,埃菲尔铁塔的塔尖应该是一个角点。然后慢慢的脑补,慢慢的将这张图片旋转一个角度。请问:埃菲尔铁塔的塔尖还存在吗?它还是不是一个角点?我们会发现,只要一开始被认为是角点的,旋转后相对位置处仍然会是一个角点。好好思考一下你就能得到下述结论。

结论:对于旋转,角点的位置是等变的

②平移

和旋转的方法类似。读者们也可以闭上眼睛想象,并且得到下述结论。

结论:对于平移,角点的位置是等变的

③缩放

对于缩放,小编先给结论:对于缩放,角点的位置既不是等变的也不是不变的。可能很多读者会疑惑,excuse me?小编,你在逗我?埃菲尔铁塔放大一百倍后,塔尖不仍然存在?怎么会是你给的这个结论呢?

亲爱的读者们,你们陷入了一个误区。塔尖放大后确实依然是角点,但对于下图这种情况呢?注意:我们的前提条件是窗口大小不变哦!

是不是豁然开朗了?

2、光学变换

先给结论:对于亮度仿射变换,角点的位置是部分不变的。

光学变换可以简单理解为,原来任意一点的像素的灰度值为I,而现在变成了。假设每个点均不超过255并且变换后普遍变亮,我们可以很好的去解释这个结论。原来由于太暗而不被认为是角点的点,由于亮度的提升,现在可能会被当成角点,如下图:

好的,本期的科普就到此为止啦,收藏此专栏,小编带你学会更多计算机视觉的知识!

数字图像处理篇(7)角点检测相关推荐

  1. Win8 Metro(C#)数字图像处理--2.35图像肤色检测算法

    原文:Win8 Metro(C#)数字图像处理--2.35图像肤色检测算法  [函数名称] 肤色检测函数SkinDetectProcess(WriteableBitmap src) [算法说明] ...

  2. 数字图像处理之校园交通标志检测与识别

    文章目录 背景综述 设计目的 实现过程 第一步为了更好地进行信息的交互,需要先设计基于Matlab的GUI界面设计 第二步其次我们需要读入含有交通标志的图像 第三步接下来是对原始图像进行高斯滤波 第四 ...

  3. C++数字图像处理篇之图像加马赛克

    马赛克是一种广为使用的图像处理手段,它是将影像特定区域的色阶细节劣化并造成色块打乱的效果.这种模糊看样子像一个个小格子,所以被称为马赛克.马赛克主要的目的就是使图像内容无法辨认,以保护特殊图像内容.这 ...

  4. 数字图像处理篇(4)图像增强之平滑操作及opencv实现

    目录 一.噪声 1.椒盐噪声 2.高斯噪声 二.平滑 1.引言 2.中值滤波 3.邻域平均法 4.加权法 三.2D卷积 四.边缘样式 思考一个问题:假如你是灰太狼,你是否愿意吃掉一只满身长满黑点点.脏 ...

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

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

  6. opencv角点检测学习总结

    学习opencv 角点检测 如果一个点在两个正交方向上都有明显的导数,则我们认为此点更倾向于是独一无二的,所以许多可跟踪的特征点都是角点. 一下为角点检测中用到的一些函数 cvGoodFeatures ...

  7. OpenCV学习之路(七)——角点检测

    角点检测(Corner Detection)是计算机视觉中用来获得图像特征的一种方法,广泛应用于运动检测.视频追踪.目标识别等领域中,也称特征点检测. 一.兴趣点与角点 对于角点,到目前为止还没有明确 ...

  8. OpenCV —— 角点检测之 Harris 角点检测、Shi-Tomasi 角点检测、FAST 角点检测

    角点检测 Harris 角点检测 实现原理 OpenCV 函数 优化 Shi-Tomasi 角点检测 实现原理 OpenCV 函数 FAST 角点检测 实现原理 OpenCV 函数 优化 在图像处理和 ...

  9. OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测

    在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪 ...

最新文章

  1. Spring干货汇总(含Spring Boot与Spring Cloud)
  2. 吴军信息论40讲_吴军信息论40讲笔记
  3. 设置css3动画的顺序,CSS3 “瓷砖”顺序飘落的动画
  4. Python数据库连接池DBUtils
  5. mac你没有权限打开应用程序_如何管理Mac的隐私权限控制
  6. 关于各种无法解析的外部符号问题的相应解决方案【转】
  7. 【java】线程的简单使用以及注意的问题
  8. android支付宝开放平台开发,支付宝开放平台支付更新升级全解析
  9. 腾讯同事要跳槽,问我背包问题具体咋回事,我直接甩给他这篇!
  10. python机器学习应用mooc_(2)Naive bayes
  11. matlab画圆(及其他常用图形)
  12. NBA数据分析及可视化BI数据大屏 (Kobe·Bryant)
  13. elf文件的GOT和PLT
  14. angular 万年历_angularjs日期选择插件
  15. 基于java springboot android安卓商城购物平台源码(毕设)
  16. 二路归并排序和基数排序
  17. NLP是什么,百度的NLP技术有有哪些?
  18. springboot 微信太阳码_springboot教务管理系统+微信小程序云开发
  19. [QNX_firewall]PF防火墙最详细教程(下)
  20. 微信小程序 页面导航、传参、接收参数

热门文章

  1. linux启动网络服务的命令,linux重启服务命令
  2. AutoSAR系列讲解 - 交流专区
  3. Linux_rpm安装
  4. Chrome源代码结构
  5. java枚举类型的优势在哪里?
  6. nodejs shell交互_NodeJs交互式命令行工具Inquirer.js-开箱指南
  7. 圣商,牢记使命成就当代圣商
  8. linux下开启rpcbind服务
  9. DNS服务未响应的简单解决办法
  10. 城域网IPv6过渡技术——MAP技术