|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
- k3 j4 f& `# E4 C1 I; @
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。- E6 F( A% ]& {, P
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。
5 j+ i0 ]6 r- g; s! I9 h其中先用log(laplacian of gaussian)算子检测图像边界:4 |0 _8 J2 }, j3 O( ?% {
) x% k# p) K8 L p. R% r' B* Z) }
01 sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');& h6 ]1 G m8 j4 {
02 [height,width,l]=size(sourcePic);
. U7 f% ^: y7 ~3 B03 grayPic=zeros(height,width);
$ u6 o0 J. w. [0 r* q04 for i=1:height %转换成灰度图象1 Z% K+ z+ a" {' }9 `5 c
05 for j=1:width7 b9 `# ?+ z5 A, p2 n
06 grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;
3 o! ~# s5 E( f) @1 M; `07 end7 T: _/ r0 |1 y
08 end
5 {* {& k$ h: c& y09 logNum=0; %log算子的计算值0 W6 ]: o6 p, G1 z" W7 E2 b' z
10 edgePic=zeros(height,width);
& D' N; m2 V7 C* ~, z z11 for i=3:height-2 %log算子提取边界- q7 p3 _& d( Y- _6 [7 J
12 for j=3:width-2
' {9 A* [0 |( Q: B) d7 H13 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);5 B2 n; K7 H5 S* [; g; Z' F3 Q9 w5 u
14 if(logNum > 0)4 T, b( Y5 z' \3 M& c g
15 edgePic(i,j)=255;' @5 S, O$ {+ O
16 else2 {+ x, m4 I( X
17 edgePic(i,j)=0;) Z4 P+ _4 ]1 _" Q; q) m1 E1 g
18 end
) w. e) J0 O2 c+ r19 end
- @4 B# W& p0 c9 B# i4 ^* }) }2 R20 end
1 S2 f: t! c$ S& g- e7 }. d1 E21 % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面0 s- ~, \! j# { G9 i ]
22 ma=180; %a的值为0到180度
, K1 ^ @( z P6 D$ \23 mp=round(sqrt(height^2 width^2)); %对应P的最大值
3 u; `( z$ J: P24 npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数
3 L* u$ g7 @! L( u V v( p25 npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标: i' s# \( W7 w4 M& h5 H$ n: v
26 for i=1:height %计算(a,p)的值,并做相应记录
) H" `8 h4 G: _ s27 for j=1:width
4 m+ v4 E% x* V1 L28 if(edgePic(i,j)==255)
5 V, n9 z% B ^$ B @9 ]29 for k=1:ma
8 N; \. ~ o& h. I30 p = round(i*cos(pi*k/180) j*sin(pi*k/180));4 H# k% ~; G4 r2 Y& ^4 i! f
31 if(p > 0)
4 K- V2 h Y8 B$ A f% D32 %npc(k,mp*2)=npc(k,mp*2) 1;
5 n4 d4 n. C5 y% x# V4 p33 %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];( X4 F d8 o: p- \% I
34 10.01.05修正
# p! t# t. a; X, f% z, v- v35 npc(k,mp p)=npc(k,mp p) 1;
( M5 I+ Y, k0 Z: [. N; K! R36 npp{k,mp p}=[npp{k,mp p},[i,j]'];
. [8 I/ E. @0 b% I" W" N1 }/ F37 else6 K- F! t% h4 ^% D( U4 p8 g
38 ap=abs(p) 1;
6 X* B" M, y6 q6 T( A39 npc(k,ap)=npc(k,ap) 1;' }3 C5 v7 T9 E" ?* l8 T/ @
40 npp{k,ap}=[npp{k,ap},[i,j]'];
+ l6 ]! O6 o: y5 p: V+ ?41 end
- f! W% }, I: i. d. X( B4 r/ K42 end
" A* @' d- z F( P0 o! v- ^9 v43 end& K4 z9 K0 `0 i, F' O5 U
44 end
+ d/ f, S7 S7 n/ s3 z. |& N5 @# g45 end! V0 r- p% r1 D5 h
46 for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
2 j, p# [- A+ t; a3 V! y1 N& H47 for j=1:mp*2. A( N% _+ W( _2 N
48 if(npc(i,j) > 90) %将提取直线的阈值设为90% J5 I6 u# D0 Z7 W( I
49 lp=npp{i,j};) l+ G8 j T8 z* ]
50 for k=1:npc(i,j)
. }& O$ |* H0 T3 R) D8 p- ^51 sourcePic(lp(1,k),lp(2,k),1)=255;5 Y9 l* J* _2 W. U* c
52 sourcePic(lp(1,k),lp(2,k),2)=0;
) ~ ?1 U0 }# K2 V9 p) b53 sourcePic(lp(1,k),lp(2,k),3)=0;
2 M6 Q7 F# d( f5 `7 S' h+ H4 P% }54 end
9 y3 Z: Z1 _# t u5 |- D4 ~# m/ p% S55 end
' [2 q* f$ W7 Y5 y" u: Z56 end
1 N o( V2 O* ]) z; k( k57 end2 [4 v: \1 l" K6 ~/ k, Y& S; Q
58 figure,imshow(sourcePic); |
|