一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

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

代码如下:

复制代码
 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   一杯清酒邀明月  阅读(721)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示