霍夫变换直线检测理解
一步一步来:
1、在白纸上画出一个直角坐标系,任意给出一个点;
2、那么,对于点(x0,y0),经过这个点的直线必定满足y0=k*x0+b,其中k是直线的斜率,b是直线的截距;
3、上式可以化成b=y0-k*x0, 可以看作是以-x0为斜率,以y0为截距,在k-b空间上的一个直线方程(k,b为变量);
4、可见,k-b空间上的一条直线,代表了x-y空间经过特定点的所有直线,而x-y上的特定直线责备k-b空间上的特定点表示;
利用这个原理,我们可以通过一下方法检测可能出线的直线:
1、得到一副边缘图像;
2、对图像中的每一个边缘点,在k-b空间中画出一条直线;
3、在各直线的交点,我们采取“投票”(vote)的方法,即累加:n条直线的交点,改点的值为n;
4、遍历k-b空间,寻找出先局部最大值(极值)的点,这些点的坐标(k,b)就是图像中可能出线的直线的斜率和截距;
为了容易理解,这里采用了直线的斜截表达法。
事实上这种方法并不使用,因为某些直线的斜率很大的甚至不存在。
实际操作中,检测直线的霍夫变换使用含极坐标参数的直线表示型式,简称极坐标式(不是极坐标方程,因为还是在笛卡尔坐标下表示)
其中的两个参数的意义如下图:
这样,每条直线对应于theta-p空间下的一条正弦曲线,同样采用投票求极值的方法寻找曲线
霍夫变换直线检测的matlab实现:
这里涉及到三个函数:hough,houghpeaks,houghlines:
1、[H,T,R] =hough(BW,'Theta',20:0.1:75) ; (输入二值图像BW,角度范围与步进(最大,[-90, 90)),返回H-霍夫空间,T-theta,R-p);
2、PEAKS =houghpeaks(H,NUMPEAKS) ;(输入霍夫空间和极值数量,返回极值的坐标)
3、LINES=houghlines(BW,T,R,Peaks) ; (返回lines是一个包含图像中线段首末点、p、theta的结构体)
代码:
I=imread('1.jpg');
Ihsv=rgb2hsv(I);
Iv=Ihsv(:,:,3);%提取v空间
Ivl=Iv(500:end,:);%截取下半部
Iedge=edge(Ivl,'sobel');%边沿检测
Iedge = imdilate(Iedge,ones(3));%图像膨胀 %新建窗口,绘图用
figure (2) imshow(Iedge); hold on %左方直线检测与绘制
%得到霍夫空间
[H1,T1,R1] = hough(Iedge,'Theta',20:0.1:75);
%求极值点 Peaks=houghpeaks(H1,5);
%得到线段信息
lines=houghlines(Iedge,T1,R1,Peaks);%绘制线段
for k=1:length(lines)
xy=[lines(k).point1;
lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',4);
end
%右方直线检测与绘制
[H2,T2,R2] = hough(Iedge,'Theta',-75:0.1:-20);
Peaks1=houghpeaks(H2,5);
lines1=houghlines(Iedge,T2,R2,Peaks1);
for k=1:length(lines1)
xy1=[lines1(k).point1;lines1(k).point2];
plot(xy1(:,1),xy1(:,2),'LineWidth',4);
end
输入图像:
还有一种理解思路: 设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一组直线。方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-x0*k+y0对应的直线)。这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(2,2)。可以求出,过A点的直线的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点的直线的参数要满足方程2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。 同理,原图像上直线y=x上的其它点(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)。
众所周知, 一条直线在图像二维空间可由两个变量表示. 例如:
- 在 笛卡尔坐标系: 可由参数: 斜率和截距表示.
- 在 极坐标系: 可由参数: 极径和极角表示
对于霍夫变换, 我们将用 极坐标系 来表示直线. 因此, 直线的表达式可为:
化简得:
一般来说对于点 , 我们可以将通过这个点的一族直线统一定义为:
这就意味着每一对 代表一条通过点 的直线.
如果对于一个给定点 我们在极坐标对极径极角平面绘出所有通过它的直线, 将得到一条正弦曲线. 例如, 对于给定点 and 我们可以绘出下图 (在平面 - ):
只绘出满足下列条件的点 and .
我们可以对图像中所有的点进行上述操作. 如果两个不同点进行上述操作后得到的曲线在平面 - 相交, 这就意味着它们通过同一条直线. 例如, 接上面的例子我们继续对点: , 和点 , 绘图, 得到下图:
这三条曲线在 - 平面相交于点 , 坐标表示的是参数对 () 或者是说点 , 点 和点 组成的平面内的的直线.
那么以上的材料要说明什么呢? 这意味着一般来说, 一条直线能够通过在平面 - 寻找交于一点的曲线数量来 检测. 越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成. 一般来说我们可以通过设置直线上点的 阈值 来定义多少条曲线交于一点我们才认为 检测 到了一条直线.
这就是霍夫线变换要做的. 它追踪图像中每个点对应曲线间的交点. 如果交于一点的曲线的数量超过了 阈值, 那么可以认为这个交点所代表的参数对 在原图像中为一条直线.
霍夫变换直线检测的opencv实现:
int main( )
{ //【1】载入原始图和Mat变量定义 Mat srcImage = imread("123.jpg"); //工程目录下应该有一张名为1.jpg的素材图 Mat midImage,dstImage;//临时变量和目标图的定义 //【2】进行边缘检测和转化为灰度图 cv::Canny(srcImage, midImage, 50, 200, 3);//进行一此canny边缘检测 cvtColor(midImage,dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图 //【3】进行霍夫线变换 std::vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合 HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0 ); //【4】依次在图中绘制出每条线段 for( size_t i = 0; i < lines.size(); i++ ) { float rho = lines[i][0], theta = lines[i][1]; Point pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000*(-b)); pt1.y = cvRound(y0 + 1000*(a)); pt2.x = cvRound(x0 - 1000*(-b)); pt2.y = cvRound(y0 - 1000*(a)); line( dstImage, pt1, pt2, Scalar(55,100,195), 1, CV_AA); } //【5】显示原始图 imshow("【原始图】", srcImage); //【6】边缘检测后的图 imshow("【边缘检测后的图】", midImage); //【7】显示效果图 imshow("【效果图】", dstImage); waitKey(0); return 0; }
霍夫变换直线检测理解相关推荐
- 霍夫变换直线检测基本原理
霍夫变换直线检测基本原理hough;houghpeaks;houghlines(2) 一步一步来: 1.在白纸上画出一个直角坐标系,任意给出一个点: 2.那么,对于点(x0,y0),经过这个点的直线必 ...
- 初识霍夫变换——霍夫变换直线检测原理(Line Detection)
参考博客: 1.Opencv学习笔记-----霍夫变换直线检测及原理理解 2.霍夫变换检测直线原理及实例 3.霍夫变换直线检测(Line Detection)原理及示例 霍夫变换(Hough Tran ...
- 霍夫变换检测直线 c语言,opencv之霍夫变换直线检测
霍夫变换检测 霍夫变换之直线检测霍夫变换直线检测 前提条件-边缘检测已经完成 平面空间到极坐标空间的转换(空间域向霍夫域的转换) 检测原理两点确定一条直线,通过一点可以确定无数条直线,极坐标直线公式 ...
- 【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...
- 数字图像处理--霍夫变换直线检测及原理理解
我们在前面的<图像的颜色选择>.<图像的感兴趣区域>中提到了对车道线的检测. 通过对原始行车图像进行颜色选择和感兴趣区域的提取,得到了如下的车道线: 我们的车道线当然是一左一右 ...
- OpenCV 霍夫变换直线检测(SHT、MSHT和PPHT)
一.霍夫变换简述 霍夫变换(Hough Transform)是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线 ...
- matlab寻找直线_Matlab 霍夫变换 ( Hough Transform) 直线检测
PS:好久没更新,因为期末到了,拼命复习中.复习久了觉得枯燥,玩玩儿霍夫变换直线检测 霍夫变换的基本原理不难,即便是初中生也很容易理解(至少在直线检测上是这样子的). 霍夫变换直线检测的基本原理:(不 ...
- OpenCV标准霍夫直线检测详解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...
- 霍夫直线检测python_opencv+python 霍夫直线检测
参考:https://blog.csdn.net/fengjiexyb/article/details/78075888 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通 ...
最新文章
- 使用ffmpeg推流到Wowza
- 危害企业IT系统最严重的五个安全威胁
- 一致性协议raft详解(二):安全性
- 在Spring Framework中通过JNDI进行配置
- Mybatis学习之接口编程
- 冒险岛079实现按地图编号自由传送的功能
- 妙用chrome插件,实现U校园自动填答案
- STM32学习记录0004——ISP串口下载
- [教程]智慧KTV小企鹅日志查看
- Arduino MAX30102脉搏心率传感器使用教程
- 世界头号电脑黑客 - 凯文•米特尼克(Kevin Mitnick)
- Python运行报错most recent call last
- 关于Alipay支付宝接口(Java版)
- 关于电视剧《狂飙》的一点感悟--贵人相助的重要性
- Codeforces 1144 D
- We‘re sorry but XXX doesn‘t work properly without JavaScript enabled. Please enable it to contin
- 小程序php文档,微信小程序API 文件
- 教师专业发展规划计算机教师,初中信息技术教师个人发展计划
- 吴恩达机器学习训练秘籍整理三十三到三十五章(五)
- Redis的那些最常见面试问题
热门文章
- openstack 同一网络 多个subnet
- mysql 主机 %_MySQL 开启远程链接(localhost 以外的主机)
- RedHat linux服务器对外开放指定端口
- 工程数据计算机处理的方法有,第二章 CADCAM技术基础-工程数据的计算机处理2011.ppt...
- Centos8 yum 阿里源配置
- 程序员的“鱿鱼游戏”,你能活到第几关?
- 皮一皮:看看你有没有在自杀...
- 我来出个题:这些事务会不会回滚?大概率你会错!
- 皮一皮:当有人在我身边时...
- 我的 Promtheus 到底啥时候报警?