EDA365电子论坛网

标题: MATLAB 记录,fspecial,Hough直线检测, FIST、SURF, imadjust从用法到原理 [打印本页]

作者: thinkfunny    时间: 2020-6-3 13:50
标题: MATLAB 记录,fspecial,Hough直线检测, FIST、SURF, imadjust从用法到原理
1,fspecial+ ]: y2 g: S+ I) H% W1 _# I, I( M9 t
& t! A! e2 u: o" D' w
Fspecial函数用于创建预定义的滤波算子,其语法格式为:
$ K% o, ?5 Q2 e1 R* J5 c9 Zh = fspecial(type)
5 u5 @2 H, K. }& f! h( V$ qh = fspecial(type,parameters,sigma)
. p& R  N* D; Y参数type制定算子类型,parameters指定相应的参数,具体格式为:. k+ i- f% Q6 j+ b
type='average',为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。0 N/ ^, d  a# z% o
type= 'gaussian',为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3],sigma表示滤波器的标准差,单位为像素,默认值为
+ r/ ^# N% _' K' G, E
& D! S* ]& o5 ~( G% a% H2 R0.5。
1 Z+ b, D' w# X* D6 b% s' rtype= 'laplacian',为拉普拉斯算子,参数为alpha,用于控制拉普拉斯算子的形状,取值范围为[0,1],默认值为0.2。1 ~, D  i: j* J2 J
type= 'log',为拉普拉斯高斯算子,参数有两个,n表示模版尺寸,默认值为[3,3],sigma为滤波器的标准差,单位为像素,默认值为0.5
& z" N3 J6 @% e$ ntype= 'prewitt',为prewitt算子,用于边缘增强,无参数。7 D5 j  ]4 H7 L4 J! Z) p7 F
type= 'sobel',为著名的sobel算子,用于边缘提取,无参数。' y: K# y; z' C; L* U. j
type= 'unsharp',为对比度增强滤波器,参数alpha用于控制滤波器的形状,范围为[0,1],默认值为0.2。6 {' h1 W, A2 @, T: ^

& J+ A  G& T, F" B! i% v6 Y- o  j例子:
) y4 e) s* y9 B* a4 i2 ]: ^) R4 d* z0 V1 l* z, ^
>> G=fspecial('gaussian',5)%参数为5,表示产生5*5的gaussian矩阵,如果没有,默认为3*3的矩阵。
. M' b/ B7 `9 Z4 K1 p" q0 C, @2 n% ?
G =
+ y- f3 y  Z9 l1 P
$ t. Y+ e+ ^1 k& d2 m: j    0.0000    0.0000    0.0002    0.0000    0.0000
# }$ J1 i, n' l# h, Q6 E    0.0000    0.0113    0.0837    0.0113    0.0000; q5 r# y9 t# P+ s
    0.0002    0.0837    0.6187    0.0837    0.0002# l9 I& B; e0 f: g5 J
    0.0000    0.0113    0.0837    0.0113    0.0000+ t& l8 p: h) O2 S- b
    0.0000    0.0000    0.0002    0.0000    0.00005 U( \3 a9 p1 h2 }

9 e* q3 l7 X* T2 |2 T( e" N>> G=fspecial('gaussian',5,1.5)%1.5为滤波器的标准差。
7 P0 h; a$ a- B2 \
/ H! b6 M5 R4 i( y9 b* dG =
/ [7 L$ a5 w4 d& |$ R- Z' S2 d
8 \" s, f7 a% ?: S* H2 d    0.0144    0.0281    0.0351    0.0281    0.0144
! Y! r; l0 m. o$ M* U/ q# Q    0.0281    0.0547    0.0683    0.0547    0.0281: \  f% E" y$ v' [
    0.0351    0.0683    0.0853    0.0683    0.03519 K) y- ?( u4 R4 x* f9 W* b
    0.0281    0.0547    0.0683    0.0547    0.0281! Q' L' {6 T4 r1 ^7 @
    0.0144    0.0281    0.0351    0.0281    0.01443 ^* H4 Z# n: W' X. {
7 _; g5 R- Q* F8 w3 W4 w5 e
>> + ?" \: b7 K3 l
/ u: k( `* G  o8 J
>> G=fspecial('average')%默认为3*3的矩阵。均值滤波
" k1 I- o7 C. u: e6 L! @( E! {# m0 E" d* H# R) q. w  m
G =
# ~$ D. r9 ~/ Z8 N; H- W6 \/ F/ D
5 t. v1 {7 f/ q5 U1 g    0.1111    0.1111    0.1111
. n- G& {5 S3 q8 D    0.1111    0.1111    0.1111
3 h" U7 q$ K4 U: u! p    0.1111    0.1111    0.1111$ y6 e9 s6 e/ _
0 @( m, \7 W# ~3 O5 `
>> G=fspecial('average',5)%会产生5*5的矩阵。  N/ G# ^. `) q$ B8 e" }4 r
" U9 ]  `8 s& t$ n( b. @3 D
2,Hough直线检测
+ }# w0 a& u7 v8 t
6 F0 J1 [( y+ \+ W2 W3 I霍夫变换Hough# u) g  a% Q9 p2 h
霍夫变换(Hough)是一个非常重要的检测间断点边界形状的方法。它通过将图像坐标空间变换到参数空间,来实现直线与曲线的拟合。! f# f. b1 ?# O8 M, y

( A% C0 S3 O2 ?1.直线检测6 b  E. K! |2 M: X: ~2 n; F
1.1 直线坐标参数空间2 q* z$ l7 v3 T. X! k6 J
在图像坐标空间中,经过点的直线表示为: 7 T) z8 k# ^  |' S+ o! Y
3 N/ V% D& A+ M4 |
通过的直线有无数条,且对应于不同的值。& l8 [. ?7 t" \' ]. t
+ B7 S% V! c. e" M! y1 q
如果将和视为常数,而将原本的参数a和b看作变量,则式子(1)可以表示为:! A$ `0 y/ w' ]( u$ d

) @- d0 E) m  }8 Y8 @这样就变换到了参数平面。这个变换就是直角坐标中对于点的Hough变换。
+ Y+ m. Q# H+ c" k9 M/ O& H# \& w' Z( E1 x
该直线是图像坐标空间中的点(在参数空间的唯一方程。考虑到图像坐标空间中的另一袋奶,它在参数空间中也有相应的一条直线,表示为:* e+ A! c0 J8 W: C! J
3 ^: S0 }3 S0 o! j
这条直线与点在参数空间的直线相交于一点,如图所示: 6 V: g0 A2 N& X1 p: ]: G
# p1 W2 }+ ]* s7 P5 s
! M' H! n& |& [! U
! A  x1 h. \( `# e9 U4 J& v6 {  G
图像坐标空间中过点和点的直线上的每一点在参数空间上各自对应一条直线,这些直线都相交于点,而就是图像坐标空间中点和点所确定的直线的参数。 . x  i+ z2 v; s" d. G) p3 b
反之,在参数空间相交于同一点的所有直线,在图像坐标空间都有共线的点与之对应。根据这个特性,给定图像坐标空间的一些边缘点,就可以通过Hough变换确定连接这些点的直线方程。3 Y7 k5 o2 w$ ~

) T2 l+ A, B9 _& C( H5 F! ]具体计算时,可以将参数空间视为离散的。建立一个二维累加数组,第一维的范围是图像坐标空间中直线斜率的可能范围,第二维的范围是图像坐标空间中直线截矩的可能范围。开始时初始化为0,然后对图像坐标空间的每一个前景点,将参数空间中每一个的离散值代入式子(2)中,从而计算出对应的值。每计算出一对,都将对应的数组元素加1,即。所有的计算结束之后,在参数计算表决结果中找到的最大峰值,所对应的就是源图像中共线点数目最多(共个共线点)的直线方程的参数;接下来可以继续寻找次峰值和第3峰值和第4峰值等等,它们对应于原图中共线点略少一些的直线。
. t9 H0 Z; @8 X0 T# F4 e* {: u1 u8 i8 p' z/ x1 b8 G# T- I; J$ R
注意:由于原图中的直线往往具有一定的宽度,实际上相当于多条参数极其接近的单像素宽直线,往往对应于参数空间中相邻的多个累加器。因此每找到一个当前最大的峰值点后,需要将该点及其附近点清零,以防算法检测出多条极其邻近的“假”直线。) Z. ^1 H* c% \  {

7 j( m" x& M3 D/ r对于上图的Hough变换空间情况如下图所示。 ; b) Z5 M) n; q& l. w  y
# R" N& ]5 V% g; b
% O8 y$ T5 z+ n' f

4 I5 H+ s" g- t# T8 ]" O; Q0 }这种利用二维累加器的离散方法大大简化了Hough变换的计算,参数空间上的细分程度决定了最终找到直线上点的共线精度。上述的二维累加数组A也被称为Hough矩阵。% x7 u4 t! P9 H$ b1 W3 ~  A

8 J" }4 y' y# e8 `/ o+ Q注意:使用直角坐标表示直线,当直线为一条垂直直线或者接近垂直直线时,该直线的斜率为无限大或者接近无限大,从而无法在参数空间$a-b$上表示出来。为了解决这个问题,可以采用极坐标。
2 q& S: D0 v+ y) t) l* t; S0 _( P; y" o

. S; i, x/ a) f  c+ y9 v8 x1.2 极坐标参数空间; ?: u5 d! |- W7 v/ x
极坐标中用如下参数方程表示一条直线。: `9 @( U# Z- F( h: Q7 A
6 F3 F, c$ A9 p0 @% Q8 d8 l$ v% R
其中,代表直线到原点的垂直距离,代表x轴到直线垂线的角度,取值范围为,如图所示。
+ F2 q. I7 b3 e6 k: |
& E2 N- s, O1 `5 i- v& T! A: |
- ~# M1 Q- E5 _8 h% r& |. P, y# n0 e* z0 [7 m- N9 L
与直角坐标类似,极坐标中的Hough变换也将图像坐标空间中的点变换到参数空间中。 8 z% D1 J# h  P: m* Y+ C( g9 `
在极坐标表示下,图像坐标空间中共线的点变换到参数空间中后,在参数空间都相交于同一点,此时所得到的即为所求的直线的极坐标参数。与直角坐标不同的是,用极坐标表示时,图像坐标空间的共线的两点映射到参数空间是两条正弦曲线,相交于点,如上图所示。
" s! s: Y* G6 X2 H2 C# U8 E/ w# p
' A+ W+ m) S. r6 O) t: b8 N具体计算时,与直角坐标类似,也要在参数空间中建立一个二维数组累加器A,只是取值范围不同。对于一副大小为的图像,通常的取值范围为,的取值范围为。计算方法与直角坐标系中累加器的计算方法相同,最后得到最大的A所对应的
. X6 v7 v% L! r* H% _6 B1 }) b3 `. Q+ M/ P; E1 w1 h# U. N

' u& x8 O+ ^6 D; w" }3 ?: @& \
) Q9 O) x  g- c+ N" \9 u  B
作者: ExxNEN    时间: 2020-6-3 14:51
fspecial,Hough直线检测




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2