目录

  • 一、Hough变换的基本思想
  • 二、算法实现
  • 三、MATLAB相关函数
    • 3.1 hough
    • 3.2 houghpeaks
    • 3.3 houghlines
  • 四、程序实例

一、Hough变换的基本思想

对于直角坐标系里的一条直线l,可用ρ,θ来表示该直线,相应的直线方程为ρ=xcosθ+ysinθρ=xcosθ+ysinθρ=xcosθ+ysinθ,其中,ρ是原点到该直线的垂直距离,θ是垂线与x轴的夹角,这条直线是惟一的
构造一个参数(ρ,θ)的平面,从而(ρ,θ)平面的一点,对应一条直线。

【结论】:ρ,θ坐标系中的一个点对应x,y坐标系中的一条直线。而x,y坐标系中的一个点对应ρ,θ坐标系中的一组点(一条曲线),x,y坐标系中直线上的所有点在ρ,θ坐标系中对应的所有曲线交汇到一个点上。

二、算法实现

根据点-线对偶性把检测问题转换到参数空间,通过简单的累加统计完成检测任务。
1.在参数空间(ρ,θ)里建立一个2D累加数组A(ρ,θ),初始化为0;
2.对XY空间中的每一个给定点做Hough变换,让θ在[θminmax]区间取所有可能的值,并求出ρ;
3.根据ρ,θ取整数值在A(ρ,θ)处累加A(ρ,θ)=A(ρ,θ)+1,A(ρ,θ)的值说明多少点是共线的,最大值所对应的(ρ,θ)的值也对应了直线方程的参数。

如:

上图中,0表示零条直线穿过,1表示一条直线穿过,2表示两条直线穿过,3表示三条直线穿过,4表示四条直线穿过。
而累加器A中就存储了这样的信息。

三、MATLAB相关函数

3.1 hough

Hough变换
ρ=x∗cos(θ)+y∗sin(θ)ρ = x*cos(θ) + y*sin(θ)ρ=x∗cos(θ)+y∗sin(θ)

[H,theta,rho] = hough(BW,'RhoResolution',0.5,'ThetaResolution',0.5)
  • BW:m*n维二值图
  • RhoResolution:ρ的分辨率,缺省为1
  • ThetaResolution:θ的分辨率,θ的范围是[-90,90)
  • H:hough变换后的累加器矩阵,行数为m,列数为n
  • theta:θ
  • rho:ρ

3.2 houghpeaks

确定Hough变换中的峰值

P=houghpeaks(H,2,'Threshold',15);
  • 找到Hough变换结果,累加容器H中所有大于阈值Threshold的峰值中,最大的2个峰值所在的位置P。
  • P为矩阵,记录H中被找到的峰值的横纵坐标。

3.3 houghlines

基于Hough变换提取直线段

P=houghlines(BW,theta,rho,P,'FillGap',5,'MinLength',7);
  • 二值图BW中对应指定(theta,rho),且容器中数值>峰值P的所有线段lines
  • 且线段最小长度大于MinLength
  • 线段间距离<FillGap的合并
  • lines为结构变量,(lines.point1,lines.point2)记录满足条件的线段端点

四、程序实例

Im=imread('1.jpg');
[m,n] = size(Im);
%执行Hough变换并显示Hough矩阵
BW = edge(Im,'canny');
[H,T,R] = hough(BW);
imshow(H,[ ],'XData',T,'YData',R,'InitialMagnification','fit');
xlabel('\theta');ylabel('\rho');
axis on, axis normal, hold on;
%在Hough矩阵中寻找前40个大于Hough矩阵中最大值0.24倍峰值
P=houghpeaks(H,40,'threshold',ceil(0.24*max(H(:))));
x = T(P(:,2));y = R(P(:,1));%由行、列索引转换成实际坐标
plot(x,y,'s','color','white');%在Hough矩阵图像标出峰值位置
%找到并绘制直线
lines=houghlines(BW,T,R,P,'FillGap',20,'Minlength',2);%合并距离小于20的线段,丢弃所有长度小于2的线段
figure(2),imshow(Im),hold on
max_len = 0;
for k = 1:length(lines)%依次标出各条直线段xy = [lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','black');%确定最长线段的端点len = norm(lines(k).point1 - lines(k).point2);%最长线段的长度if ( len > max_len)max_len = len;xy_long = xy;end
end

部分显示效果:

如果对你有所帮助,记得点个赞哟~

霍夫变换(Hough Transformation)基本思想及MATLAB相关函数相关推荐

  1. 霍夫变换(hough transform)原理

    计算机视觉中经常需要识别或者定位某些几何图形,比如直线.圆.椭圆,还有其他一些图形.检测直线的霍夫变换提供了在图像中寻找直线的一种算法,是最简单的一种情形,后来发展到检测圆.椭圆.还有一般图形的霍夫变 ...

  2. 霍夫变换(Hough)

    霍夫变换Hough 霍夫变换(Hough)是一个非常重要的检测间断点边界形状的方法.它通过将图像坐标空间变换到参数空间,来实现直线与曲线的拟合. 1.直线检测 1.1 直线坐标参数空间 在图像x−yx ...

  3. 【表盘识别】基于matlab霍夫变换钟表表盘识别【含Matlab源码 1943期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[表盘识别]基于matlab霍夫变换钟表表盘识别[含Matlab源码 1943期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  4. 【视觉算法】霍夫变换(Hough Transform)

    在进入正题之前,首先思考一个问题,在下图中,我们如何从散乱的点中寻找到直线? 有多少直线?哪些点属于哪些直线? 如果是找圆形呢? 霍夫变换(Hough Transform)能很好的解决这些问题,要理解 ...

  5. matlab寻找直线_Matlab 霍夫变换 ( Hough Transform) 直线检测

    PS:好久没更新,因为期末到了,拼命复习中.复习久了觉得枯燥,玩玩儿霍夫变换直线检测 霍夫变换的基本原理不难,即便是初中生也很容易理解(至少在直线检测上是这样子的). 霍夫变换直线检测的基本原理:(不 ...

  6. Hough变换检测椭圆 附带matlab与opencv代码

     由椭圆的公式(1)可得,确定一个椭圆需要5个参数,a,b 为椭圆的长轴和段轴,P,Q 为椭圆中心坐标,θ为椭圆的旋转角度.如果用传统的Hough变换方法,参数空间需要五维.这种方法在计算过程中所耗费 ...

  7. java 霍夫变换_霍夫变换(Hough Transform)

    霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.最基本的霍夫变换是从黑白图像中检测直线(线段). 我们先看这样一个问题: 设已知一黑白图像上画了一条直线,要求出这 ...

  8. 【图像识别】基于 Hough变换钟表表盘识别Matlab代码

    1 简介 本设计主要针对指针式仪表的数字化读数的研究,提高读取效率和读数的准确性.以MATLAB为载体对图像进行仿真处理,通过设备采集图片,对图像进行表盘定位,图像预处理,边缘检测,Hough变换等操 ...

  9. matlab堆栈的思想,[转载]Matlab源代码:堆栈类Stack的实现

    Matlab源代码:堆栈类Stack的实现 -- by benbenknight 自己编写了一个堆栈类Stack,供大家分享. 类的成员函数清单如下: Stack STACK 堆栈对象Stack的构造 ...

  10. 关于语音特征提取(MFCC)的matlab相关函数

    使用深度学习进行语音命令识别 其中特征提取环节用到的库函数: spectrogram spectrogram 该函数的功能是将时域的语音信号变为短时频域信号: 主要包括:预加重,分帧,加窗,FFT求能 ...

最新文章

  1. 介绍一下K近邻(KNN)算法,KNeighbors和RadiusNeighbors的差异是什么?各有什么优势?
  2. python处理csv文件缺失值_python 加载数据是-1为缺失值时替换为空
  3. 记ThoughtWorks面试失败之旅
  4. Enumerable 下又有新的扩展方法啦,快来一睹为快吧
  5. linux服务器查配置信息失败,查看Linux服务器的配置信息
  6. C++11中的右值引用及move语义编程
  7. java怎么安装_Windows、Linux、Mac下安装JDK
  8. 服务器LIMIT是什么信号,Postfix添加milter-limit配置方案
  9. HSRP的初步解析及典型应用2
  10. django导入mysql_django如何直接对数据库进行插入操作?
  11. 详解Nginx的功能策略配置
  12. NumpyPandas内置函数实现分组
  13. 浪潮java面经总结
  14. pyqt5在图元上画图_PyQt5的PyQtGraph实践系列1:添加图形到PyQt5布局
  15. python 调用函数
  16. Mysql根据出生日期计算年龄
  17. 微软官网方法制作win10u盘启动
  18. 前端下载图片(文件)以及打包下载图片(文件)
  19. 如何写好一份数据分析报告
  20. 源来是你-Vol.38 | 浪潮开务数据库招人辣!准备好加入幸福感爆棚的KW家族了么?...

热门文章

  1. 数据仓库与数据挖掘相关基础概念
  2. 微型计算机控制技术第二版答案第四章,微型计算机控制技术答案第四章2.pdf
  3. 花一天时间做一个高质量飞机大战游戏,过万字Unity完整教程!漂亮学妹看了直呼666!
  4. 忘记密码怎么卸载和删除网维大师~
  5. AES加密算法|密码学|网络空间安全
  6. 渠道为王:销售渠道建设3部曲 读后感
  7. python 大智慧股池_大智慧股票池
  8. 升降机用三级液压缸的设计与仿真
  9. HEVC中的样点自适应补偿——Sample Adaptive Offset (SAO)
  10. 实验五 Flash在线编程实验