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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

  j' F5 I3 o) }  nHough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。8 V* q: \: V! [/ @; V
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。
3 c" F/ @/ q: d6 O其中先用log(laplacian of gaussian)算子检测图像边界:5 ?5 L% z: y0 |

+ ?; `3 j. u% H! |5 R5 x8 Z01        sourcePic=imread('D: matlab程序Hough变换检测直线curve.bmp');' a! a) ]& d6 N: l" R
02        [height,width,l]=size(sourcePic);6 r* w) F0 t( a. d3 L  o
03        grayPic=zeros(height,width);
% z' n- K( a% q- H7 x1 t04        for i=1:height %转换成灰度图象. i1 e4 V8 o% m" d9 g
05            for j=1:width
2 J% |( m& m# D06                grayPic(i,j)=(sourcePic(i,j,1) sourcePic(i,j,2) sourcePic(i,j,3))/3;" [& C$ T7 x# ?- O
07            end
0 Z0 V3 o3 T/ b) u' j) m08        end4 \! [- A2 }, M4 ]7 v3 p8 A
09        logNum=0; %log算子的计算值
4 y0 g$ s+ v" \( U- M6 S10        edgePic=zeros(height,width);
; p+ O, z2 U" i- a  k+ F" M11        for i=3:height-2 %log算子提取边界
, L9 T* ^/ N* U$ \12            for j=3:width-2
- q/ A3 k; H( ?7 K+ V  _- j" M13                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);( T0 ]( R$ k: ^4 u  A  G
14                if(logNum > 0)
5 ~- [7 ?2 s% F, _15                    edgePic(i,j)=255;
. q3 d  c/ y3 V9 V" Z16                else
7 T8 X7 g7 a0 \' A17                    edgePic(i,j)=0;. x1 @, X# Z$ g9 l. K% h
18                end: a4 w, u' ~3 N: P
19            end
" r9 E, O  k, L5 S20        end% e! D! K6 I! F9 x8 w1 f+ n0 E
21        % Hough变换检测直线,g(x)=(a,p)为边界点对应的平面& {: |$ o4 F3 a. S- J& o$ r, w
22        ma=180; %a的值为0到180度, J9 p  B* n" Z+ x7 X
23        mp=round(sqrt(height^2 width^2)); %对应P的最大值
* L/ {9 S9 ?6 p7 m# t7 Z24        npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数
0 I6 a3 \, @3 r25        npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
; }9 a) I8 R+ d8 x) p1 g: I7 f26        for i=1:height %计算(a,p)的值,并做相应记录
0 F* W3 T/ e3 U. c! c5 i* z27            for j=1:width4 B( i2 f+ `5 n! _
28                if(edgePic(i,j)==255)1 p+ G9 y- p! h0 y5 V! E8 Z3 r$ k
29                    for k=1:ma
5 k( \( g* c/ z4 \2 i( e30                        p = round(i*cos(pi*k/180) j*sin(pi*k/180));8 y7 a( o$ f/ I( A+ b% v% c
31                        if(p > 0)+ h8 U1 }; ]* {. ~9 r8 q0 u* G
32                            %npc(k,mp*2)=npc(k,mp*2) 1;2 a4 S- }& Q& u! v  \/ \/ K
33                            %npp{k,mp*2}=[npp{k,mp*2},[i,j]'];+ w7 m) z0 q  \, X1 K* M+ E% |
34                             10.01.05修正
0 A, ~8 H' c4 `' h) x35                            npc(k,mp p)=npc(k,mp p) 1;: G3 ]; p. [* h8 ~& [2 g
36                            npp{k,mp p}=[npp{k,mp p},[i,j]'];
$ b; N' u) h3 x% _6 y5 O+ Q37                        else
3 H# c8 C5 ^8 L38                            ap=abs(p) 1;  l# z" c! M; E, e1 V  Z  R1 y
39                            npc(k,ap)=npc(k,ap) 1;
9 I- t/ W" }/ W9 Q" s( s40                            npp{k,ap}=[npp{k,ap},[i,j]'];0 E% {  Z1 A( p: G4 D7 i! `
41                        end* `( r1 Z& c& L# m/ K
42                    end( s2 w7 x7 ]+ x: p$ a
43                end
. O( N5 U( G8 R1 b2 T& `44            end/ B& `. ^, U! L! R& R' ?
45        end  i! s  n, V# ]; r
46        for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线+ z2 h% {7 m  M6 e& f+ ~, b5 y- Q
47            for j=1:mp*2
: y$ x3 L* ^7 Z7 ~2 M4 c; n48                if(npc(i,j) > 90) %将提取直线的阈值设为90; D0 q, u% |. e6 P* f
49                    lp=npp{i,j};) B$ t4 S! h) _4 [4 O$ P! g
50                    for k=1:npc(i,j). _, m2 t+ E1 G
51                        sourcePic(lp(1,k),lp(2,k),1)=255;4 S. X& \+ d1 B# x8 a
52                        sourcePic(lp(1,k),lp(2,k),2)=0;
! \2 d! ?3 k) l) [, l& X53                        sourcePic(lp(1,k),lp(2,k),3)=0;6 s+ G& H" L  K- s. j
54                    end8 J8 w" V4 C/ p
55                end: {% R' X1 t# `+ }# I
56            end
8 m! a6 g# B! S( i! _57        end+ m4 z  t: h, d
58        figure,imshow(sourcePic);

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 21:35 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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