matlab实现彩色图像的hough直线检测

  • 原理描述
  • 代码
  • 实验结果

原理描述

霍夫变换是用来检测图像中的直线或者圆等几何图形的。一条直线的表示方法有好多种,最常见的是 y=mx+b 的形式。 假设有一幅图像,经过滤波,边缘检测等操作,那么接下来的问题就是怎么把这张图片中的直线提取出来。基本的思考流程是:如果直线 y=mx+b 在图片中,那么图片中,必需有N多点在直线上(像素点代入表达式成立),只要有这条直线上的两个点,就能确定这条直线。该问题可以转换为:求解所有的(m,b)组合。
设置两个坐标系,左边的坐标系表示的是(x,y)值,右边的坐标系表达的是(m,b)的值,即直线的参数值。那么一个(x,y)点在右边对应的就是是一条线,左边坐标系的一条直线就是右边坐标系中的一个点。这样,右边左边系中的交点表示有多个点经过(m,b)确定的直线。但是,该方法存在一个问题(m,b)的取值范围太大。
在笛卡尔坐标系中会存在参数问题,垂直线的斜率不存在(或无限大),这使得斜率参数 m m m的值接近于无限。为此,为了更好的计算,Richard O. Duda和Peter E. Hart在1971年4月,提出了极坐标系。其中r是原点到直线上最近点的距离,\theta是x轴与连接原点和最近点直线之间的夹角。如下图所示:

对于一般的点(x_{0}, y_{0})来说,可以将通过这个点的一族直线统一定义为: r 0 = x 0 ⋅ c o s θ + y 0 ⋅ s i n θ r_{0}=x_{0}\cdot\;cos\theta+y_{0}\cdot\;sin\theta r0​=x0​⋅cosθ+y0​⋅sinθ,这就意味着对于每一对(r_{0}, cos\theta)代表一条通过点(x_{0},y_{0})的直线。如果对于一个给定点(x_{0},y_{0})我们在极坐标对极径极角平面绘出所有通过它的直线,将得到一条正弦曲线。正弦曲线的形状取决于,点到所定义原点的距离r。通常r越大,正弦曲线的振幅越大,反之则会越小。例如, 对于给定点x_{0}=8,y_{0}=6我们可以绘出r=8\cdot;cos\theta+6\cdot;sin\theta的图像 (满足条件r>0,0<\theta<2\pi):

所以我们可以得到一个结论,给定平面中的单个点,那么通过该点的所有直线的集合对应于(r,θ)平面中的正弦曲线,这对于该点是独特的。一组两个或更多点形成一条直线将产生在该线的(r,θ)处交叉的正弦曲线。因此,检测共线点的问题可以转化为找到并发曲线的问题。
继续添加两个点(9,4)和(12,3)得到如下正弦图像:

这三条曲线在平面\theta-r相交于点 (0.925, 9.6), 坐标表示的是参数对(\theta, r)或者是说点(x_{0}, y_{0}), 点(x_{1}, y_{1})和点(x_{2}, y_{2})组成的平面内的直线。一般来说,一条直线能够通过在平面\theta-r寻找交于一点的曲线数量来检测。而越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成,一般来说我们可以通过设置直线上点的阈值来定义多少条曲线交于一点我们才认为检测到了一条直线。这就是霍夫线变换要做的,它追踪图像中每个点对应曲线间的交点,如果交于一点的曲线的数量超过了阈值,那么可以认为这个交点所代表的参数对\theta-r在原图像中为一条直线。

代码

function result = hough(image)
image = double(image);
[rows,cols,v] = size(image); % 图像行列数
gray = uint8(zeros([rows,cols]));
for i=1:rowsfor j=1:colsgray(i,j)=0.299*image(i,j,1)+0.587*image(i,j,2)+0.11400*image(i,j,3);% 灰度化end
end
temp = int16(zeros([rows+2,cols+2]));
temp(2:rows+1,2:cols+1) = gray;
result = uint8(zeros([rows,cols]));
% Roberts边缘检测
for i = 2:(rows + 1)for j = 2:(cols + 1)result(i-1,j-1) = abs(temp(i+1,j+1)-temp(i,j))+abs(temp(i,j+1)-temp(i+1,j));if result(i-1,j-1) <= 45result(i-1,j-1) = 0;elseresult(i-1,j-1) = 255;endend
end
% matlab_roberts=edge(gray,'roberts');
% imwrite(matlab_roberts,'matlab_roberts.jpg');
imwrite(result,'roberts_result.jpg');
imshow(result);
title('roberts算子边缘检测结果');
pmax=round((rows*rows+cols*cols)^0.5);
A=zeros(2*pmax,180);   % [-pmax,pmax]转换为[1,2pmax]
for x=1:rowsfor y=1:colsif result(x,y)==255for theta=1:180radian=theta/180*pi; p=round(x*cos(radian)+y*sin(radian));p=p+pmax;                  % 对应前面的坐标变换A(p,theta)=A(p,theta)+1;   % 数量统计endendend
end
[p,theta]=find(A>200);  % 找出数量超过两百的
number=length(p);       % 直线条数
x=1:rows;               % 直线横坐标
figure,imshow(result)
for i=1:numberhold on             % 在作下一幅图时保留已有图像radian=theta(i)/180*pi;y=(p(i)-pmax-x*cos(radian))/sin(radian);  % 直线纵坐标plot(y,x,'w-','LineWidth',1);             % 画直线
end
title('hough直线检测结果');
% 测试代码
% image = imread('hough.jpg');
% res = hough(image);

实验结果

本实验手动灰度化后采用了roberts算子进行边缘检测,阈值选择为45,hough共线点数过200则确认为对应直线。

matlab实现彩色图像的hough直线检测相关推荐

  1. 史上最详细的Hough直线检测

    之前写过检测车道线的文章:https://blog.csdn.net/u010712012/article/details/84780943 最后可以检测出两条车道线,但是,本课题的目的是通过提供一张 ...

  2. Python+OpenCV:Hough直线检测(Hough Line Transform)

    Python+OpenCV:Hough直线检测(Hough Line Transform) 理论 A line can be represented as  or in a parametric fo ...

  3. Hough直线检测的原理与实现

     霍夫变换就是通过图形的一种表示模式,加上一种转换方法,把图形的点集投射到一个点上以便检测. 标准直线Hough变换采用如下参数化直线方程: x*cosθ+y*sinθ=ρ             ...

  4. opencv+hough直线检测+fitline直线拟合

    #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/cor ...

  5. Hough直线检测的理解

    我们在前面的<图像的颜色选择>.<图像的感兴趣区域>中提到了对车道线的检测. 通过对原始行车图像进行颜色选择和感兴趣区域的提取,得到了如下的车道线: 我们的车道线当然是一左一右 ...

  6. 图像分割 - Hough变换直线检测

    目录 1. Hough 直线检测 2. HoughLinesP 函数 1. Hough 直线检测 霍夫变换(Hough 变换):利用对偶原理,把原空间的问题转换到对偶空间去求解 这里涉及到空间转换,将 ...

  7. QT+opencv学习笔记(5)——霍夫直线检测、圆检测及椭圆检测

    开发环境为:win10+QT5.8+opencv3.2 Hough变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛.最基本的Hough变换是从黑白图像中检测直线,还可以经过改进检测圆.椭 ...

  8. 直线检测——Radon变换/霍夫变换/基于快速傅里叶变换的直线检测

    1. 直线检测 1.1. Radon直线检测原理 基于Radon变换的直线检测的目的就是检测根据角度变化时出现的"局部峰值",即可以确定直线的方向,同时,峰值大小能够确定直线上点的 ...

  9. 工业视觉_57:霍夫(Hough)直线识别,交点与夹角

    /* 工业视觉_57:霍夫(Hough)直线识别,交点与夹角* 工业视觉,目标很明确:快,准,稳. 快:开发快,运行速度快;准:高精度;稳:稳健* 所以,目前"机器换人"项目大多采 ...

最新文章

  1. bootstrapdatetimepicker 隐藏触发 bootstrap modal隐藏事件
  2. 第二周作业-停车场门禁控制系统的状态机
  3. C语言const关键字与指针
  4. php默认语法,PHP基本语法总结
  5. 吴恩达机器学习【第五天】逻辑回归模型
  6. 考研数据结构程序题常见代码【C语言实现】
  7. C语言字符与数字的互转
  8. Chm 文件资源编辑软件
  9. 【SNA】社会网络分析二 Gephi 功能详解
  10. 《那些年啊,那些事——一个程序员的奋斗史》——123
  11. 移动web基础:视口(viewport),流式布局 JDM京东移动端开发
  12. PR字幕预设|视频文字闪烁标题闪动特效PR预设
  13. 帆软报表——多源分片与冻结
  14. htmlunit 使用代理IP
  15. 计算机系统原理实验——微程序控制器
  16. vue使用render函数自定义标签动态导入js文件
  17. S32DS Components组件配置
  18. 知道创宇研发技能表v2.2
  19. JVM学习:JVM对象分代晋升机制
  20. mysql获取前一天日期_mysql中获取当前时间的前一天

热门文章

  1. 相机标定之畸变矫正与反畸变计算
  2. 「以代码作画」从数据角度剖析Art Blocks生成艺术
  3. IBM公布了2项合作 Watson将塑造这样的未来医疗?
  4. webview无法截取长屏问题
  5. SpringBoot-核心技术篇
  6. startsWith() 方法
  7. 解决方案| 全民抗“灾”- 实时音视频在应急指挥场景的应用
  8. 电商购物网站(登陆注册购物车详情页等)(仿jd)
  9. vite构建工具初识
  10. 谈什么品牌的显示器最好