|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
! w2 P% ?+ a, b
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。' Y- D: U7 C, @0 y# e
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。* s, B$ l7 j# i5 Y7 Y
其中先用log(laplacian of gaussian)算子检测图像边界:
3 \, |2 B8 \: q& ?1 m8 G& u$ R' m3 \% W* ~# k8 T# X7 d. h
01 sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');
) h* g* l8 h8 N5 P# ]+ }7 t02 [height,width,l]=size(sourcePic);4 m8 d4 h" S5 x6 o. e
03 grayPic=zeros(height,width);
3 b3 Y- {0 C- l( t04 for i=1:height %转换成灰度图象
4 J. P7 `! c$ Z- L05 for j=1:width: L* }6 l# j2 k" I, R* v
06 grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;
2 f& F5 t! e, U9 D9 ~07 end6 {& f7 \6 @. Q" m$ n3 I; \
08 end( b/ w/ g4 g; n9 ?, z
09 logNum=0; %log算子的计算值
5 T/ v: Z. R3 {3 @: `5 A10 edgePic=zeros(height,width); G) S, |' T& ~: {" P t! q/ O
11 for i=3:height-2 %log算子提取边界: l# o$ S& r- y( C' S1 ^' k2 P
12 for j=3:width-2
$ [- E4 D8 Y7 l13 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);% Q6 Q( h# X' l% L4 h
14 if(logNum > 0)- U9 X6 o& I3 O' C
15 edgePic(i,j)=255;
3 R, \* {8 j4 U16 else
: L* @+ k% W; r; F17 edgePic(i,j)=0;
3 P3 [5 B3 m- c7 \; I18 end
2 E2 x* K3 U' p2 }3 e# r \19 end5 K! _. h0 j; f8 E+ H
20 end
0 }! |2 G4 r* K% N0 Z: ?21 % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面
2 S% i- F4 { ?2 F' O22 ma=180; %a的值为0到180度5 o/ T6 }2 J/ p- I
23 mp=round(sqrt(height^2 width^2)); %对应P的最大值- W! k/ Y. I/ c% `0 J
24 npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数' v$ S# l; p. S2 X+ x
25 npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
. L' z) k7 @( s- K+ \4 V26 for i=1:height %计算(a,p)的值,并做相应记录+ I3 C4 v) }* g/ `( h, @% P- ]
27 for j=1:width V! g, G$ @( F1 T" G
28 if(edgePic(i,j)==255)% B3 M; R+ d- F4 j( N4 ^
29 for k=1:ma2 I/ ~4 L8 W/ g$ [; a: A: p7 \
30 p = round(i*cos(pi*k/180) j*sin(pi*k/180));6 [! r: k, F( @- N: D2 F9 d9 U
31 if(p > 0) ^/ L* ^% t, _( K) Q4 Z2 Y
32 %npc(k,mp*2)=npc(k,mp*2) 1;
4 U3 c& _+ u4 I0 c; E; k% y33 %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];
# {) e. K9 {) ^# q/ Y+ g! f34 10.01.05修正
+ {9 Y/ @( y! V* g) R2 E35 npc(k,mp p)=npc(k,mp p) 1;; t3 m, o; J! B/ ~4 i4 |$ E$ c4 S
36 npp{k,mp p}=[npp{k,mp p},[i,j]'];( O9 _' Y; m& c% A: r& D: g
37 else
% l ~) v6 k& E' V' A6 r. Q38 ap=abs(p) 1;! ?, _6 Z/ X( l( Q/ p% v* U# {0 b
39 npc(k,ap)=npc(k,ap) 1;- ?7 R2 T7 i9 V9 x+ z# i+ N. U
40 npp{k,ap}=[npp{k,ap},[i,j]'];8 N0 ]$ r( u# ~ T; \
41 end
3 r& U! v" W) {+ X7 ^42 end
& G9 V6 x2 R w" V" {0 Z- k9 {6 c K43 end6 ~. g/ S+ F/ `7 A; U c# f
44 end
8 L+ z* h5 D$ C, X6 `45 end
. G3 \ ^% A7 k1 N46 for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
' [9 ^+ {7 Z z: f, y8 h47 for j=1:mp*2# r+ H5 x' h( ]8 _! B, u# ^
48 if(npc(i,j) > 90) %将提取直线的阈值设为90! }3 i' S( d- S1 z4 S6 t
49 lp=npp{i,j};
/ F# \; r# m3 }! b$ ~ y50 for k=1:npc(i,j)9 ~, }+ o% l( O
51 sourcePic(lp(1,k),lp(2,k),1)=255;5 D. l9 H- z! V5 T
52 sourcePic(lp(1,k),lp(2,k),2)=0;; J6 |) x) r% ?2 h2 d, m4 V4 b
53 sourcePic(lp(1,k),lp(2,k),3)=0;
+ {, {7 p- w6 T, [ Y54 end! e! j7 ]' B( ?, }& M. O1 t8 N$ \
55 end! O' K, w1 R3 M' }% I; {7 W
56 end
* X3 ~6 r- _0 e4 L, v |57 end- U& }9 B" `( z1 t2 `7 ^6 }
58 figure,imshow(sourcePic); |
|