一步一步来:

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)。
  1. 众所周知, 一条直线在图像二维空间可由两个变量表示. 例如:

    1. 在 笛卡尔坐标系: 可由参数:  斜率和截距表示.
    2. 在 极坐标系: 可由参数:  极径和极角表示

    对于霍夫变换, 我们将用 极坐标系 来表示直线. 因此, 直线的表达式可为:

    化简得: 

  2. 一般来说对于点 , 我们可以将通过这个点的一族直线统一定义为:

    这就意味着每一对  代表一条通过点  的直线.

  3. 如果对于一个给定点  我们在极坐标对极径极角平面绘出所有通过它的直线, 将得到一条正弦曲线. 例如, 对于给定点 and  我们可以绘出下图 (在平面  - ):

    只绘出满足下列条件的点  and .

  4. 我们可以对图像中所有的点进行上述操作. 如果两个不同点进行上述操作后得到的曲线在平面  -  相交, 这就意味着它们通过同一条直线. 例如, 接上面的例子我们继续对点:  和点  绘图, 得到下图:

    这三条曲线在  -  平面相交于点 , 坐标表示的是参数对 () 或者是说点 , 点  和点  组成的平面内的的直线.

  5. 那么以上的材料要说明什么呢? 这意味着一般来说, 一条直线能够通过在平面  -  寻找交于一点的曲线数量来 检测. 越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成. 一般来说我们可以通过设置直线上点的 阈值 来定义多少条曲线交于一点我们才认为 检测 到了一条直线.

  6. 这就是霍夫线变换要做的. 它追踪图像中每个点对应曲线间的交点. 如果交于一点的曲线的数量超过了 阈值, 那么可以认为这个交点所代表的参数对  在原图像中为一条直线.

  7. 霍夫变换直线检测的opencv实现:

    int main( )

  8. {    //【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;
    }
    

霍夫变换直线检测理解相关推荐

  1. 霍夫变换直线检测基本原理

    霍夫变换直线检测基本原理hough;houghpeaks;houghlines(2) 一步一步来: 1.在白纸上画出一个直角坐标系,任意给出一个点: 2.那么,对于点(x0,y0),经过这个点的直线必 ...

  2. 初识霍夫变换——霍夫变换直线检测原理(Line Detection)

    参考博客: 1.Opencv学习笔记-----霍夫变换直线检测及原理理解 2.霍夫变换检测直线原理及实例 3.霍夫变换直线检测(Line Detection)原理及示例 霍夫变换(Hough Tran ...

  3. 霍夫变换检测直线 c语言,opencv之霍夫变换直线检测

    霍夫变换检测 霍夫变换之直线检测霍夫变换直线检测 前提条件-边缘检测已经完成 平面空间到极坐标空间的转换(空间域向霍夫域的转换) 检测原理两点确定一条直线,通过一点可以确定无数条直线,极坐标直线公式 ...

  4. 【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...

  5. 数字图像处理--霍夫变换直线检测及原理理解

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

  6. OpenCV 霍夫变换直线检测(SHT、MSHT和PPHT)

    一.霍夫变换简述   霍夫变换(Hough Transform)是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线 ...

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

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

  8. OpenCV标准霍夫直线检测详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...

  9. 霍夫直线检测python_opencv+python 霍夫直线检测

    参考:https://blog.csdn.net/fengjiexyb/article/details/78075888 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通 ...

最新文章

  1. 使用ffmpeg推流到Wowza
  2. 危害企业IT系统最严重的五个安全威胁
  3. 一致性协议raft详解(二):安全性
  4. 在Spring Framework中通过JNDI进行配置
  5. Mybatis学习之接口编程
  6. 冒险岛079实现按地图编号自由传送的功能
  7. 妙用chrome插件,实现U校园自动填答案
  8. STM32学习记录0004——ISP串口下载
  9. [教程]智慧KTV小企鹅日志查看
  10. Arduino MAX30102脉搏心率传感器使用教程
  11. 世界头号电脑黑客 - 凯文•米特尼克(Kevin Mitnick)
  12. Python运行报错most recent call last
  13. 关于Alipay支付宝接口(Java版)
  14. 关于电视剧《狂飙》的一点感悟--贵人相助的重要性
  15. Codeforces 1144 D
  16. We‘re sorry but XXX doesn‘t work properly without JavaScript enabled. Please enable it to contin
  17. 小程序php文档,微信小程序API 文件
  18. 教师专业发展规划计算机教师,初中信息技术教师个人发展计划
  19. 吴恩达机器学习训练秘籍整理三十三到三十五章(五)
  20. Redis的那些最常见面试问题

热门文章

  1. openstack 同一网络 多个subnet
  2. mysql 主机 %_MySQL 开启远程链接(localhost 以外的主机)
  3. RedHat linux服务器对外开放指定端口
  4. 工程数据计算机处理的方法有,第二章 CADCAM技术基础-工程数据的计算机处理2011.ppt...
  5. Centos8 yum 阿里源配置
  6. 程序员的“鱿鱼游戏”,你能活到第几关?
  7. 皮一皮:看看你有没有在自杀...
  8. 我来出个题:这些事务会不会回滚?大概率你会错!
  9. 皮一皮:当有人在我身边时...
  10. 我的 Promtheus 到底啥时候报警?