【OpenCV-Python】教程:3-13 Hough直线变换

news2024/9/30 11:27:02

OpenCV Python Hough直线变换

【目标】

  • 理解Hough变换的概念
  • 学会使用Hough变换检测直线
  • cv2.HoughLines(), cv2.HoughLinesP()

【理论】

Hough 变换是一个非常有用的技术,可以检测任何形状,只要那个形状可以通过数学方程表示出来,即使检测的形状断裂或者轻微变形。

直线方程为:

y = m x + c y=mx+c y=mx+c

或者极坐标参数表示形式:

ρ = x ∗ cos ⁡ θ + y ∗ sin ⁡ θ \rho=x*\cos\theta+y*\sin\theta ρ=xcosθ+ysinθ

其中, ρ \rho ρ是原点到直线的垂直距离, θ \theta θ是垂直线与逆时针测量的水平轴形成的角度。

任何直线都可以用 ( ρ , θ ) (\rho,\theta) (ρ,θ) 来表示。Hough变换是如何检测直线的呢?首先它创建一个2D数组或累加器,并将其初始设置为 0,设行表示 ρ \rho ρ,列表示 θ \theta θ。数组的大小取决于精度,假设角度的精度为1度,则需要180列。对于 ρ \rho ρ,可能的最大距离是图像的对角线长度。因此,以一个像素的精度计算,行数可以是图像的对角线长度。

假设一个 100 ∗ 100 100*100 100100的图像,在图像中间有一个水平线,取这条线的第一个点 ( x , y ) (x,y) (x,y),计算 ( ρ , θ ) (\rho,\theta) (ρ,θ),对于每一个 ( ρ , θ ) (\rho,\theta) (ρ,θ) ,如果 ( x , y ) (x,y) (x,y)能找到对应的 ( ρ , θ ) (\rho,\theta) (ρ,θ),增加递增器的值。循环往复,对图像中所有的点都进行查找搜寻,不停的对每个 ( ρ , θ ) (\rho,\theta) (ρ,θ) 进行投票,假设在 ( 50 , 90 ) (50,90) (50,90)投票最多,请看下面的动画。

houghlinesdemo.gif
Image Courtesy: Amos Storkey

houghlines2.jpg

概率 Hough 变换

在Hough变换中,尽管一条直线只有两个参数,但是还需要很多计算量,概率 Hough 变换是其中的一种优化,它不会将所有的点都考虑进去,相反,它会考虑一些能够充分进行直线检测的随机点集。我们必须降低 threshold,流程图如下:

houghlines4.pngimage
Image Courtesy : Franck Bettinger's home page

OpenCV 的实现基于 Robust Detection of Lines Using the Progressive Probabilistic Hough Transform by Matas, J. and Galambos, C. and Kittler, J.V. [166]. 函数为 cv2.HoughLinesP()

【代码】

在这里插入图片描述

import cv2
import numpy as np

# 读入图像
img = cv2.imread('assets/sudoku.png')

# 灰度化
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 边缘检测
edges = cv2.Canny(gray, threshold1=50, threshold2=150, apertureSize = 3)

# 直线检测
lines = cv2.HoughLines(edges, rho=1, theta=np.pi/180, threshold=150 )


for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)

cv2.imshow("line", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.HoughLinesP

在这里插入图片描述

import cv2
import numpy as np

# 读入图像
img = cv2.imread('assets/sudoku.png')

# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 边缘检测
edges = cv2.Canny(gray, threshold1=50, threshold2=150, apertureSize=3)

# 直线检测
lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=100, minLineLength=100, maxLineGap=10)

for line in lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(img, (x1, y1), (x2, y2), color=(0, 255, 0), thickness=2)

cv2.imshow("line", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【接口】

  • HoughLines
cv.HoughLines(	image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]	) ->	lines

用标准的Hough变换找二值图像中的直线

  • image: 8位单通道二值图像,图像可能被篡改
  • lines: 输出的直线 vector/list,每个直线是 ( ρ , θ , v o t e s ) (\rho, \theta, votes) (ρ,θ,votes) 表示, ρ \rho ρ是图像原点(左上角)到直线的距离, θ \theta θ是旋转的弧度,(0~vertical_line, pi/2 ~ horizontal line), v o t e s votes votes是投票值。
  • rho: 距离精度,单位像素
  • theta: 角度精度,单位弧度
  • threshold: 累积阈值,主要用于对投票值进行限制,只返 v o t e s votes votes 大于该值的 line
  • srn: 多尺度的Hough变换,是 rho 的除数,如果srn为0和stn=0时,则使用经典Hough变换,否则,这两个参数都应为正值,
  • stn: 多尺度的Hough变换,是 theta 的除数,
  • min_theta: 对于标准和多尺度的Hough变换,检测线条的最小角度,必须介于 0 ~ max_theta 之间。
  • max_theta: 对于标准和多尺度的Hough变换,检测线条的最大角度,必须介于min_theta ~ CV_PI之间。
  • HoughLinesP
cv.HoughLinesP(	image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]	) ->	lines

利用概率 Hough 变换在二值图中找直线

  • image: 8位单通道二值图像,图像可能被篡改
  • lines: 输出的直线 vector/list,每个直线是 ( x 1 , y 1 , x 2 , y 2 ) (x1,y1, x2, y2) (x1,y1,x2,y2), 他们分别是线段的端点
  • rho: 距离精度,单位像素
  • theta: 角度精度,单位弧度
  • threshold: 累积阈值,主要用于对投票值进行限制,只返 v o t e s votes votes 大于该值的 line
  • minLineLength: 最小的直线长度,小于该长度的被拒绝掉。
  • maxLineGap: 允许同一条直线上连接两点之间最大的间隔。

【参考】

  1. OpenCV官方文档
  2. Hough Transform on Wikipedia
  3. Hough Transform

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计springboot小区疫情事件处理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

传感器_三相-双极性-开关型-霍尔传感器 速度+电角度解算理解

1 前言 最近项目上涉及到使用三相-双极性-开关型-霍尔传感器解算 电机转速 、电角度的问题。结合自己的理解请教前辈,终有所得,下面做一个学习的记录。 主要以思路为主,不涉及代码。 2 正文 2.1 什么是三相? 所谓三相-双极性-…

毕设项目 - SSM农业商品信息管理权限后台子系统(含源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi,各位同学好呀,这里是M学姐! 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品,【基于SSM的农业商品…

(算法设计与分析)第四章贪心算法-第一节:贪心算法概述

文章目录一:贪心算法(1)概述(2)特点(3)框架二:典型贪心算法问题(1)无重叠区间①:题目描述②:解题思路③:完整代码&#xf…

【Android App】人脸识别中扫描识别二维码实战解析(附源码和演示 超详细)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、扫描识别二维码 不仅可以利用zxing库生成二维码,同样利用zxing库可以扫描二维码并解析得到原始文本,此时除了给build.gradle添加如下一行依赖配置 implementation com.google.zxing:core:3.4.1 还需要…

一文读懂什么是云原生|推荐收藏

Forrester数据显示,在2021年,全球云原生应用持续上升,组织中容器和无服务器技术的使用率在一年内都增长了75%以上。 Gartner预测,到2025年,将会有超过95%的新数字工作负载被部署在云原生平台上。 “未来的软件一定是长…

Qt第二十六章:QWidget、QMainWindow自定义标题栏

工具类(读者直接复制到项目中) class QCustomTitleBar:def __init__(self, window: QtWidgets):self.window window# 默认标题栏高度 必须设self.DEFAULT_TITILE_BAR_HEIGHT 40# 存储父类的双击事件self.mouseDoubleClickEvent_parent self.window.mo…

【数学】旋转后仍为函数图像问题

∣旋转后仍为函数图像问题NightguardSeries.∣\begin{vmatrix}\huge{\textsf{ 旋转后仍为函数图像问题 }}\\\texttt{ Nightguard Series. }\end{vmatrix}∣∣∣∣∣​ 旋转后仍为函数图像问题 Nightguard Series. ​∣∣∣∣∣​ ♣例1\clubsuit \textsf{例1}♣例1 f(x)ln⁡(x…

经典bloom算法(**布隆过滤器**)-levelDB拆分

bloom算法(布隆过滤器) 原理 先说一下什么是布隆过滤器,Bloom Filter是1970年由布隆提出的,它实际上是一个很长的二进制向量,和一系列随机值映射的函数,主要用于判断一个元素是否在一个集合中。 通常判断一个元素是否在一个集合…

Hasse diagram

In order theory, a Hasse diagram (/ˈhsə/; German: [ˈhasə]) is a type of mathematical diagram used to represent a finite partially ordered set, in the form of a drawing of its transitive reduction. Concretely, for a partially ordered set (S, ≤) one rep…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生宿舍管理信息系统3x4rz

做毕业设计一定要选好题目。毕设想简单,其实很简单。这里给几点建议: 1:首先,学会收集整理,年年专业都一样,岁岁毕业人不同。很多人在做毕业设计的时候,都犯了一个错误,那就是不借鉴…

記錄下用google colab 进行GPU(TPU)训练

文章目录温馨提示打开网站上传资源下载资源到google colab温馨提示 需要科学上网,没有的话可以点这个 https://shandianpro.com/#/register?codewCXwkCOU下个clashx进行 挂载 https://download.csdn.net/download/monk96/87231589 配置自行百度 打开网站 google…

Win11系统提示backgroundtaskhost.exe系统错误解决方法

Win11系统提示backgroundtaskhost.exe系统错误解决方法分享。backgroundTaskHost.exe是与Microsoft Cortana的虚拟助手相关联的关键系统进程。近期有Win11用户在电脑的使用中遇到了系统提示“backgroundTaskHost.exe – ApplicATIon Error”的错误,今天我们一起来看…

[附源码]计算机毕业设计JAVA学生考试成绩分析系统

[附源码]计算机毕业设计JAVA学生考试成绩分析系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

疫情可视化part3

前言 之前在part2中说的添加自定义主题配色已经开发完成了,除此之外我还添加了一些的3d特效。 前期文章 这是part1的文章:https://blog.csdn.net/xi1213/article/details/126824752这是part2的文章:https://blog.csdn.net/xi1213/article/…

[附源码]Python计算机毕业设计Django基于VUE的网上订餐系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【Linux】进程

1.linux操作系统要不要管理进程呢?必须要!!!!!!!!! 2.linux是如何管理大量进程的呢?先组织,再描述。 1.什么是进程 进程就是系统运行中…

WordPress批量修改数据库内文章内容文字关键字标题

WordPress网站内容标题文字一键修改,注意到了网站上很多要一个个的修改,那工作了巨大,怎么快速在数据库中用SQL命令批量替换呢? 通过数据库替换方法 1.进入宝塔面板-数据库-选择对应的数据库-管理数据库-登录进来。就可以直接对数…

2022年小美赛“认证杯”数学建模ABCD题初步分析选题建议

​ 2022年小美赛数学建模赛题已经发布: A题 翼龙是如何飞行的 B题 序列的遗传过程 C题 对人类活动进行分类 D题 是否应长期禁止野生动物贸易 总体来说,从赛题难度来看B>A>C>D,其中CD属于ICM交叉学科类赛题,难度系数相对…

腾讯云原生安全“3+1”一体化方案发布,重构云上安全防御体系

12月1日,2022腾讯全球数字生态大会上,以“安全守护,行稳致远”为主题的「云原生安全专场」顺利召开,论坛深入讨论了云原生安全的行业发展趋势、技术探索、产品创新和落地实践。 会上,腾讯安全发布了云原生安全“31”一…