现阶段用最多的线段检测算法为Hough变换,对于Hough变换的原理部分已经有很多人写过,具体可以参考:点击打开链接,这里我总结一下理解Hough变换算法的难点。

一、直线表示方法:

1)最常用的方法为斜截式:y=kx+b,已知直线的斜率及y轴上的截距,即可确定一条直线。

2)Hough变换中参数方程:rho = x * cos(theta) + y * sin(theta),原理部分一般都会介绍,每一对(rho, theta)对应一条直线,为什么?可以看一下下面这个图

可以看到,这里的rho和theta分别对应于原点到直线y=kx+b的距离以及这条垂线对应夹角。知道这两个东西,自然就可以知道一条直线。

二、实现步骤

1)灰度化,并使用Canny进行边缘检测;

2)参数空间离散化:确定检测精度;

3)Hough参数空间统计;

4)四邻域非极大值抑制;

三、代码如下:

#include <opencv2/opencv.hpp>
#include <math.h>using namespace cv;
using namespace std;//用来表示极坐标参数空间里的数据
struct Para {int num;float angle;int rho;
};int main()
{Mat src = imread("1.jpg");Mat gray;cvtColor(src, gray, CV_BGR2GRAY);Mat edges;Canny(gray, edges, 50, 200);int i, j, k;// hough transformint q_max = sqrt(pow(gray.rows, 2) + pow(gray.cols, 2));int nAngles = 180;  // 划分为180份// 为hough参数空间分配内存及初始化int ** hough_data = new int*[q_max];for (i = 0; i < q_max; i++){hough_data[i] = new int[nAngles];for (j = 0; j < nAngles; j++){hough_data[i][j] = 0;}}// Hough参数空间统计for (i = 0; i < edges.rows; i++)for (j = 0; j < edges.cols; j++){if (edges.at<uchar>(i,j) == 255){int index = 0;for (k = 0; k < nAngles; k++){index = int(i * cos(CV_PI / nAngles * k) + j * sin(CV_PI / nAngles * k));index = int( (index + q_max) / 2 );hough_data[index][k]++;}}}// 统计之后进行非极大值抑制Para *houghSpace = new Para[q_max * nAngles];int thr = 200;int counts = 0;for (i = 0; i < q_max; i++)for (j = 0; j < nAngles; j++){// 大于阈值且为四邻域的极大值if (hough_data[i][j] > thr &&hough_data[i][j] > hough_data[i + 1][j] && hough_data[i][j] > hough_data[i - 1][j] &&hough_data[i][j] > hough_data[i][j + 1] &&hough_data[i][j] > hough_data[i][j - 1]){houghSpace[counts].rho = i * 2 - q_max;houghSpace[counts].angle = j * CV_PI / nAngles;houghSpace[counts].num = hough_data[i][j];counts++;}}// 得到了参数之后,画线for (k = 0; k < counts; k++){if (houghSpace[k].angle < 0.1){line(src, Point(0, houghSpace[k].rho), Point(src.cols, houghSpace[k].rho), Scalar(255, 0, 0));}else{line(src, Point(houghSpace[k].rho / sin(houghSpace[k].angle), 0), Point( 0, (houghSpace[k].rho / cos(houghSpace[k].angle))), Scalar(255, 0, 0));}}delete[] hough_data;delete[] houghSpace;imshow("edges", edges);imshow("hough", src);waitKey();return 0;}

效果如下:

图像处理(八):线段检测之Hough变换相关推荐

  1. 直线检测之Hough变换(霍夫变换)

    霍夫变换,英文名称Hough Transform,作用是用来检测图像中的直线或者圆等几何图形的. 给定一张图像中的n个点,假设我们希望找到这些点中一个位于直线上的点集,一种可行的解决方法是,先找到所有 ...

  2. 【车道线检测】Hough变换图片车道线检测 【含Matlab源码 276期】

    ⛄一.Hough变换图片车道线检测简介 1 引言 随着人们生活水平的提高, 科技的不断进步, 智能驾驶技术逐渐受到了研究者们的广泛研究和关注.先进驾驶辅助系统 (Advanced Driver Ass ...

  3. 基于Hough变换的直线和圆的检测与提取

    学数字图像处理有挺长时间了,正好最近这段时间有空,学习了一下Hough变换,作了几个比较简单的东西,分享出来,希望能和大家一起学习,也希望各位能提出宝贵的意见,共同进步,文采不好,欢迎拍砖,下面正式进 ...

  4. 图像处理之Hadamard变换和Hough变换

    一.Hadamard变换 1.基本原理 Hadamard变换相当于在原来的图像矩阵左右分别乘以一一个矩阵,这两个矩阵都是正交矩阵,称为Hadamard变换矩阵.Hadamard变换矩阵中所有的元素都是 ...

  5. python 检测直线 交点_Python+OpenCV图像处理——实现直线检测

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

  6. 新手学习opencv八---道路检测

    新手学习opencv八---道路检测 1)基础方法:hough变换 一般步骤: 1.读取图片或视频帧 2.边缘检测 3.hough变换检测图像或视频帧中的车道线段(直线) 4.标识检测结果 openc ...

  7. hough变换连接边缘matlab,边缘检测与Hough变换实验报告 Matlab - 图文

    <边缘检测与Hough变换实验报告 Matlab - 图文>由会员分享,可在线阅读,更多相关<边缘检测与Hough变换实验报告 Matlab - 图文(5页珍藏版)>请在人人文 ...

  8. 小白学习图像处理7——Hough变换检测直线

    文章目录 一.Hough变换的原理 1.过定点的直线方程 2.两点确定一条直线 3.方程的形式 二.实现过程 三.程序代码 1.程序片段 2.总程序 四.matlab 的hough函数 一.Hough ...

  9. hough变换检测圆周_一文解读经典霍夫变换(Hough Transform)

    引言 本文讲述霍夫变换的一些内容,并加入一些理解性东西,参考了部分博客等相关性内容.希望能对霍夫变换有所了解,也希望看到的人如果发现错误及时帮忙纠正.博主水平有限,还望赐教. 历史和简介 历史 霍夫变 ...

最新文章

  1. peleenet测试
  2. [Oracle] oracle统计信息
  3. python精要(82)-wxpython(3)-静态文本控件与状态栏
  4. 【求知探新】Unity中ShaderLab内存优化
  5. sql报表按月统计_用Excel如何对销售数据按月分别统计成本,销售额以及利润?...
  6. 解决win2008下IIS7的HTTP500错误
  7. mtk 驱动(55)---mtk指纹移植
  8. jmeter 参数化
  9. Operations map 运营图谱
  10. 我身边的那些有钱人。。
  11. 基于微信小程序的点餐系统
  12. SQL教程——连接查询之SQL99标准
  13. 下载论文的技巧及经验
  14. 哪个搜索引擎干净?无追踪无监控且保护用户隐私安全的小众搜索引擎推荐
  15. linux系统FW升降级步骤,一种用于在Linux系统下不重启系统实现LSIRAID卡FW升级的方法与流程...
  16. Vue3状态管理器大菠萝 Pinia 学习使用笔记
  17. HDOJ-----5773The All-purpose Zero(LIS)
  18. 小米商城前端页面(静态)
  19. Mathlab编程-微积分在Matlab中的解法
  20. 栈的基本操作 python

热门文章

  1. 编程计算1*2*3+3*4*5+5*6*7+...+99*100*101的值。
  2. C语言--期末前夜刷题计划(吉林大学高级语言程序设计超星慕课作业题为主)
  3. modelsim仿真系列之基于ISE的IP核的独立仿真(二)
  4. 基于Android studio的手机联系人信息获取
  5. Python 获取当天日期、前一天日期、前半个月
  6. android 自动唤醒解锁,Android-唤醒并解锁Devi
  7. 【Pytorch】区分detach()和torch.no_grad()
  8. 软件测试学习教程(一)-学习路线图
  9. Windows常见DOS命令
  10. python 爬虫 付费代理