霍夫变换找直线python代码以及从极坐标到笛卡尔坐标的转换

图像霍夫变换找直线

霍夫变换(Hough Transform)是图像分析中用于检测几何形状(如直线、圆等)的方法。最常用的是直线检测的霍夫变换,它可以从霍夫空间(参数空间)到笛卡尔空间(图像空间)的转换关系中直观地理解。

在直线检测的应用中,霍夫变换考虑直线的参数方程形式 y = m x + b y = mx + b y=mx+b 或极坐标形式: x c o s ( θ ) + y s i n ( θ ) = ρ xcos(\theta) + ysin(\theta) = \rho xcos(θ)+ysin(θ)=ρ,其中 θ \theta θ是直线与x轴正方向的夹角, ρ \rho ρ是直线到原点的距离。在笛卡尔空间中,一条直线可以通过无数个点集来定义,而在霍夫空间中,这些点集映射为通过同一个点 ( ρ , θ ) (\rho, \theta) (ρ,θ)的曲线集合。换句话说,笛卡尔空间中一组共线的点在霍夫空间中对应一个交点。

下面的Python代码示例展示了如何使用OpenCV库实现霍夫变换来检测图像中的直线,并演示了霍夫空间与笛卡尔空间之间的转换关系:

可以通过以下代码进行直线检测:

import cv2
import numpy as np
from matplotlib import pyplot as plt# 加载图像,并转换为灰度图
image = cv2.imread('path/to/your/image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用Canny边缘检测
edges = cv2.Canny(gray, 50, 150, apertureSize=3)# 使用霍夫变换检测直线
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)# 在原图上绘制检测到的直线
for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)# 显示结果
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Detected Lines')
plt.axis('off')
plt.show()

从极坐标到斜率-截距的转换

在使用霍夫变换找到直线后,直线通常以极坐标形式的参数 ( ρ , θ ) (\rho, \theta) (ρ,θ) 表示,其中 ρ \rho ρ 是直线到原点的距离 θ \theta θ 是直线的法线与x轴正方向之间的角度。如果你想将这种表示转换为斜率-截距形式(即 (y = mx + b),其中 (m) 是斜率,(b) 是y轴截距),可以按照以下方法进行转换:
由极坐标方程 ( x c o s ( θ ) + y s i n ( θ ) = ρ ) (xcos(\theta) + ysin(\theta) = \rho) (xcos(θ)+ysin(θ)=ρ)出发,我们可以推导出直线的斜率 (m) 和截距 (b)。

斜率 m m m 的计算公式是:
m = − cos ⁡ ( θ ) sin ⁡ ( θ ) m = -\frac{\cos(\theta)}{\sin(\theta)} m=sin(θ)cos(θ)

截距 (b) 的计算公式是:
b = ρ sin ⁡ ( θ ) b = \frac{\rho}{\sin(\theta)} b=sin(θ)ρ

请注意,当 sin ⁡ ( θ ) = 0 \sin(\theta) = 0 sin(θ)=0(即 θ = 0 \theta = 0 θ=0 π \pi π 时,直线是垂直的,斜率 m 会是无限大,这种情况下斜率-截距表示不适用。

示例代码

以下是一个简单的Python示例,展示如何将霍夫变换检测到的直线转换为斜率-截距形式:

import numpy as np# 假设有一条直线的极坐标参数 (rho, theta)
rho = 10
theta = np.pi / 6  # 30度# 计算斜率 m 和截距 b
if np.sin(theta) != 0:m = -np.cos(theta) / np.sin(theta)b = rho / np.sin(theta)
else:m = np.inf  # 斜率无限大,表示直线垂直b = Noneprint(f"斜率: {m}, 截距: {b}")

这段代码将为你提供一个直线的斜率 (m) 和截距 (b),从而可以将直线在笛卡尔坐标系中以斜率-截距形式表示。如果直线垂直,斜率会被设置为无限大,这是数学上表示垂直直线的常用方式,而截距 (b) 在这种情况下没有定义。

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

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

相关文章

【计算机】——51单片机——持续更新

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路(IC芯片) 单片机是单片微型计算机(Single Chip Microcomputer)的简称,用于控制领域,所以又称为微型控制器(Microcontroller U…

【java基础】Java 的主要特性

Java语言是简单的 ● Java语言的语法与C语言和C语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不…

038—pandas 重采样线性插补

前言 在数据处理时,由于采集数据量有限,或者采集数据粒度过小,经常需要对数据重采样。在本例中,我们将实现一个类型超分辨率的操作。 思路: 首先将原始数据长度扩展为 3 倍,可以使用 loc[] 方法对索引扩…

OpenCV4.9.0开源计算机视觉库安装教程

返回:OpenCV系列文章目录(持续更新中......) 引言:OpenCV系列文章中的安装部分今天全部完成了,为了读者更方便阅读,大家可以按下列索引前往,成文较为仓促有错漏在所难免,欢迎大家指正…

【C#】使用C#窗体应用开启/停止Apache、MySQL服务

目录 一、前言 二、效果图 三、配置文件 四、代码 五、一键启动/停止所有服务 一、前言 使用C#窗体应用开启Apache、MySQL服务,不仅仅是Apache、MySQL,其他服务也可以使用同样的方法操作,包括开启自己写的脚本服务。 二、效果图 两种状…

JavaSE—IO流之字符流

📌 字符流中的常用类及基本方法: 输入字符流 Reader输出字符流 Writer ○ Reader 的基本方法: • 读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾。 int read() throws IOException • 读取一系列字符并存储到一个数组buff…

BufferedInputStream解读

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯&am…

安卓Java面试题 206- 210

206. 简述如何统计Activity的工作时间 ?如何统计Activity启动所用的时间? 可以通过分析Log得到(这个就是DDMS的那个Log)。 当我们点击触摸时会了类似以下的Log A: 03-06 03:36:47.865: VERBOSE/InputDevice(2486): ID[0]=0(0) Dn (0=>1) 03-06 03:36:47.865: INFO/Powe…

继承和多态(2)(多态部分)

提前讲的重要知识点 一个类在没有父类的情况下默认有一个父类为Object类。 而当在有父类情况下,如果你那父类没有父类,则其父类的父类默认为object类,所以即使一个类有父类,其内部还是有object类。 object类都是隐藏起来的&…

[蓝桥杯 2023 省 A] 填空问题--幸运数

[蓝桥杯 2023 省 A] 填空问题 题目描述 A. 幸运数 小蓝认为如果一个数含有偶数个数位,并且前面一半的数位之和等于后面一半的数位之和,则这个数是他的幸运数字。例如 2314 2314 2314 是一个幸运数字,因为它有 4 4 4 个数位,并…

LangGraph 入门与实战

原文:LangGraph 入门与实战 - 知乎 大家好,我是雨飞。LangGraph 是在 LangChain 基础上的一个库,是 LangChain 的 LangChain Expression Language (LCEL)的扩展。能够利用有向无环图的方式,去协调多个LLM或…

【周总结】

周总结 完成项目混合版时区改造 完成相关jira问题的修改 完成老版本APP数据保存接口的兼容,手动赋值时区 2024/03/24 天气阴 一点不冷 1.Its time to go、Spring is coming! 2. Its a nice day that staying with friends in a peaceful …

CentOS DHCP服务器部署指南

title: DHCP 服务器部署以及配置 search: 2024-03-21 tags: “#DHCP 服务器部署以及配置” CentOS DHCP 服务器部署指南 背景 :因上了 Linux 的实验课程,在课程中,老师要求我们自己搭建 DHCP 服务器构建局域网,在构建的时候问题百…

2024年云服务器ECS价格表出炉——腾讯云

腾讯云服务器多少钱一年?61元一年起。2024年最新腾讯云服务器优惠价格表,腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

用Python做一个植物大战僵尸

植物大战僵尸是一个相对复杂的游戏,涉及到图形界面、动画、游戏逻辑等多个方面。用Python实现一个完整的植物大战僵尸游戏是一个大工程,但我们可以简化一些内容,做一个基础版本。 以下是一个简化版的植物大战僵尸游戏的Python实现思路&#…

成功案例|全基因组测序+GWAS联合分析揭示不同种族帕金森病的遗传同质性和异质性

发表期刊:npj Parkinson’s Disease 影响因子:8.7 测序方式:WGS 研究对象:人 1 研究背景 帕金森病(PD)是一种常见的与年龄相关的神经退行性疾病,其特征是运动迟缓、姿势不稳定、僵硬和静息…

Redis中的过期键删除策略

过期键删除策略 概述 数据库键的过期时间都保存在过期字典中,并且知道根据过期时间去判断一个键是否过期,剩下的问题是:如果一个键过期了,那么它什么时候会被删除呢? 这个问题有三种可能的答案,它们分别代表了三种不同的删除策…

【linux】进程的地址空间

1.代码看现象引入 #include<stdio.h>#include<unistd.h>#include<string.h> #include<stdlib.h>int val100;int main (){ printf("i am father,pid:%d,ppid:%d,val:%d&#xff0c;&val:%p\n",getpid(),getppid(),val,&val);size_t…

vue2 和 vue3 配置路由有什么区别

vue2 和 vue3 配置路由有什么区别 初始化路由器实例&#xff1a;注入到应用中&#xff1a;动态路由参数和捕获所有路由&#xff1a;编程式导航 API&#xff1a;异步加载组件&#xff1a; vue2 如何 使用路由 第一步&#xff1a;安装 vue-router第二步&#xff1a;创建路由组件第…

【k8s】kubeasz 3.6.3 + virtualbox 搭建本地虚拟机openeuler 22.03 三节点集群 离线方案

kubeasz项目源码地址 GitHub - easzlab/kubeasz: 使用Ansible脚本安装K8S集群&#xff0c;介绍组件交互原理&#xff0c;方便直接&#xff0c;不受国内网络环境影响 拉取代码&#xff0c;并切换到最近发布的分支 git clone https://github.com/easzlab/kubeasz cd kubeasz gi…