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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
3 \& B, {. c/ ~6 W4 Z% K
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。: b& K  }8 x7 f/ t8 [2 @
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。! g! ?7 Z* n- {5 ]
其中先用log(laplacian of gaussian)算子检测图像边界:7 X1 u# L3 P/ _

# ]9 @- s7 O5 ?01        sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');
* H' O5 \+ G4 B* ~% {, m02        [height,width,l]=size(sourcePic);
5 y7 E# L& I) C6 Q: x5 E+ S03        grayPic=zeros(height,width);
8 }) H) Q8 C0 D6 C! [4 P04        for i=1:height %转换成灰度图象! N; g4 q* |/ f; Q# S6 {' Q9 N* L
05            for j=1:width
6 L- h  n2 d9 Y, b" D8 _06                grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;
3 P; w" j2 t+ ]: h4 Q  J. G07            end
! z& b; `0 Z7 Y3 l4 i- p08        end
1 M9 w1 M& j* k% e" K' i0 z09        logNum=0; %log算子的计算值
6 \! N7 w# \2 {- q) X7 w1 ?10        edgePic=zeros(height,width);- c% h& {$ C' ~% X. d# \) f  B* n( Y
11        for i=3:height-2 %log算子提取边界
  }1 C6 v1 L0 R7 D# i# V# L5 K7 d12            for j=3:width-2
: Q2 H( ^( e9 w- y13                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);' ^# L8 R' s$ J+ `
14                if(logNum > 0)
8 a) \! k0 A# G3 O8 ?0 I" T* G15                    edgePic(i,j)=255;
& T& r: F  v, }; y4 V9 Y16                else
" Q( h9 v4 n% D* w( t17                    edgePic(i,j)=0;( T7 s6 M: X) O$ s- M# K1 w
18                end" g8 E2 e- R7 O$ O$ G. D- m
19            end/ {, {* h; Z8 S$ {: T
20        end3 y! R" r  j# J8 q# |3 U, U
21        % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面
* A5 P$ y8 ?2 e' L1 T: ?  b22        ma=180; %a的值为0到180度% l9 D) Z' U  j0 ]8 p3 h3 x
23        mp=round(sqrt(height^2 width^2)); %对应P的最大值
  e- S+ m4 {/ o' b  w! ~- Z24        npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数# U2 {1 v8 f$ D6 J
25        npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
9 c% E4 Y1 H! z. ~$ n( N& K. d$ C26        for i=1:height %计算(a,p)的值,并做相应记录) q6 u5 g9 ?* [$ L. ^/ m; J6 X
27            for j=1:width
+ ]2 a# P$ _0 `6 W4 j28                if(edgePic(i,j)==255)
0 j" @, j' j* }29                    for k=1:ma
* R. y/ K' M" R. K& q30                        p = round(i*cos(pi*k/180) j*sin(pi*k/180));
1 n$ x; v; T$ ^/ d; k/ i* V; N; U31                        if(p > 0)9 n& G7 t. C: ~; q" r6 ^) c
32                            %npc(k,mp*2)=npc(k,mp*2) 1;
# R) {9 T; O3 ]. r  ]5 O3 q33                            %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];
9 o; f* [: e8 c, ^34                             10.01.05修正
, Q: F6 h8 a& m" t35                            npc(k,mp p)=npc(k,mp p) 1;
( m0 W) ?! Z% n& o1 _) B36                            npp{k,mp p}=[npp{k,mp p},[i,j]'];! q. _" B, @; D& E* ?$ M
37                        else
) t' P" O" r5 K# W/ _38                            ap=abs(p) 1;& Q7 K* i, o5 Q+ n
39                            npc(k,ap)=npc(k,ap) 1;
8 y6 G* f+ }6 X# H40                            npp{k,ap}=[npp{k,ap},[i,j]'];/ V, t3 K  F! r
41                        end$ h5 H" t9 Q- y( E9 ^
42                    end* j' o/ ]/ G) F& I
43                end0 ?& J8 g( s1 S( d. I* z# `
44            end1 k" x0 V3 H9 _) e* Z# z
45        end' C# N  T: a0 c' V
46        for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
) G2 J+ R* V# v/ A47            for j=1:mp*2
8 s* E. G& E( j, G: E) C- H6 E48                if(npc(i,j) > 90) %将提取直线的阈值设为90
0 ~5 o; [7 W* K( @! z; C6 S& v49                    lp=npp{i,j};" b, H3 e% c6 i; p* g6 ?
50                    for k=1:npc(i,j)
/ m" J( w/ w$ y4 i7 m( P* O51                        sourcePic(lp(1,k),lp(2,k),1)=255;! w1 R" ?: ]# _8 {  D3 Z
52                        sourcePic(lp(1,k),lp(2,k),2)=0;9 K, Z- a, F# }5 @- G+ h" e
53                        sourcePic(lp(1,k),lp(2,k),3)=0;+ @/ Z! a! }" M6 t& u7 Q
54                    end
' B5 I& i$ _6 M; F% C7 l55                end% o  K+ i$ b4 B# ?1 C2 M! ?4 o
56            end
9 V9 @  A. U  }# z57        end; g9 m3 J0 X9 y' U3 b# A8 p- F
58        figure,imshow(sourcePic);

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-24 13:25 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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