|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
8 s% z% K, X" S6 \
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。6 A) Y7 {5 V, Q2 t8 s
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。
) i7 W* P5 v% d其中先用log(laplacian of gaussian)算子检测图像边界:
( k$ y$ E9 I! X p& c$ F
, t$ |3 T, }' Q2 `. [; w; R01 sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');
9 h2 N8 k( D3 G: B6 @3 E6 b02 [height,width,l]=size(sourcePic);
/ B; K* \0 A2 s3 \" T03 grayPic=zeros(height,width);
8 k1 E& K7 q: H04 for i=1:height %转换成灰度图象; A7 p7 Q! \# x6 _# W" m
05 for j=1:width
+ e: N8 G0 t8 M, J06 grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;2 t4 U8 G4 @: f x8 S& C8 p
07 end" j5 I+ E8 E1 l/ V: g. b3 T3 V) s
08 end
& f7 m4 _+ S) w) i$ X* r1 C09 logNum=0; %log算子的计算值. U0 a: C8 ], Z
10 edgePic=zeros(height,width);
6 e6 W4 |6 q5 H( q7 {4 _11 for i=3:height-2 %log算子提取边界' [8 M5 b0 y$ J2 `
12 for j=3:width-2
! ~$ B3 a8 m& Q6 l& }6 n! F13 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);& H p' z' C( i/ ]7 b3 W5 h
14 if(logNum > 0)+ P# w! Z: D3 [
15 edgePic(i,j)=255;( x7 U8 w" S4 Z. L5 W: i2 i
16 else2 k8 {9 ~& G" G% t6 \$ m7 ^
17 edgePic(i,j)=0;
Q# g1 R# S7 o! W7 }; O% E6 v( i18 end
. I+ ?" N$ h# j3 H; ]19 end) J4 m) _8 Z* X
20 end
. O9 B0 l0 I* o" i' [21 % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面0 y8 G B. H+ B/ J- g
22 ma=180; %a的值为0到180度/ [! W' F ^5 F9 |1 D, A- h5 i) A
23 mp=round(sqrt(height^2 width^2)); %对应P的最大值3 d7 Z2 p# {/ Y6 @
24 npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数
4 H2 ]5 t8 D8 Y0 F- V25 npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
6 }7 _( g+ ~9 `* }26 for i=1:height %计算(a,p)的值,并做相应记录
3 n: B# e' b9 H7 y0 o4 s. X4 W27 for j=1:width
! Q0 h- ?: N8 |' @- h6 C5 f* ], |. }28 if(edgePic(i,j)==255)
' D/ Y! m7 N4 [1 V2 M1 j; c/ y29 for k=1:ma
r( j4 V& d+ G' J30 p = round(i*cos(pi*k/180) j*sin(pi*k/180));! k9 }3 X! r2 p0 v. {5 ^: |9 i
31 if(p > 0)2 X4 I7 q S/ ^( P* e& f. ^, Z8 X
32 %npc(k,mp*2)=npc(k,mp*2) 1;
& \* d3 o# V& u3 u4 ^33 %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];* J' f5 ]3 H: e( X
34 10.01.05修正
1 }. y8 I7 z3 J1 n/ q5 O35 npc(k,mp p)=npc(k,mp p) 1;4 _+ o/ u/ | B" j1 S9 Q
36 npp{k,mp p}=[npp{k,mp p},[i,j]'];/ [$ J; d. Q+ g& J' w( k8 _1 [3 Y1 U
37 else
2 g& ?$ N/ N* c1 }6 {5 q38 ap=abs(p) 1;
% }- P6 u- x5 i9 l39 npc(k,ap)=npc(k,ap) 1;
$ n( q% f g. R6 N8 H40 npp{k,ap}=[npp{k,ap},[i,j]'];2 j! Y8 L) k) v5 Y! c4 Y. D
41 end8 |* ^$ B$ s; q
42 end1 j2 r2 ?: h9 `
43 end
! m$ ]$ `& o) q1 |, N44 end
+ i. g M: e7 q* Q$ X3 s; ^7 M2 Z) o* w45 end- k0 K' M: \1 ~
46 for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
/ b# G) X" B0 B5 T K/ s47 for j=1:mp*25 b3 t \3 m9 U; _6 Z; I& I0 ~8 N
48 if(npc(i,j) > 90) %将提取直线的阈值设为90+ o# t/ R3 J; J
49 lp=npp{i,j};
2 p5 e: P, |+ E. q: |! T50 for k=1:npc(i,j)
& ~0 T6 Y- V M$ k51 sourcePic(lp(1,k),lp(2,k),1)=255;
2 F( Z3 F8 s* U9 h52 sourcePic(lp(1,k),lp(2,k),2)=0;' _- `# }* H6 u) L1 V6 I, c/ m
53 sourcePic(lp(1,k),lp(2,k),3)=0;
! N" A% j1 ^# B x0 O54 end: @$ _0 V1 x: a; P" N
55 end8 x: b$ I9 ]) h4 v" | G% q0 }
56 end5 T4 c- T1 Q- T6 w0 X7 R6 } w
57 end
& E6 L) g7 ?' z/ |58 figure,imshow(sourcePic); |
|