找回密码
 注册
关于网站域名变更的通知
查看: 441|回复: 1
打印 上一主题 下一主题

在Matlab中实现Hough变换检测直线

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-27 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
$ r( }2 L' ^9 D
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。
) p; g$ a) M. L4 _1 P$ z0 B下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。
& R* \0 v# p0 g& c+ f& f6 u其中先用log(laplacian of gaussian)算子检测图像边界:; H, e- }# P) D: c
! r4 u) R! J* G: P
01        sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');* S( Q" E& o3 r) Y3 V: f
02        [height,width,l]=size(sourcePic);8 A' o! w- V0 b5 r' D$ O: c
03        grayPic=zeros(height,width);4 B) h  K7 C8 u* a! J/ A
04        for i=1:height %转换成灰度图象8 ?) g8 O: V' L
05            for j=1:width: f+ H; h, I+ a
06                grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;0 s0 u$ S. v4 r4 w
07            end
4 D$ L# }( ~  ?. ^! V1 Y3 ]7 E08        end1 V6 h) I, q. |) c/ Z# o
09        logNum=0; %log算子的计算值& F. l$ C2 o$ s& x% I8 r6 t
10        edgePic=zeros(height,width);
4 d$ G: v4 A+ F0 D7 [' K% t2 r11        for i=3:height-2 %log算子提取边界
  Z7 ?) ^4 _' s3 @12            for j=3:width-2
+ ?  i1 [7 a( `. a+ J$ 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);
* `' _* R! c! g14                if(logNum > 0)
0 w% ]0 o6 U1 O# j( I15                    edgePic(i,j)=255;* G0 p8 X, M; m. x& Y
16                else# d# A1 a# y# n- J% x1 T
17                    edgePic(i,j)=0;
7 ]4 j' N% q- c7 W( a# L- {+ @18                end% b4 z- M6 L6 k' t
19            end+ F% _; ]  M7 A* Z3 `0 Q+ z) r
20        end& c6 _% i& g- u& \% V. |
21        % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面
! s1 g* L) Q$ y5 g' Y22        ma=180; %a的值为0到180度; Q4 k  E# ~7 E" ~# u- t
23        mp=round(sqrt(height^2 width^2)); %对应P的最大值% s9 E0 O9 S+ I1 R6 b  E
24        npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数
/ s0 W; |4 |2 @, z' I25        npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标0 V) s$ [4 z5 s1 g4 p( E. H
26        for i=1:height %计算(a,p)的值,并做相应记录+ e) z. C6 a/ z' O; `
27            for j=1:width! ?3 G* M- B" S, v
28                if(edgePic(i,j)==255): q" Z3 r1 [0 \% K- b, @7 Z6 P; a
29                    for k=1:ma
+ H# }: O9 S& D; c30                        p = round(i*cos(pi*k/180) j*sin(pi*k/180));$ S0 t: W  b+ g  M8 X) ?5 x# `
31                        if(p > 0)9 X- W+ m6 F& q. B
32                            %npc(k,mp*2)=npc(k,mp*2) 1;. P/ o+ M/ X% Z5 ~) F
33                            %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];6 ]  f. `& j/ M! v5 V
34                             10.01.05修正
9 ~. Q# R8 [' ^' n0 T0 j& H35                            npc(k,mp p)=npc(k,mp p) 1;
9 B. ^/ X( y6 W! j- F. V( y* r36                            npp{k,mp p}=[npp{k,mp p},[i,j]'];; m% V6 U1 x9 O5 q0 a" W( I' L3 A
37                        else
: e: h. p' {% X& ?4 |# E  L38                            ap=abs(p) 1;
1 T8 @) q% S1 ?+ L* ~! }39                            npc(k,ap)=npc(k,ap) 1;/ j2 ~* R7 p' G8 _# T' z
40                            npp{k,ap}=[npp{k,ap},[i,j]'];
/ ?( e* d  j8 b8 j; a6 S- O41                        end' _: L0 v- E, s; }  t4 S! l
42                    end7 N  W) t8 S1 i- j6 L' A
43                end
# q, l" @7 \. o% W* p9 y" L8 l44            end$ N- c! d0 Z0 H( v+ b# S1 P
45        end; `# P" Q/ X1 l7 x& K; C6 c/ s
46        for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
* Y% [+ r/ {3 ?47            for j=1:mp*2
5 N5 J$ L) R# v& _48                if(npc(i,j) > 90) %将提取直线的阈值设为90) h0 B' p8 Q1 V7 H: j
49                    lp=npp{i,j};
- o' L* B& N! ]1 u; p50                    for k=1:npc(i,j)4 X# R- U  ?- u  O4 O4 h$ E
51                        sourcePic(lp(1,k),lp(2,k),1)=255;
" [+ U7 j! W9 x% F52                        sourcePic(lp(1,k),lp(2,k),2)=0;
6 C( J) U# ?* R9 ?- p5 T  Z$ q53                        sourcePic(lp(1,k),lp(2,k),3)=0;
3 t' \. Q) C7 \8 i- J7 Y54                    end0 S. q7 h3 d/ [% b. f* ~
55                end- E( {! L% c4 X# d" I
56            end' C8 _- Y7 G9 S& Q: C' F
57        end
4 g' G2 t  |7 m" N. b8 r& }2 Y58        figure,imshow(sourcePic);

该用户从未签到

2#
发表于 2020-4-27 13:24 | 只看该作者
在Matlab中实现Hough变换检测直线
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-4 11:08 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表