EDA365电子论坛网

标题: 在Matlab中实现Hough变换检测直线 [打印本页]

作者: mytomorrow    时间: 2020-4-27 11:10
标题: 在Matlab中实现Hough变换检测直线

4 P' q6 Y) G# E3 R; vHough变换是图像处理中从图像中识别几何形状的基本方法之一。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 `& R01        sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');
9 t& o/ [1 R) n  J( C7 r9 u02        [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  S04        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' f09        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. S14                if(logNum > 0)5 m/ @1 K0 ~7 e+ f
15                    edgePic(i,j)=255;
4 t! N- n6 u# n* [, O16                else% J/ R3 H$ I3 W: Q3 T
17                    edgePic(i,j)=0;
+ Q! l& ?! |1 m6 g9 T0 ~8 S18                end
" E2 S5 U5 m& f; u6 c19            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% c27            for j=1:width1 `$ 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- N30                        p = round(i*cos(pi*k/180) j*sin(pi*k/180));
) M; m& s2 S) M$ Q1 v31                        if(p > 0)
$ B- L, C6 E; s& z; t32                            %npc(k,mp*2)=npc(k,mp*2) 1;
" l4 s  ]+ b) o/ p* d33                            %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];* s7 }% }6 E) Z; g
34                             10.01.05修正
/ U4 s' C8 W: Y5 K35                            npc(k,mp p)=npc(k,mp p) 1;
+ h. G% D; o% u36                            npp{k,mp p}=[npp{k,mp p},[i,j]'];
6 B5 E, n; Z8 h' S' X/ A37                        else
. E% x3 c$ }! a38                            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 ~* e41                        end6 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 O44            end3 \' @" U/ [6 D4 t0 V: ^/ d
45        end
6 r& ~0 i& `% H, e46        for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
2 l0 t, ~% G- H/ }! |, ]$ m" v) s47            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$ _: H49                    lp=npp{i,j};" [3 J+ h8 Y8 c2 Z
50                    for k=1:npc(i,j)
9 R! t% |( S' Q51                        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! n54                    end
9 l1 @4 r( I4 c6 W; e: o) L55                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 `+ F58        figure,imshow(sourcePic);
作者: NingW    时间: 2020-4-27 13:24
在Matlab中实现Hough变换检测直线




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2