【计算机视觉作业二】局部图像描述子

1.Harris角点检测

1.1 原理:

图像:   I
图像的灰度值(指单个像素值):I(x,y)I(x,y)
图像的平移向量:[u,v][u,v]
平移产生的灰度变化:E(u,v)E(u,v)
高斯窗口系数:w(x,y)w(x,y)
在我们解决问题时,往往希望找到特征点,“特征”顾名思义,指能描述物体本质的东西,还有一种解释就是这个特征微小的变化都会对物体的某一属性产生重大的影响。而角点就是这样的特征。
观察日常生活中的“角落”就会发现,“角落”可以视为所有平面的交汇处,或者说是所有表面的发起处。假设我们要改变一个墙角的位置,那么由它而出发的平面势必都要有很大的变化。所以,这就引出了图像角点的定义
“如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点”.
由上面的定义,检测图像像素的灰度变化情况,即求解E(u,v)

 要求解E(u,v)E(u,v)的最大值的点,首先对I(x+u,y+v)I(x+u,y+v)进行泰勒展开:


将(2)式代入(1)式:

 

其中 M=∑x,yw(x,y)[I2xIxIy IxIyI2y] 

harris算子:

即:

其中trace(M)trace(M)表示矩阵MM的迹,即对角线元素的和。kk为经验值,一般在0.04-0.06之间,只要在某一点(x,y)处,λ1,λ2λ1,λ2为MM的特征值。
RR超过某一设定的阈值,则认为该点为角点。阈值的设置是Harris角点检测算法的关键,阈值设置过大会产生伪角点,阈值过小则会漏掉角点。

像上面这样去求解,原则上是没有问题的,可是,众所周知,原始的Harris角点检测算法不具有尺度不变性,也就是说如果图像的尺度发生变化,那么可能原来是角点的点在新的尺度就不是角点了。所以,我们在进行运算的开始,先将图像转换到尺度空间表示,即将原图像进行尺度变换,而尺度变换的方式就是问题的输入信号与尺度核函数做卷积运算:
fout=K∗finfout=K∗fin,这里的运算为卷积运算,不是乘法运算,即L(x,y,σ)=G(x,y,σ)∗I(x,y)L(x,y,σ)=G(x,y,σ)∗I(x,y),其中σσ表示尺度,然后我们用LL代替原图像去进行运算,而尺度成了我们运算的参数了。
 

1.2 python代码如下:

import cv2
import numpy as np
 
#读入图像并转化为float类型,用于传递给harris函数
filename = '1.jpg'
 
img = cv2.imread(filename)
 
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 
gray_img = np.float32(gray_img)
 
#对图像执行harris
Harris_detector = cv2.cornerHarris(gray_img, 2, 3, 0.04)
 
#膨胀harris结果
dst = cv2.dilate(Harris_detector, None)
 
# 设置阈值
thres = 0.01*dst.max()
 
img[dst > thres] = [255,0,0]
 
cv2.imshow('show', img)
 
cv2.waitKey()

 结果如下:

2 SIFT算法

解释:SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。

SIFT算法的特点有:

1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

SIFT算法可以解决的问题:

目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决:

1. 目标的旋转、缩放、平移(RST)

2. 图像仿射/投影变换(视点viewpoint)

3. 光照影响(illumination)

4. 目标遮挡(occlusion)

5. 杂物场景(clutter)

6. 噪声

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。 

Lowe将SIFT算法分解为如下四步:

1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

2.1 代码实现

直接调用了cv2库里的SIFT函数:

"""
Created on Sat Sep 29 14:43:02 2018

@author: qgl
"""

import numpy as np
import cv2
from matplotlib import pyplot as plt

imgname = 'C:/Users/qgl/Desktop/articles/test1.jpg'

sift = cv2.xfeatures2d.SIFT_create()

img = cv2.imread(imgname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
kp,des = sift.detectAndCompute(img,None)

cv2.imshow('gray',gray)
cv2.waitKey(0)

img1=cv2.drawKeypoints(img,kp,img,color=(255,0,255))

cv2.imshow('point',img1)
cv2.waitKey(0)

结果如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值