|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
3 \& B, {. c/ ~6 W4 Z% K
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。: b& K }8 x7 f/ t8 [2 @
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。! g! ?7 Z* n- {5 ]
其中先用log(laplacian of gaussian)算子检测图像边界:7 X1 u# L3 P/ _
# ]9 @- s7 O5 ?01 sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');
* H' O5 \+ G4 B* ~% {, m02 [height,width,l]=size(sourcePic);
5 y7 E# L& I) C6 Q: x5 E+ S03 grayPic=zeros(height,width);
8 }) H) Q8 C0 D6 C! [4 P04 for i=1:height %转换成灰度图象! N; g4 q* |/ f; Q# S6 {' Q9 N* L
05 for j=1:width
6 L- h n2 d9 Y, b" D8 _06 grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;
3 P; w" j2 t+ ]: h4 Q J. G07 end
! z& b; `0 Z7 Y3 l4 i- p08 end
1 M9 w1 M& j* k% e" K' i0 z09 logNum=0; %log算子的计算值
6 \! N7 w# \2 {- q) X7 w1 ?10 edgePic=zeros(height,width);- c% h& {$ C' ~% X. d# \) f B* n( Y
11 for i=3:height-2 %log算子提取边界
}1 C6 v1 L0 R7 D# i# V# L5 K7 d12 for j=3:width-2
: Q2 H( ^( e9 w- y13 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);' ^# L8 R' s$ J+ `
14 if(logNum > 0)
8 a) \! k0 A# G3 O8 ?0 I" T* G15 edgePic(i,j)=255;
& T& r: F v, }; y4 V9 Y16 else
" Q( h9 v4 n% D* w( t17 edgePic(i,j)=0;( T7 s6 M: X) O$ s- M# K1 w
18 end" g8 E2 e- R7 O$ O$ G. D- m
19 end/ {, {* h; Z8 S$ {: T
20 end3 y! R" r j# J8 q# |3 U, U
21 % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面
* A5 P$ y8 ?2 e' L1 T: ? b22 ma=180; %a的值为0到180度% l9 D) Z' U j0 ]8 p3 h3 x
23 mp=round(sqrt(height^2 width^2)); %对应P的最大值
e- S+ m4 {/ o' b w! ~- Z24 npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数# U2 {1 v8 f$ D6 J
25 npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
9 c% E4 Y1 H! z. ~$ n( N& K. d$ C26 for i=1:height %计算(a,p)的值,并做相应记录) q6 u5 g9 ?* [$ L. ^/ m; J6 X
27 for j=1:width
+ ]2 a# P$ _0 `6 W4 j28 if(edgePic(i,j)==255)
0 j" @, j' j* }29 for k=1:ma
* R. y/ K' M" R. K& q30 p = round(i*cos(pi*k/180) j*sin(pi*k/180));
1 n$ x; v; T$ ^/ d; k/ i* V; N; U31 if(p > 0)9 n& G7 t. C: ~; q" r6 ^) c
32 %npc(k,mp*2)=npc(k,mp*2) 1;
# R) {9 T; O3 ]. r ]5 O3 q33 %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];
9 o; f* [: e8 c, ^34 10.01.05修正
, Q: F6 h8 a& m" t35 npc(k,mp p)=npc(k,mp p) 1;
( m0 W) ?! Z% n& o1 _) B36 npp{k,mp p}=[npp{k,mp p},[i,j]'];! q. _" B, @; D& E* ?$ M
37 else
) t' P" O" r5 K# W/ _38 ap=abs(p) 1;& Q7 K* i, o5 Q+ n
39 npc(k,ap)=npc(k,ap) 1;
8 y6 G* f+ }6 X# H40 npp{k,ap}=[npp{k,ap},[i,j]'];/ V, t3 K F! r
41 end$ h5 H" t9 Q- y( E9 ^
42 end* j' o/ ]/ G) F& I
43 end0 ?& J8 g( s1 S( d. I* z# `
44 end1 k" x0 V3 H9 _) e* Z# z
45 end' C# N T: a0 c' V
46 for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
) G2 J+ R* V# v/ A47 for j=1:mp*2
8 s* E. G& E( j, G: E) C- H6 E48 if(npc(i,j) > 90) %将提取直线的阈值设为90
0 ~5 o; [7 W* K( @! z; C6 S& v49 lp=npp{i,j};" b, H3 e% c6 i; p* g6 ?
50 for k=1:npc(i,j)
/ m" J( w/ w$ y4 i7 m( P* O51 sourcePic(lp(1,k),lp(2,k),1)=255;! w1 R" ?: ]# _8 { D3 Z
52 sourcePic(lp(1,k),lp(2,k),2)=0;9 K, Z- a, F# }5 @- G+ h" e
53 sourcePic(lp(1,k),lp(2,k),3)=0;+ @/ Z! a! }" M6 t& u7 Q
54 end
' B5 I& i$ _6 M; F% C7 l55 end% o K+ i$ b4 B# ?1 C2 M! ?4 o
56 end
9 V9 @ A. U }# z57 end; g9 m3 J0 X9 y' U3 b# A8 p- F
58 figure,imshow(sourcePic); |
|