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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
! w2 P% ?+ a, b
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。' Y- D: U7 C, @0 y# e
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。* s, B$ l7 j# i5 Y7 Y
其中先用log(laplacian of gaussian)算子检测图像边界:
3 \, |2 B8 \: q& ?1 m8 G& u$ R' m3 \% W* ~# k8 T# X7 d. h
01        sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');
) h* g* l8 h8 N5 P# ]+ }7 t02        [height,width,l]=size(sourcePic);4 m8 d4 h" S5 x6 o. e
03        grayPic=zeros(height,width);
3 b3 Y- {0 C- l( t04        for i=1:height %转换成灰度图象
4 J. P7 `! c$ Z- L05            for j=1:width: L* }6 l# j2 k" I, R* v
06                grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;
2 f& F5 t! e, U9 D9 ~07            end6 {& f7 \6 @. Q" m$ n3 I; \
08        end( b/ w/ g4 g; n9 ?, z
09        logNum=0; %log算子的计算值
5 T/ v: Z. R3 {3 @: `5 A10        edgePic=zeros(height,width);  G) S, |' T& ~: {" P  t! q/ O
11        for i=3:height-2 %log算子提取边界: l# o$ S& r- y( C' S1 ^' k2 P
12            for j=3:width-2
$ [- E4 D8 Y7 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);% Q6 Q( h# X' l% L4 h
14                if(logNum > 0)- U9 X6 o& I3 O' C
15                    edgePic(i,j)=255;
3 R, \* {8 j4 U16                else
: L* @+ k% W; r; F17                    edgePic(i,j)=0;
3 P3 [5 B3 m- c7 \; I18                end
2 E2 x* K3 U' p2 }3 e# r  \19            end5 K! _. h0 j; f8 E+ H
20        end
0 }! |2 G4 r* K% N0 Z: ?21        % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面
2 S% i- F4 {  ?2 F' O22        ma=180; %a的值为0到180度5 o/ T6 }2 J/ p- I
23        mp=round(sqrt(height^2 width^2)); %对应P的最大值- W! k/ Y. I/ c% `0 J
24        npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数' v$ S# l; p. S2 X+ x
25        npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
. L' z) k7 @( s- K+ \4 V26        for i=1:height %计算(a,p)的值,并做相应记录+ I3 C4 v) }* g/ `( h, @% P- ]
27            for j=1:width  V! g, G$ @( F1 T" G
28                if(edgePic(i,j)==255)% B3 M; R+ d- F4 j( N4 ^
29                    for k=1:ma2 I/ ~4 L8 W/ g$ [; a: A: p7 \
30                        p = round(i*cos(pi*k/180) j*sin(pi*k/180));6 [! r: k, F( @- N: D2 F9 d9 U
31                        if(p > 0)  ^/ L* ^% t, _( K) Q4 Z2 Y
32                            %npc(k,mp*2)=npc(k,mp*2) 1;
4 U3 c& _+ u4 I0 c; E; k% y33                            %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];
# {) e. K9 {) ^# q/ Y+ g! f34                             10.01.05修正
+ {9 Y/ @( y! V* g) R2 E35                            npc(k,mp p)=npc(k,mp p) 1;; t3 m, o; J! B/ ~4 i4 |$ E$ c4 S
36                            npp{k,mp p}=[npp{k,mp p},[i,j]'];( O9 _' Y; m& c% A: r& D: g
37                        else
% l  ~) v6 k& E' V' A6 r. Q38                            ap=abs(p) 1;! ?, _6 Z/ X( l( Q/ p% v* U# {0 b
39                            npc(k,ap)=npc(k,ap) 1;- ?7 R2 T7 i9 V9 x+ z# i+ N. U
40                            npp{k,ap}=[npp{k,ap},[i,j]'];8 N0 ]$ r( u# ~  T; \
41                        end
3 r& U! v" W) {+ X7 ^42                    end
& G9 V6 x2 R  w" V" {0 Z- k9 {6 c  K43                end6 ~. g/ S+ F/ `7 A; U  c# f
44            end
8 L+ z* h5 D$ C, X6 `45        end
. G3 \  ^% A7 k1 N46        for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
' [9 ^+ {7 Z  z: f, y8 h47            for j=1:mp*2# r+ H5 x' h( ]8 _! B, u# ^
48                if(npc(i,j) > 90) %将提取直线的阈值设为90! }3 i' S( d- S1 z4 S6 t
49                    lp=npp{i,j};
/ F# \; r# m3 }! b$ ~  y50                    for k=1:npc(i,j)9 ~, }+ o% l( O
51                        sourcePic(lp(1,k),lp(2,k),1)=255;5 D. l9 H- z! V5 T
52                        sourcePic(lp(1,k),lp(2,k),2)=0;; J6 |) x) r% ?2 h2 d, m4 V4 b
53                        sourcePic(lp(1,k),lp(2,k),3)=0;
+ {, {7 p- w6 T, [  Y54                    end! e! j7 ]' B( ?, }& M. O1 t8 N$ \
55                end! O' K, w1 R3 M' }% I; {7 W
56            end
* X3 ~6 r- _0 e4 L, v  |57        end- U& }9 B" `( z1 t2 `7 ^6 }
58        figure,imshow(sourcePic);

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-22 21:47 , Processed in 0.109375 second(s), 24 queries , Gzip On.

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

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

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