• MATLAB 霍夫变换检测直线斜率


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

    代码如下:

     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。

  • 相关阅读:
    JDBC 连接 MySQL 数据库
    通过java类的反射机制获取类的属性类型
    反射机制实例化类,并获取类中的属性、方法、和构造器
    java8u162反射机制的一个BUG
    Java反射关于getDeclaredMethods()和getMethods()的区别
    Java反射
    30天C#基础巩固------了解委托,string练习
    30天C#基础巩固------读写流(StreamWrite/StreamReader)
    30天C#基础巩固------集合,File(文件操作 ),Encoding处理字符集
    30天C#基础巩固------面向鸭子编程,关于string和File的练习
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13646141.html
Copyright © 2020-2023  润新知