您的位置:首页 > 理论基础

计算机视觉笔记(三)图像处理(2)霍夫变换、角点检测、图像匹配SIFT

2017-08-16 14:17 393 查看
Outline:

1、Global Image Features (Hough Transform)霍夫变换

2、角点检测

3、SIFT特征

4、Learning with many simple features

一、霍夫变换

1、简介

霍夫变换 (Hough Transform) 是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。

Given a set of points, find the curve of line that explains the data points best. 给出一系列的点,找到一条最能代表这些点的曲线。

2、原理

霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。



(1)两个坐标空间之间的变换,即图中 ① 转换为 ②:

一条直线在直角坐标系下可以用y = kx + b 表示,霍夫变换的主要思想是将该方程的参数和变量交换,即用x, y作为已知量k, b作为变量坐标,所以直角坐标系下的直线y = kx + b在参数空间表示为点 ( k , b ) ,而一个点( x1, y1 ) 在直角坐标系下表示为一条直线y1 = x1·k+b,其中 ( k , b ) 是该直线上的任意点。

(2)峰值

图中 ② 的蓝点即峰值。

图中 ④ 的峰值不明显,可能由于分的区间很细,导致投票很分散,不利于找到直线的位置,容错率低。

(3)

① Gridsize分区间

② Smoth滤波

(4)极坐标表示

原因: 在y-x坐标系下,当直线垂直于y 轴,斜率是无穷的,在霍夫空间没有办法表示,为了避免这个缺点,采用极坐标表示。



注意 ρ和θ的取值范围:

① ρ>=0, 0<=θ<=360°

② ρ属于实数,0<=θ<=180°

3、基本霍夫变换算法:



首先,初始化;每投票一次,H[d,θ]加一;找到最大的,通过投票的方式,找到可能的位置。

优化的方法:

① Opencv,matlab 实现的时候,并不是所有角度都投,一般投票只考虑梯度方向。

② 另一种是降低阈值,让更多的直线被检测到,适应于有长噪声曲线、小物体监测。

③ 粗细搜索,先用粗的范围搜,再小范围搜索。(Ope
4000
ncv:多尺度霍夫变换)

4、示例

1)Image -> Canny

2)Canny -> Hough

点越亮,对应的线越长

3)Hough vote -> Edges







5、Hough transform in OpenCV

1)标准霍夫变换、霍夫直线检测:

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )


输入image:8UC1图像,可以是图像序列

输出lines:在图像中检测出的直线,每一条直线右两个矢量表示,离坐标原点的距离ρ和θ。

rho:像素单位的距离精度

theta:弧度单位的角度精度,bin的粗细程度

threshold:累加平面的阈值参数(投票的时候如何找这个峰值)

srn:rho的步进。对应多尺度霍夫变换,粗搜的时候用ρ,细搜用rho/srn

stn:theta的步进。

2)累计霍夫变换

void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )


输出lines:边缘线段的方向和范围

之所以称它是概率,因为它并不将累加器平面内的所有可能点都累加,只是随机挑选像素点,累加一部分,超过一个峰值,就认为是一条强的直线,把该条直线的其他边缘点去掉,即便没有验证它们。

minLineLength:可以接受线段最小长度

maxLineGap:允许的线段最大间隔

【小结】

霍夫变换最初用来检测直线,后来拓展可以检测简单结构,只要能写出解析式来。

霍夫变换的目的是找到二值图像中,经过足够多数量点的所有直线,并且分析每个单独的像素点,识别出可能通过它的直线,一条直线通过许多点,就说明它足够明显了。使用二维累加器,统计这种特性,直线被识别了多少次,然后该累加器的尺寸是ρ、θ、步进。。

3)霍夫转换圆检测

半径固定,映射之后还是圆。

半径不确定,映射之后是圆锥。

void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0 )


使用霍夫梯度法,首先Canny边缘检测;然后对边缘点(非零点)考虑局部梯度,使用sobel函数,x和y方向一阶导数;利用得到的梯度,由斜率指定的直线上,每个点在梯度的方向上进行投票累加器累加,同时标记边缘图像中每个非零像素位置,然后在二维累加器中选候选中心,这些中心大于指定阈值时,大于其所有临近,把这些值按降序排列;从候选中心出发,找到合适的半径,即这些点支持最多的半径。

二、图像局部特征

1、全局特征与局部特征

局部特征是图像特征的局部表达,反应图像的局部特殊性,只适用于图像进行匹配检索,不适合图像理解。

图像理解更关注图像的全局特征,颜色特征纹理分布形状等等。全局特征容易受到环境的影响,如光照、旋转、噪声。

局部特征往往对线条的交叉、明暗变化受到的干扰非常少,这时候引入局部特征进行图像匹配检索。

2、局部特征之blob(斑点) & corner(角点)

(1)Blob & corner

斑点通常指周围有一些颜色或灰度差别的区域,比如说椭圆上有个树、平面上有个点。它是一个区域,比角点的抗噪声能力强、稳定性好。

角点通常指图像中物体的拐角或两条直线的交叉部分。

(2)Blob detection(斑点检测):

① 高斯拉普拉斯算子LOG ② 像素点Hessian矩阵的行列式DOH



例子:SIFT SURF …

(3)Corner detection(角点检测)

例子:Harris FAST …

(4)得到Keypoint,还要知道:位置、周围区域对这个点的贡献

3、特征描述

① 梯度统计直方图(浮点型) 或 ② 二进制字符串特征描述子

4、角点检测:基本方式

(1)示例



我们有图中这样一个小区域,在不知道整幅图像是什么情况时,通过不断地移动这个小区域来探索未知区域。

当小区域在图中①时,我们认为它的灰度没有任何变化,是一个平坦区域。

当小区域在图中②时,在一个方向(上下或左右)灰度没有变化,另一个方向有变化,那么它是一个边缘区域。

当小区域在图中③时,任何一个方向灰度变化都很明显,那么它是一个角点区域。

5、角点检测算法1:Moravec

采取窗口模板,在四个方向上(0°,45°,90°,135°),考虑灰度变化值,然后把各个方向上变化最小的值作为角点检测值。



E-灰度变化,u-窗口在x方向移动距离,v-窗口在y方向移动的距离;

W(X,y)-窗口函数;

I(x+u,y+v)图像强度,移动之后(绿色框)的灰度值,I(x,y)移动之后(红色框)的灰度值

U, v可能的取值(1, 0), (1, 1), (0, -1), (-1, 1)

最后找最小的E(u,v)是否大于一个阈值,看它是否是角点。

缺点:

矩形旋转之后,每条边上都会找到角点。由于取E的最小值容易受到噪声的污染。



6、角点检测算法2:Harris





把上面的公式进行泰勒展开,在(0,0)位置展开,近似取到二阶导,这样就能计算该位置任何方向。

M-所有方向上强度变化率

协方差矩阵,通过比较这两个特征值,来判断

~~Harris角点强度计算公式

Det(M)–行列式



7、角点检测算法 其他



跟踪用的很多

三、图像匹配SIFT

图像在不同尺度下响应相同。

尺度高斯函数

SIFT用到了difference of gaussians 来检测某一尺度上对DOG的响应值,正常是用拉普拉斯高斯来检测兴趣点

DOG是LOG的近似。

在三维空间上寻找极值

SIFT:先对图像进行高斯模糊,然后构建高斯金字塔,即不断2倍降采样再模糊,每一组叫做octave。

DOG:不断做高斯模糊,但是不做下采样。

尺度空间的构建
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: