|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
% w/ y& f5 I" U: {$ S. k! [' oHough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。
1 g) ]3 t- B4 w5 {% x+ c下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。 C' |. U& y) b
其中先用log(laplacian of gaussian)算子检测图像边界:
" e8 b5 i8 p9 s( @$ ]& t* E& [' M- q2 P0 i; A% P8 d- y
01 sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');
) @1 I) H$ u/ G3 x: f; t02 [height,width,l]=size(sourcePic);/ W% e7 ]0 {. i& L4 p& { I# Q. D6 r
03 grayPic=zeros(height,width);/ o* ~. c7 a# ~( d6 C
04 for i=1:height %转换成灰度图象
# s8 X' B' m+ ^( ^- x3 C1 B05 for j=1:width
9 Y% R8 ~* `0 B; b$ q+ K7 e06 grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;
4 N' k3 ~ \+ I" V. b. B- {7 f07 end
+ V& A& l8 v+ s ?, E08 end
: w' F/ k, F- X9 r9 ~- z09 logNum=0; %log算子的计算值
* g. l$ @" ^3 {6 \, ^, b$ J u" l10 edgePic=zeros(height,width);
9 Z8 r3 G T; ~- H% q11 for i=3:height-2 %log算子提取边界4 h& W) |1 y; J4 C o
12 for j=3:width-2
a( S5 F5 r" K; M5 m13 logNum=16*grayPic(i,j)-grayPic(i-2,j)-grayPic(i-1,j-1)-2*grayPic(i-1,j)-grayPic(i-1,j 1)-grayPic(i,j-2)-2*grayPic(i,j-1)-2*grayPic(i,j 1)-grayPic(i,j 2)-grayPic(i 1,j-1)-2*grayPic(i 1,j)-grayPic(i 1,j 1)-grayPic(i 2,j);
# s- e% W5 x, k9 }+ ~, r14 if(logNum > 0): a$ z' ~2 j$ \2 w3 c. D( I
15 edgePic(i,j)=255;
: t( W4 U1 ?3 b16 else
" R/ a( V4 e# R4 U q! ^17 edgePic(i,j)=0;
. ^+ l; Z2 {; h18 end
+ C# n9 g( p4 i4 e19 end
- \# q$ c) C4 P/ y1 b20 end
, r8 m; M# M% }, _4 N; g0 _21 % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面# y% @$ [( W6 [( C, i7 w U8 }
22 ma=180; %a的值为0到180度+ _0 R0 S" l% z9 M. `3 J( v
23 mp=round(sqrt(height^2 width^2)); %对应P的最大值
/ ]' d0 ^2 s" p5 Q24 npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数" K4 L$ [+ y ?8 @" y' k
25 npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
' v% U& i+ ?+ m9 {+ `26 for i=1:height %计算(a,p)的值,并做相应记录; P6 L6 z1 [% i* W- r( y {
27 for j=1:width
6 N0 c6 B* v3 u$ z5 {* P28 if(edgePic(i,j)==255) J3 w6 Q/ j- r Q( x
29 for k=1:ma
. X1 m4 Q3 }+ Z( \9 J' H. {$ `30 p = round(i*cos(pi*k/180) j*sin(pi*k/180));
( C2 U6 m( s x! O( |31 if(p > 0)( }2 U1 R; m9 D1 y3 {/ Q
32 %npc(k,mp*2)=npc(k,mp*2) 1;4 U1 X3 {5 Q, U# g% N" ~
33 %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];7 v) ^* ^! ~' i
34 10.01.05修正& \3 m/ V* r; Z! v; C! x5 y- G
35 npc(k,mp p)=npc(k,mp p) 1;
) R; b* q$ o7 l& C/ ~- ^, S% @36 npp{k,mp p}=[npp{k,mp p},[i,j]'];
: T% R/ \# [, T2 O( P6 E& s37 else
7 x7 ]3 [( M' a3 O) p38 ap=abs(p) 1;
+ L3 \2 y1 c& F! E, z* j3 c+ P# U3 f39 npc(k,ap)=npc(k,ap) 1;" x) s1 J2 Q0 B* E( c
40 npp{k,ap}=[npp{k,ap},[i,j]'];8 L( i2 w& H6 ]3 d5 Z+ s- B5 J1 g
41 end
/ Q# E! R+ ]; q! Q' X42 end
9 E4 X) O. E2 }; w% i43 end0 S1 U0 i I1 g+ ? ~5 f
44 end
+ a( N$ x$ ?3 Y2 H- l8 J7 D45 end
- L$ i" @" l7 T5 r. j5 Y46 for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
5 t" ^% _+ A( Y47 for j=1:mp*2
- M, x \9 O+ i6 }48 if(npc(i,j) > 90) %将提取直线的阈值设为90" T6 m& b$ u$ p- r% a
49 lp=npp{i,j};
& I) b3 E* Y- ]- J$ H5 @& D50 for k=1:npc(i,j)
7 ?: o, S2 }. J51 sourcePic(lp(1,k),lp(2,k),1)=255;, G7 N7 R3 V8 J# L
52 sourcePic(lp(1,k),lp(2,k),2)=0;. W. a, h; H3 v7 s5 V
53 sourcePic(lp(1,k),lp(2,k),3)=0;
( Q: s: U. M( r! u6 r" T54 end
0 O3 Q l8 t6 F2 I6 C* P55 end9 [1 v9 r, T( o$ ^5 @* u
56 end
d& o# \" `' ~ t0 i57 end
3 I' d7 I* _; e8 _58 figure,imshow(sourcePic); |
|