一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

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

代码如下:

 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。

posted on 2020-09-10 15:47  一杯清酒邀明月  阅读(683)  评论(0编辑  收藏  举报