• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

MATLAB霍夫变换检测直线斜率

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  霍夫变换是把原图像中的直线上的每一个点转换到参数空间对应的曲线上,由于每一个点对应一条曲线,因此在参数空间中所有曲线会相交到一个点,形成一个最值。因此原图寻找直线斜率的问题就变成了参数空间寻找最值的问题了。

代码如下:

 1 clear all;
 2 close all;
 3 clc;
 4 
 5 
 6 %%
 7 %以下只是做一个带直线的图像而已
 8 r=300;           
 9 jiaodu=30;      %更改这个值测试,90度270度时不管用
10 jiaodu1=mod(jiaodu,360);     
11 flag=0;
12 
13 if jiaodu1>=0 && jiaodu1<90
14     jiaodu1=jiaodu1;
15     flag=1;
16 end
17 
18 if jiaodu1>=90 && jiaodu1<180
19     jiaodu1=180-jiaodu1;
20     flag=2;
21 end
22 
23 if jiaodu1>=180 && jiaodu1<270
24     jiaodu1=jiaodu1-180;
25     flag=3;
26 end
27 
28 if jiaodu1>=270 && jiaodu1<360
29     jiaodu1=360-jiaodu1;
30     flag=4;
31 end
32 
33 H=floor(r*sin(jiaodu1*pi/180));
34 W=floor(r*cos(jiaodu1*pi/180));
35 
36 if mod(H,2)==0
37     H=H+1;
38 end
39 
40 if mod(W,2)==0
41     W=W+1;
42 end
43 
44 w=zeros(H,W);
45 if jiaodu1 ~= 90 && jiaodu1 ~= 270
46     for i=1:H
47         for j=1:W
48             tmp=floor(j*tan(jiaodu1*pi/180));
49             if tmp+1==i
50                 w(i,j)=r;
51             end
52         end
53     end
54 else
55     for i=1:H
56         w(i,1)=r;
57     end
58 end
59 if flag==1 || flag==3       %如果角度在1,3象限,卷积矩阵上下翻转
60     w=flipud(w);        
61 end
62 %%
63 %下面是真正的霍夫变换
64 img=mat2gray(w);      %处理这个图像
65 [m n]=size(img);
66 imshow(img);
67 
68 data=zeros(314,2*(m+n));
69 for i=1:m                       %将图像二维空间的一个点映射到p=x*cos(theta)+y*sin(theta)方程对应的参数空间的一条曲线
70     for j=1:n
71         if img(i,j)==1            
72             for theta=0.01:0.01:3.14
73                 data(round(theta*100),round(i*sin(theta)+j*cos(theta)+m+n))= ...
74                 data(round(theta*100),round(i*sin(theta)+j*cos(theta)+m+n))+1;
75             end        
76         end
77     end
78 end
79 
80 theta=0;
81 ma=0;
82 for i=1:314                 %寻找曲线相交最多的那个点,即找最大值
83     for j=1:2*(m+n)
84         if data(i,j)>ma
85             ma=data(i,j);
86             theta=i/100;
87             rou=j-m-n;
88         end
89     end
90 end
91 figure;imshow(data)     %形象的显示参数空间曲线
92 
93 sr_k=tan(jiaodu*pi/180)     %设置的斜率
94 re_k=cos(theta)/sin(theta)  %求得的斜率

做出的一条直线

参数空间中的曲线

30度时斜率是0.5774,霍夫变换求得的斜率是0.5736。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
大家都要好好学习delphi XE线程同步对象单元System.SyncObjs发布时间:2022-07-18
下一篇:
Delphi过程函数传递参数的几种方式发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap