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

news/2024/4/29 14:04:37/文章来源:https://blog.csdn.net/qq_44886601/article/details/127847065

目录

1. Hough 直线检测

2. HoughLinesP 函数


1. Hough 直线检测

霍夫变换(Hough 变换):利用对偶原理,把原空间的问题转换到对偶空间去求解

这里涉及到空间转换,将原来的笛卡尔空间(xy空间)转换到参数空间(霍夫空间)

例如:笛卡尔空间上的一个位置确定的点(x0,y0),经过这个点的直线方程为:y0= k * x0 + b。这里可以知道,由于k、b的不确定性,因此这个直线是无数条

将笛卡尔空间上的方程进行简单变换 b = - x0 * k + y0 的形式(这里新的坐标轴是k、b,也叫参数空间或者霍夫空间)。由于(x0,y0)是已知的,(k、b)是未知的参数,那么在笛卡尔空间就是一个确定的点(想象这个点是由无数条直线相交同一点确定的)。因此在参数空间,就是一条斜率为-x0,截距为y0的直线(k、b未确定,因此在参数空间,是kb定义域是R的一条直线)。所以,我们得出的结论是:笛卡尔空间上面的一个确定点,对应参数空间(霍夫空间)上的一条确定的直线

例如:笛卡尔空间(x0 =  1,y0 = 2),那么在笛卡尔空间由无数条直线相交于同一点的方程是:y = k(x - 1) + 2 = k*x + 2-k(这里2-k是b)

因此在参数空间是: 2-k = -x * k + y ------> b = -x * k + y----带入(1,2)-----> b = -k + 2 


如果,笛卡尔空间上还有一点(x1,y1)的话,那么这一点也对应一条参数空间的一条直线。并且在笛卡尔空间,由于两点必可以确定一条直线,因此在参数空间的效果就是,两条直线必相交于一点。可以得出结论:笛卡尔空间的一条直线,对应参数空间(霍夫空间)上的一个确定的点

例如:笛卡尔空间的两个点(1,2)(2,3)

  • 点(1,2)在笛卡尔空间y = kx + 2-k ,转到参数空间为2-k = -xk + y,带入(1,2)得:b = 2-k = -x*k+y = - k + 2
  • 点(2,3)在笛卡尔空间y = kx + 3- 2k ,转到参数空间为3-2k = -xk + y,带入(2,3)得:b = 3 - 2k = -x*k+y = -2 * k + 3

在笛卡尔空间两点得到的直线方程为:y = x + 1

在参数空间两条直线得到的交点为:k = 1 ,b = 1

笛卡尔空间直线的k、b,就是参数空间点的坐标(k,b)


所以,如果需要做直线检测的话,将笛卡尔空间上的点映射到参数空间对应一条直线。然后如果映射前,笛卡尔空间点在一条直线上的话,那么对应参数空间直线就会相交到同一点上。 

因此,图像上主要直线可以通过标识参数空间中大量直线相交的点来确定

上述的变换是可行的,但是有个缺点是,当笛卡尔空间是垂直的直线是,对应参数空间的k是无穷大的,且截距b无法取值。解决的思路是将参数空间改为极坐标空间,将直线转为(r,θ)空间多个曲线的交点

2. HoughLinesP 函数

  •  返回值格式为:[[[x1,y1,x2,y2]]] 

代码:

import numpy as np
import cv2img = cv2.imread('./chessboard.png',1)              # 读取图像
img = cv2.GaussianBlur(img,(7,7),sigmaX=1)          # 高斯模糊图像img_bin = cv2.Canny(img,50,100)                     # 得到二值图像lines = cv2.HoughLinesP(img_bin,1,np.pi / 180,threshold= 10)  # Hough 变换
for line in lines:x1,y1,x2,y2 = line[0]                           # 提取线段cv2.line(img,(x1,y1),(x2,y2),(0,0,255),1)       # 在原图上绘制线段cv2.imshow('Canny',img_bin)                         # 显示 Canny 检测的图像
cv2.imshow('img',img)
cv2.waitKey()
cv2.destroyAllWindows()

 处理结果为:

 

这里的lines 返回的shape是(n,1,4),n代表n条直线,(1,4)是一行四列每个线段的起点和末端点

所以line去迭代lines,就得到(1,4)的line,然后line[0] 就可以将起点、终止点取出来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_224061.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

App安全架构之前端安全防护

近年来,随着互联网、物联网、移动设备、5G通讯等技术的齐头发展,人类的生活和工作越来越离不开软件和互联网,正如人类社会文明发展到一定程度以后,会需要法律等社会规范来保护一样,线上环境也是一样道理。 Gartner 对…

Python学习小组课程-课程大纲与Python开发环境安装

一、前言 注意:此为内部小组学习资料,非售卖品,仅供学习参考。 为提升项目落地的逻辑思维能力,以及通过自我创造工具来提升工作效率,特成立Python学习小组。计划每周花一个小时进行在线会议直播学习,面向…

国内访问Github超级慢?那是你没有用我这个脚本。直接起飞。

导语 之前很多朋友咨询过国内访问Github较慢的问题,然后我一般让他们自己去知乎上找攻略,但今天我才发现网上竟然没有一个一键配置的脚本,一般都需要我们跟着教程一步步地去做才行。这也太麻烦了,于是自己动手写了个脚本&#xf…

ceph浅谈

总谈 ceph简介 用上ceph,多台机器的磁盘空间在一起了,在一台机器上就可以看到使用所有空间。 还可以保存多份安全备份 存储先ceph,自我管理修复,跨机房,节点越多,并行化,论上,节点越…

1-(3-磺酸基)丙基-1-甲基-2-吡咯烷酮三氟甲磺酸盐[C3SO3Hnmp]CF3SO3

1-(3-磺酸基)丙基-1-甲基-2-吡咯烷酮三氟甲磺酸盐[C3SO3Hnmp]CF3SO3 离子液体(IonicLiquids)是完全由离子组成,现在多指在低于100摄氏度时呈液体状态的熔盐。通常由特定的有机阳离子和无机阴离子(或有机阴离子)构成。 离子液体特点 蒸汽压…

C++基础——模板讲解

目录 一. 泛型编程 二. 函数模板 1.格式: 2.定义: 1.隐式实例化 2.显式实例化 3.解决方法3:使用多个T类型 4.在C中编译器允许非模板函数和模板函数同时存在 一. 泛型编程 先来看一段代码: void Swap(int& p1, int&am…

LeetCode:8. 字符串转换整数 (atoi)

8. 字符串转换整数 (atoi)1)题目2)思路3)代码4)结果1)题目 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数…

逻辑判断与正则表达式文本处理

上一篇文章分享了正则表达式的操作,这一篇文章就让我们一起看看正则表达式与逻辑判断结合起来会发生什么吧!感兴趣的小伙伴欢迎评论区或者是私信留言! 一、题目描述: 输入一个字符串,检查其是否为合法的python变量。输入$$$结束:…

数据结构【队列】

文章目录(一)队列定义(二)队列实现(1)创建结构体(2)具体函数实现及解析1.1 初始化队列1.2入队列1.3出队列1.4取队首元素1.5取队尾元素1.6返回队列个数1.7判断是否为空1.8销毁队列&am…

FITC标记的STAT1-ASON,绿色荧光素标记STAT1反义寡核苷酸,FITC-STAT1-ASON

产品名称:FITC标记的STAT1-ASON,绿色荧光素标记STAT1反义寡核苷酸 ​​​​​​​英文名称:FITC-STAT1-ASON STAT1 是第一个被发现的 STATs 家族成员,其编码基因位于 2 号染色体上,由 750 个氨基酸残基组成&#xff…

随想录一刷Day55——动态规划

文章目录Day55_动态规划47. 判断子序列48. 不同的子序列Day55_动态规划 47. 判断子序列 392. 判断子序列 思路: 双指针很简单,O(n)O(n)O(n) 时间就能解决 这里还是用dp dp[i][j] 表示以 s[i - 1] 结尾的字符串和以 t[]i-1 为结尾的字符串的最大子序列长…

Linux篇【5】:Linux 进程概念(二)

目录 3.5、查看进程 3.6、通过系统调用接口获取正在进行的进程的标识符 3.7、通过系统调用接口创建子进程 - fork 初识 3.5、查看进程 [HJMhjmlcc ~]$ clear [HJMhjmlcc ~]$ pwd /home/HJM [HJMhjmlcc ~]$ ls [HJMhjmlcc ~]$ touch mytest.c [HJMhjmlcc ~]$ ls mytest.c [H…

基于51单片机的简易数字计算器Proteus仿真

资料编号:115 下面是相关功能视频演示: 115-基于51单片机的简易数字计算器Proteus仿真(源码仿真全套资料)功能说明: 该计算器系统51 系列的单片机进行的数字计算器系统设计,可以完成计算器的键盘输入&…

一看就会的Java方法

文章目录一、方法的定义和使用🍑1、为什么引入方法?🍑2、方法的定义🍑3、方法调用的执行过程🍑4、实参和形参的关系二、方法重载🍑1、为什么需要方法重载🍑2、方法重载的概念和特点&#x1f351…

用DIV+CSS技术设计的体育主题网站(足球介绍)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【面经】之小鼠喝药问题

题目 现在有 10 只小白鼠和 1000 支药水,1000 支药水中有且仅有一支药水有毒,如果小白鼠喝下毒药,那么毒发的时间是两小时。 现在只给你两小时的时间,请问如何用这 10 只小白鼠测出哪支药水有毒?(忽略小白…

linux系统文件权限

目录 shell命令以及运行原理 具体体现(命令行解释器) Linux权限的概念 Linux下有两种用户:超级用户(root)、普通用户 su指令 Linux权限管理方面 文件访问者的分类(人) 为什么要有所属组? 文件属性…

STM32 Bootloader开发记录 2

在《stm32 bootloader开发记录.md》文档中,已经实现了Bootloader下的升级功能。可以在Bootloader启动时,进入升级模式,使用串口传输数据,来下载固件到flash中。 但是,在实际应用中,一般是在应用运行过程中…

基于单片机的指纹门禁设计

功能: 研究内容:本课题以单片机为核心采用C语言来开发一指纹电子密码锁。系统拟在Altium Designer9开发平台上设计原理图,并绘制PCB并制成单片机开发板,然后根据原理图将相关元器件焊接到开发板上。软件部分在Keil uVision4开发…

餐饮美食网页设计(HTML+CSS+JavaScript)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…