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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

& E& j3 B6 y8 C* a2 ?. r; N, W9 R# QHough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。, p' A9 s' G6 s7 |! B$ f
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。& A, h7 ^( t( k2 S5 n9 x# J5 w) I" j2 g
其中先用log(laplacian of gaussian)算子检测图像边界:
) R! }8 \) Z& m) R+ x7 K6 p1 B& r8 @) K9 y* H0 @3 s
01        sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');2 T" j7 B+ k* l7 s
02        [height,width,l]=size(sourcePic);- e% z6 _& U1 x9 I- V# _
03        grayPic=zeros(height,width);
- m+ Y* W. ]9 w* a4 ~04        for i=1:height %转换成灰度图象
2 S6 @- y9 T9 }( O6 e2 X7 d05            for j=1:width
( `0 R3 g# h! m' {06                grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;
  k$ \' U8 @& G07            end
6 f# F( U0 y8 Z  @$ u# @! W2 `& z08        end9 K& A( [( v) j5 n/ I0 S
09        logNum=0; %log算子的计算值5 r. e3 W0 X7 E/ s7 A$ }
10        edgePic=zeros(height,width);8 R. t) Y3 Q7 ~- I3 q
11        for i=3:height-2 %log算子提取边界. C, r3 U- h: m
12            for j=3:width-2
* J" ^4 c5 M! z' V: `$ a; `% `. p2 F13                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);
; V* u- ]( @5 O6 L* s14                if(logNum > 0)+ ]8 ^! L, l4 k0 G: z5 N4 U5 C
15                    edgePic(i,j)=255;
. E- m# y: t" q" f( C# s* S16                else
7 |6 e2 W7 A) u4 O17                    edgePic(i,j)=0;
" p. u% w& k; O& s, a2 ]" O0 ~18                end
, p. z6 a: V. D! w19            end- |, c) {' [; U' J1 J1 C
20        end
1 j6 Y  e* H% _3 {) N21        % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面9 Z6 U; C* y/ @5 j- A
22        ma=180; %a的值为0到180度
( ?4 J# w3 N1 @' F' k& B23        mp=round(sqrt(height^2 width^2)); %对应P的最大值
: n4 K# x6 u0 O+ ^, j; k/ I7 Y24        npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数+ {; f. E' u8 B" b. \; P/ ?. r
25        npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
& ?4 p  Y) G3 K7 X, q) }26        for i=1:height %计算(a,p)的值,并做相应记录3 v2 D+ k$ Z% y8 x" ~; {1 n
27            for j=1:width
1 o( M# A9 M) s/ N28                if(edgePic(i,j)==255)5 e1 g5 g; y( N, @+ P* X
29                    for k=1:ma
; W1 P4 _; `, j- u; o7 t7 N' b# k30                        p = round(i*cos(pi*k/180) j*sin(pi*k/180));, C# c, e. F- L- h, r
31                        if(p > 0)
# T: v8 s9 P/ @+ V3 ?* b4 f6 n32                            %npc(k,mp*2)=npc(k,mp*2) 1;. M- S1 o* |$ _' _4 f( B4 f
33                            %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];
( C6 X. \6 Q5 n8 R' I34                             10.01.05修正5 B: j7 L/ v) i3 g
35                            npc(k,mp p)=npc(k,mp p) 1;
8 L/ F& Q6 J4 t+ L$ D- Z36                            npp{k,mp p}=[npp{k,mp p},[i,j]'];
( r. X* o; {9 F" E$ H( l( }37                        else
7 m0 n, F' P& d, G( c5 y4 e38                            ap=abs(p) 1;
' z. W1 R: L! W  w- y0 r6 [1 g39                            npc(k,ap)=npc(k,ap) 1;8 T' I: e6 d0 ]# z4 S! L) g: T. V
40                            npp{k,ap}=[npp{k,ap},[i,j]'];
3 D3 m7 |: J, y+ g: N( e41                        end
' b5 R% p2 S1 v" n4 _0 \/ j& `4 W. z42                    end( Q/ a& q( r$ J: g
43                end5 D- \  ^/ U+ ^7 p' a
44            end$ S- f7 @& L* p) A& c# m
45        end
; E- {7 `6 e: Q5 j9 |46        for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
& ]/ I1 d8 r' b- h; L) G# ?: ?47            for j=1:mp*2& n( V3 p& m! O6 S3 E# y
48                if(npc(i,j) > 90) %将提取直线的阈值设为908 ?) S- P7 @4 `: C* O' Y
49                    lp=npp{i,j};
; p' J: h7 k3 ?, j2 g50                    for k=1:npc(i,j)
, j+ w: O0 q  G2 K9 O. N" T51                        sourcePic(lp(1,k),lp(2,k),1)=255;
" U; Z% S9 _- \9 G1 j# _& R1 ]52                        sourcePic(lp(1,k),lp(2,k),2)=0;
5 a8 p9 O: R+ Q& _3 R0 N8 k4 C; E53                        sourcePic(lp(1,k),lp(2,k),3)=0;
4 y7 m0 y' X$ ?2 m4 D54                    end
% Z/ H: }8 G3 y/ d1 {; g# k55                end& E6 x, }( p: M5 f, q7 I. V3 o
56            end# I1 y4 U& l) c1 t# }
57        end
6 O  w) u9 n  L7 ~- K58        figure,imshow(sourcePic);

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-22 19:03 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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