数字图像处理篇(9)角点检测及其opencv实现

一、引言    

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

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

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

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

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

二、Harris角点检测

1、数学依据

①SSD平方差之和

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

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

        我们假设此窗口为W,且它是一个矩形窗口(也就是说该窗口下的每一个像素值权重相同)。假设以\overrightarrow{z}=(u,v)的方向去移动这个窗口,我们会使用平方差之和(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、结论

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

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

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

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

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

 而\lambdamin又与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 np

img=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,而现在变成了\alpha I+\beta。假设每个点均不超过255并且变换后普遍变亮,我们可以很好的去解释这个结论。原来由于太暗而不被认为是角点的点,由于亮度的提升,现在可能会被当成角点,如下图:

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

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机鬼才~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值