在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
霍夫变换是把原图像中的直线上的每一个点转换到参数空间对应的曲线上,由于每一个点对应一条曲线,因此在参数空间中所有曲线会相交到一个点,形成一个最值。因此原图寻找直线斜率的问题就变成了参数空间寻找最值的问题了。 代码如下: 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。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论