EDA365电子论坛网
标题:
在Matlab中实现Hough变换检测直线
[打印本页]
作者:
mytomorrow
时间:
2020-4-27 11:10
标题:
在Matlab中实现Hough变换检测直线
4 P' q6 Y) G# E3 R; v
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。
0 a' e" I8 a; G2 R
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。
: p) z0 D9 b, K, y& [
其中先用log(laplacian of gaussian)算子检测图像边界:
0 g. J l" p* W0 Y( b" n1 y
) A, ~8 ]5 s* i2 w9 `& R
01 sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');
9 t& o/ [1 R) n J( C7 r9 u
02 [height,width,l]=size(sourcePic);
: M7 h: ?) A( g" ^4 ~
03 grayPic=zeros(height,width);
$ W/ J `3 F9 g* j( Y: s$ p6 X S
04 for i=1:height %转换成灰度图象
: Z. K" V* {6 G
05 for j=1:width
! o6 {7 h0 D- f$ ^' b
06 grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;
" ?/ i: [3 `+ I$ G; u
07 end
$ H0 ~' @. P2 C5 m4 D' V! i
08 end
& G! H; k6 f5 K' f
09 logNum=0; %log算子的计算值
6 v" v$ t0 `+ B% k8 d
10 edgePic=zeros(height,width);
; l' I1 \# q& \6 x5 h
11 for i=3:height-2 %log算子提取边界
, t' K& g2 U, z4 y
12 for j=3:width-2
T# v, {0 p0 i1 M
13 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);
) \) A0 G" C( ^- q. S
14 if(logNum > 0)
5 m/ @1 K0 ~7 e+ f
15 edgePic(i,j)=255;
4 t! N- n6 u# n* [, O
16 else
% J/ R3 H$ I3 W: Q3 T
17 edgePic(i,j)=0;
+ Q! l& ?! |1 m6 g9 T0 ~8 S
18 end
" E2 S5 U5 m& f; u6 c
19 end
& L O: w8 B+ d ^8 C
20 end
- o/ \9 n' Y) J8 f; W
21 % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面
+ V! ~, D) X7 A- q3 ?
22 ma=180; %a的值为0到180度
. l6 A: ` L7 \5 {6 c' P! s/ e
23 mp=round(sqrt(height^2 width^2)); %对应P的最大值
5 {8 `, o5 z' W" ~$ V! F. [2 F
24 npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数
+ K5 j. d! I7 T: c- u
25 npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
" S2 ?; ?: U4 J+ t0 [4 d6 N
26 for i=1:height %计算(a,p)的值,并做相应记录
/ J1 O# }* H. R' F. x% c
27 for j=1:width
1 `$ N3 ]7 I# D
28 if(edgePic(i,j)==255)
% x) T$ ?+ {1 n" _% l# ?; M
29 for k=1:ma
[6 I/ s- h; D- l, q+ ]$ O- N
30 p = round(i*cos(pi*k/180) j*sin(pi*k/180));
) M; m& s2 S) M$ Q1 v
31 if(p > 0)
$ B- L, C6 E; s& z; t
32 %npc(k,mp*2)=npc(k,mp*2) 1;
" l4 s ]+ b) o/ p* d
33 %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];
* s7 }% }6 E) Z; g
34 10.01.05修正
/ U4 s' C8 W: Y5 K
35 npc(k,mp p)=npc(k,mp p) 1;
+ h. G% D; o% u
36 npp{k,mp p}=[npp{k,mp p},[i,j]'];
6 B5 E, n; Z8 h' S' X/ A
37 else
. E% x3 c$ }! a
38 ap=abs(p) 1;
3 M* u% s9 J0 K5 B' V D
39 npc(k,ap)=npc(k,ap) 1;
# I' Z, h( h1 k2 ^
40 npp{k,ap}=[npp{k,ap},[i,j]'];
' E. o5 l1 p2 ~* e
41 end
6 c; W8 O: T5 _& v3 J$ j E" n- Z
42 end
' v( r. K& A5 r' R. p
43 end
- I7 L8 E6 A+ T- c" ~7 O
44 end
3 \' @" U/ [6 D4 t0 V: ^/ d
45 end
6 r& ~0 i& `% H, e
46 for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
2 l0 t, ~% G- H/ }! |, ]$ m" v) s
47 for j=1:mp*2
. Z/ _8 m1 j% P3 N' l+ W# q
48 if(npc(i,j) > 90) %将提取直线的阈值设为90
9 P6 a8 }4 q, m$ _: H
49 lp=npp{i,j};
" [3 J+ h8 Y8 c2 Z
50 for k=1:npc(i,j)
9 R! t% |( S' Q
51 sourcePic(lp(1,k),lp(2,k),1)=255;
. _0 }- Y: |1 I& M4 Z3 b/ m
52 sourcePic(lp(1,k),lp(2,k),2)=0;
; i/ r, t: z! P4 P V! m7 N5 J4 Y" J
53 sourcePic(lp(1,k),lp(2,k),3)=0;
! ]1 ^2 t5 ^$ t9 p H! n
54 end
9 l1 @4 r( I4 c6 W; e: o) L
55 end
( [3 V) X) e& B) A9 [' d- ]8 U
56 end
' s+ w$ V7 a) i; `3 ]- T* i
57 end
. x. W& t. n6 k( M' G3 `+ F
58 figure,imshow(sourcePic);
作者:
NingW
时间:
2020-4-27 13:24
在Matlab中实现Hough变换检测直线
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2