【图像处理】Hough直线变换

2023-10-26

(I)直线篇

1 直线是如何表示的?
对于平面中的一条直线,在笛卡尔坐标系中,常见的有点斜式,两点式两种表示方法。然而在hough变换中,考虑的是另外一种表示方式:使用(r,theta)来表示一条直线。其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角。如下图所示。

2 如果坐标系中有多个点,又怎样识别出哪些点在一条直线上呢?
使用hough变换来检测直线的思想就是:为每一个点假设n个方向的直线,通常n=180,此时检测的直线的角度精度为1°,分别计算这n条直线的(r,theta)坐标,得到n个坐标点。如果要判断的点共有N个,最终得到的(r,theta)坐标有N*n个。有关这N*n个(r,theta)坐标,其中theta是离散的角度,共有180个取值。
最重要的地方来了,如果多个点在一条直线上,那么必有这多个点在theta=某个值theta_i时,这多个点的r近似相等于r_i。也就是说这多个点都在直线(r_i,theta_i)上。
3 下面拿个例子说明: 
如果空间中有3个点,如何判断这三个点在不在一个直线上,如果在,这条直线是的位置为?
 这个例子中,对于每个点均求过该点的6条直线的(r,theta)坐标,共求了3*6个(r,theta)坐标。可以发现在theta=60时,三个点的r都近似为80.7,由此可判定这三个点都在直线(80.7,60)上。
通过 r0theta 坐标系可以更直观表示这种关系,如下图:图中三个点的(r,theta)曲线汇集在一起,该交点就是同时经过这三个点的直线。 

在实际的直线检测情况中,如果超过一定数目的点拥有相同的(r,theta)坐标,那么就可以判定此处有一条直线。在r0theta 坐标系图中,明显的交汇点就标示一条检测出的直线。
如下图,可以判定出平面上的点共构成了两条直线,即检测出两条直线。

hough变换是如何检测出直线和圆的? - 钰央 - 计算机视觉·图像处理
4 代码:(该代码只能检测二值图像,非二值图像必须与处理)
  1. IplImage *pGrayImage = cvLoadImage( "C:\\Users\\徐图之\\Desktop\\source.bmp", -1);
  2. IplImage *pCannyImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, 1);
  3. cvCanny(pGrayImage, pCannyImage, 30, 90);
  4. cvSmooth(pCannyImage, pCannyImage);
  5. // 线段检测(只能针对二值图像)
  6. CvMemStorage *pcvMStorage = cvCreateMemStorage();
  7. double fRho = 1;
  8. double fTheta = CV_PI / 180;
  9. int nMaxLineNumber = 50; //最多检测条直线
  10. double fMinLineLen = 150; //最小线段长度
  11. double fMinLineGap = 10; //最小线段间隔
  12. CvSeq *pcvSeqLines = cvHoughLines2(pCannyImage, pcvMStorage, CV_HOUGH_PROBABILISTIC, fRho, fTheta, nMaxLineNumber, fMinLineLen, fMinLineGap);
  13. // 绘制线段
  14. IplImage *pColorImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, 3);
  15. cvCvtColor(pCannyImage, pColorImage, CV_GRAY2BGR);
  16. for ( int i = 0; i < pcvSeqLines->total; i++)
  17. {
  18. CvPoint* line = (CvPoint*)cvGetSeqElem(pcvSeqLines, i);
  19. cvLine(pColorImage, line[ 0], line[ 1], CV_RGB( 255, 0, 0), 2);
  20. }
  21. cvNamedWindow( "pstrWindowsSrcTitle", CV_WINDOW_AUTOSIZE);
  22. cvShowImage( "pstrWindowsSrcTitle", pGrayImage);
  23. cvNamedWindow( "pstrWindowsLineName", CV_WINDOW_AUTOSIZE);
  24. cvShowImage( "pstrWindowsLineName", pColorImage);
  25. cvWaitKey( 0);
  26. cvReleaseMemStorage(&pcvMStorage);
  27. cvDestroyWindow( "pstrWindowsSrcTitle");
  28. cvDestroyWindow( "pstrWindowsLineName");
  29. cvReleaseImage(&pGrayImage);
  30. cvReleaseImage(&pCannyImage);
  31. cvReleaseImage(&pColorImage);

效果图:
 
5,opencv函数参数讲解:
函数功能:检测图像中的线段
函数原型:
CvSeq* cvHoughLines2(
  CvArr* image,
  void* line_storage,
  int method,
  double rho,
  double theta,
  int threshold,
  double param1=0, double param2=0
);
参数说明:
第一个参数表示输入图像,必须为二值图像(黑白图)。
第二个参数表示存储容器,和上一篇的轮廓检测一样,可以传入CvMemStorage类型的指针。
第三个参数表示变换变量,可以取下面的值:
  CV_HOUGH_STANDARD - 传统或标准 Hough 变换. 每一个线段由两个浮点数 (ρ, θ) 表示,其中 ρ 是线段与原点 (0,0) 之间的距离,θ 线段与 x-轴之间的夹角。
  CV_HOUGH_PROBABILISTIC - 概率 Hough 变换(如果图像包含一些长的线性分割,则效率更高)。它返回线段分割而不是整个线段。每个分割用起点和终点来表示。
  CV_HOUGH_MULTI_SCALE - 传统 Hough 变换的多尺度变种。线段的编码方式与 CV_HOUGH_STANDARD 的一致。
第四个参数表示与象素相关单位的距离精度。
第五个参数表示弧度测量的角度精度。
第六个参数表示检测线段的最大条数,如果已经检测这么多条线段,函数返回。
第七个参数与第三个参数有关,其意义如下:
  对传统 Hough 变换,不使用(0).
  对概率 Hough 变换,它是最小线段长度.
  对多尺度 Hough 变换,它是距离精度 rho 的分母 (大致的距离精度是 rho 而精确的应该是 rho / param1 ).
第八个参数与第三个参数有关,其意义如下:
  对传统 Hough 变换,不使用 (0).
  对概率 Hough 变换,这个参数表示在同一条线段上进行碎线段连接的最大间隔值(gap), 即当同一条线段上的两条碎线段之间的间隔小于param2时,将其合二为一。
  对多尺度 Hough 变换,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精确的角度应该是 theta / param2).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【图像处理】Hough直线变换 的相关文章

  • Matlab-数字图像处理-获取图片rgb颜色分量及截取子图

    Matlab 数字图像处理基础实验 获取图片rgb颜色分量及截取子图 Problem Statement 问题描述 1 Proficient in Matlab tools and complete two Matlab functions
  • Matlab:尝试将 SCRIPT XXX 作为函数执行的解决方案

    Matlab 尝试将 SCRIPT XXX 作为函数执行的解决方案 最近在做图像处理小实验的过程中遇到了无比沙雕的情况 被自己佛了 最近真的智商不在线 或者没在线过 先描述一下问题 在Matlab中调用直方图均衡化函数histeq 但是出现
  • 数字图像处理-python基于opencv代码实现 反转变换、对数变换和幂律(伽马)变换

    本文主要介绍对 数字图像处理 第三章书中示例图片实现 反转变换 对数变换以及伽马变换的代码 若要获取更多数字图像处理 python 深度学习 机器学习 计算机视觉等高清PDF以及 更多有意思的 分享 可搜一搜 微信公共号 分享猿 免费获取资
  • 在MFC中使用OpenCV2.3.1

    最近要做数字图像处理的项目 大家都说VS MFC OpenCV很好用 于是我就试着弄了下 首先我到OpenCV ChinaOpenCV中文版主页找了一些很不错的教程开始做了 我用的是Visual Studio 2005 OpenCV的版本是
  • 【数字图像处理】四.MFC对话框绘制灰度直方图

    本文主要讲述基于VC 6 0 MFC图像处理的应用知识 主要结合自己大三所学课程 数字图像处理 及课件进行回忆讲解 主要通过MFC单文档视图实现点击弹出对话框绘制BMP图片的灰度直方图 再获取平均灰度 中指灰度和标准差等值 文章比较详细基础
  • 【OpenCV】噪声的添加和过滤

    1 简介 下面简单介绍两种图像噪声 即椒盐噪声和高斯噪声 1 椒盐噪声 椒盐噪声也称脉冲噪声 它是一种随机出现的白点或者黑点 可能是亮的区域有黑色像素或是在暗的区域有白色像素 或是两者皆有 图像模拟添加椒盐噪声是通过 随机获取像素点 并设置
  • 数字图像隐藏图像的两种算法及实现代码

    数字图像 二值图像 也叫单色图像 是将每个像素点存放在一个bit空间 值为0或者1 的图像 也就是说每个像素 非黑即白 主要用于图像形态学的研究 8位灰度图像 每个像素存放在一个byte空间 8位 0 255 0表示最暗色黑色 255表示最
  • 图像融合算法(像素级)

    图像融合技术可以提取自然光图像和红外图像的互补信息 获得对同一场景描述解释更为准确 全面和可靠的图像 像素级融合是常用于灰度图像与可见光图像的融合 基于源图像的彩色化就是源图像和目标图像的融合过程 使其同时兼有源图像的颜色和目标图像的形状
  • 计算二维离散随机变量的联合概率分布

    一 定义 Joint probability distribution 给定至少两个随机变量X Y 它们的联合概率分布 Joint probability distribution 指的是每一个随机变量的值落入特定范围或者离散点集合内的概率
  • 【图像处理】彩色图直方图统计

    首先要知道彩色图是没有直方图的 只能在rgb方向分别求直方图在合并一下 干脆不用这么麻烦 用rgb2gray转到灰度图 再在二维上进行直方图绘制 最后还提供了代码 找出直方图中横坐标 像素值 为50以下的纵坐标 以此为像素的个数 的和 cl
  • [Android] 通过Menu实现图片怀旧、浮雕、模糊、光照和素描效果

    由于随手拍项目想做成类似于美图秀秀那种底部有一排Menu实现不同效果的功能 这里先简单介绍如何通过Menu实现打开相册中的图片 怀旧效果 浮雕效果 光照效果和素描效果 后面可能会讲述如何通过PopupWindow实现自定义的Menu效果 希
  • 数字图像处理:局部直方图处理(Local Histogram Processing)

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 在前面章节 数字图像处理 直方图均衡学习总结 感悟 数字图像直方图匹配或规定化Histogram Matching Specific
  • 一文了解视频编解码原理

    视频编解码算法分为传统算法和基于深度学习的方法 本文主要介绍视频编解码技术的原理 部分内容和图片参考网上技术博客 链接已放在文章末尾 一 基本术语 数字图像的定义及理解可以参考这篇文章 数字图像处理笔记 一文搞懂数字图像基础 颜色深度 存储
  • 动态DPC算法学习

    造成坏点的原因 感光元件芯片自身工艺技术瑕疵造成 光线采集存在缺陷 制造商产品差异 坏点分类 hot pixel 固定保持较高的像素值 一般呈现为画面高亮的点 dead pixel 固定保持较低的像素值 一般在画面中呈现为暗点 noise
  • 基于Arnold变换的图像置乱-Matlab实现

    Arnold变换是俄国数学家VladimirI Arnold提出的一种变换 一幅M N的数字图像的二维Arnold 变换定义为 xn 1yn 1 1abab 1 xnyn mod N x n
  • 滤波去噪和小波去噪

    原文 http zhidao baidu com linkurl 7vqgj2oQ4MacZxGLdJXM lTCDdW3TrY6hbeInWeW7NWgcCFjO8qHbbm0U8lONrAanc6BQR7WwJB0GRzgZXZQLK
  • 【图像处理】去雾算法

    真正了解了什么叫最简单的就是最美好的 真正的好文章不需要大堆公式堆积显得充实 而是最最平实的思想 这篇文章的 原文PDF PPT 感兴趣的可以了解一下 这篇文章的目的就是以最简单的思路将图像达到去雾效果 用Matlab编了一下 效果图特别好
  • Matlab 常用快捷键

    MATLAB Numpy函数对照表 http mathesaurus sourceforge net matlab python xref pdf 常见快捷键 Ctrl R 注释代码 Ctrl T 取消注释代码 Ctrl 或 先将光标移动到
  • 数字图像处理-离散傅里叶变换(opencv3+C++显示)

    参考 http daily zhihu com story 3935067 http blog csdn net keith bb article details 53389819 在学习信号与系统或通信原理等课程里面可能对傅里叶变换有了一
  • 【保姆级教程】使用tensorflow_hub的预训练模型实现神经风格迁移

    目录 一 神经风格迁移 二 安装依赖 三 实践 四 其他 一 神经风格迁移 神经风格迁移 是一种优化技术 主要将两个图像 内容 图像 和 风格

随机推荐

  • SpringCloudAlibaba微服务架构搭建(四)Gateway网关(包含源码)

    目录 前言 1 什么是Spring Cloud Gateway 2 核心概念与架构解析 1 Route 路由 2 谓语 断言 3 Filter 过滤器 4 负载均衡与动态路由 编辑 3 请求路由与负载均衡 请求路由 负载均衡 动态路由 4
  • 常用文件扩展名介绍

    我们对文件命名是以扩展名加以区分 即文件名格式为 主文件名 扩展名 系统文件按照不同的格式和用途进行分类 以下是常用文件扩展名介绍 1 txt 记事本 2 doc docx word文档 3 xls xlsx excel表格 4 ppt p
  • chatgpt每日问答

    20230411 将数组转成十六进制字符串 array 12 34 56 78 90 hex string join 02x format x for x in array print hex string 20230409 变声 用pyt
  • 中文情感分类

    本文通过ChnSentiCorp数据集介绍了文本分类任务过程 主要使用预训练语言模型bert base chinese直接在测试集上进行测试 也简要介绍了模型训练流程 不过最后没有保存训练好的模型 一 任务和数据集介绍 1 任务 中文情感分
  • 【spring boot】service层事务控制

    我们再做spring boot项目的时候 经常需要在一个service层调用多个dao层 操作不同的数据库表来实现业务 这个时候要对事务进行一个统一的过程 spring boot提供了这种支持 首先需要在service层添加 Transac
  • JSP数据交互(二)---》jsp四大作用域

    jsp四大作用域 application作用域 对应整个应用上下文 page作用域 作用域指本JSP页面范围 pageContext setAttribute 键 值 pageContext getAttribute 键 为
  • 电商平台数据查询工具(京东数据分析软件)

    京东爆款如何打造 是很多商家都头疼的问题 下面 6个步骤分享给大家 首先是选品 对于处于不同阶段的商家来说 选品方式不同 针对正准备开店的商家 选品可通过以下方式 1 市场分析和自身情况 确定主打品类 2 行业市场和京东平台市场 品类多维度
  • 使用R语言生成相同分组数据的抽样ID,并生成测试集和训练集

    使用R语言生成相同分组数据的抽样ID 并生成测试集和训练集 在进行数据分析或机器学习任务时 我们经常需要将数据集划分为训练集和测试集 为了确保实验结果的可复现性 我们需要为相同分组的数据生成相同的抽样ID 本文将介绍如何使用R语言实现这一过
  • pbr制作

    http www aboutcg org course tut sd 141015 http www zf3d com news asp id 27081
  • 数学中的导数

    导数 Derivative 是微积分学 微积分学是研究极限 微分学 积分学和无穷级数等的一个数学分支 中重要的基础概念 一个函数在某一点的导数描述了这个函数在这一点附件的变化率 导数的本质是通过极限的概念对函数进行局部的线性逼近 当函数f的
  • python代码,两个4*4旋转矩阵之间的位姿变化,相对旋转矩阵

    python代码 两个4 4旋转矩阵之间的位姿变化 也就是求两个旋转矩阵之间的相对旋转矩阵 import numpy as np def get transform matrix rot mat1 rot mat2 Calculate th
  • asp.net毕业设计题目选择

    1 asp net 超市管理系统 rar 2 客户关系系统 rar 3 ASP NET BS结构的城市酒店入住信息管理系统的设计 源代码 论文 rar 4 asp net FTP客户端设计与开发 源代码 论文 rar 5 ASP NET 网
  • DNS 配置错误

    curl 6 Could not resolve host 今天看 ttrss 的时候发现文章都是两天前的了 感觉不太对劲 经过查验提示curl 6 Could not resolve host 在查找过资料后 是 DNS 出现了 下面给出
  • 前端工程化(2):postCss 和 babel的使用

    前端工程化 2 postCss 和 babel的使用 本文例子可以点击这里 0 前言 babel是什么 官网给出的定义 Babel 是一个工具链 主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript
  • eclipse was unable to locate its companion shared library

    当转移或者Copy工程时 eclipse was unable to locate its companion shared library eclipse ini 里面的路径配置错误导致 launcher library C Users
  • 三个好用前端编辑工具推荐+推荐原因(VSCode、WebStrom、HbuilderX 的推荐对比,不纠结 !)

    市面上编辑器挺多的 之前写过一期 一年了 更新一下 先上结论 如果 电脑配置差 颜狗 建议用VSCode 如果 你认为你0基础还笨 建议用Hbuider培养兴趣 否则 WebStorm 暂时是前端写代码的无二选择 或者 我全都要 以下是个人
  • 泛型类, 泛型接口的继承, 委托, 反射

    使用泛型定义一个父类 using System using System Collections Generic using System Linq using System Text using System Threading Task
  • 编译原理之LL(1) 、LR(0)、SLR、LR(1)、LALR文法的对比

    欢迎关注我的个人博客 www zuzhiang cn 考完编译原理有一段时间了 记得当时都被以上这五种文法搞懵了 所以希望写篇文章帮助那些正在学习的人 以下内容是依据龙书中文版讲解的 由于老师不同可能某些地方大同小异 如有什么纰漏之处还请指
  • 【更新中】目标检测——梳理,准备面试

    最近在准备找工作面试 本文在此梳理了目标检测中涉及的面试要用的知识点 包含了一下几方面 My paper reading 过程总结 实际步骤 所花时间 评价 改进 先看了abstract 1 introduction 以及 4 relate
  • 【图像处理】Hough直线变换

    I 直线篇 1 直线是如何表示的 对于平面中的一条直线 在笛卡尔坐标系中 常见的有点斜式 两点式两种表示方法 然而在hough变换中 考虑的是另外一种表示方式 使用 r theta 来表示一条直线 其中r为该直线到原点的距离 theta为该