Python OpenCV与霍夫变换:检测符合特定斜率范围的直线
在计算机视觉和图像处理领域,检测图像中的直线是一项常见且重要的任务。OpenCV 提供了许多强大的工具来进行图像处理,其中霍夫变换(Hough Transform)就是用于检测直线的经典方法。本文将介绍如何使用 OpenCV 和霍夫变换来检测图像中符合特定斜率范围的直线,并展示一个完整的 Python 实现。
导入必要的库
首先,我们需要导入必要的 Python 库:
import cv2
import numpy as np
import matplotlib.pyplot as plt
直线筛选函数
我们定义一个函数 filter_lines_by_slope_x_range_and_y
来筛选符合特定斜率范围、x 坐标范围及至少一端 y 坐标大于 min_y
的直线:
def filter_lines_by_slope_x_range_and_y(lines, min_slope=1, max_slope=2, min_x=112, max_x=2400, min_y=310):"""筛选符合斜率范围、x坐标范围及至少一端y坐标大于min_y的直线"""valid_lines = []for line in lines:x1, y1, x2, y2 = line[0]# 检查x坐标是否在指定范围内且至少一端的y坐标大于min_yif (min_x <= x1 <= max_x or min_x <= x2 <= max_x) and (y1 > min_y or y2 > min_y):# 避免除以零错误(垂直线)if x1 == x2:continueslope = (y2 - y1) / (x2 - x1)# 考虑斜率的正负,分别对应不同方向if (min_slope <= slope <= max_slope) or (-max_slope <= slope <= -min_slope):valid_lines.append(line)return valid_lines
读取和预处理图像
我们使用 OpenCV 读取图像,并将其转换为灰度图像,然后应用高斯模糊以减少噪声,最后使用 Canny 边缘检测算法检测图像中的边缘:
# 读取图像
image = cv2.imread('rotated_image.jpg') # 替换为你的图片路径
if image is None:print("Image not found.")exit()# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用高斯模糊减少噪声
gray = cv2.GaussianBlur(gray, (5, 5), 0)# Canny边缘检测
edges = cv2.Canny(gray, 100, 150, apertureSize=3)
检测和筛选直线
我们使用霍夫变换检测图像中的直线,并使用之前定义的函数筛选符合特定斜率范围的直线:
# 使用霍夫变换检测直线,注意此函数返回的是直线段而非参数空间
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=400, minLineLength=100, maxLineGap=50)# 筛选符合斜率范围的直线
valid_lines = filter_lines_by_slope_x_range_and_y(lines)
处理和保存检测到的直线信息
我们假设 valid_lines
只包含了一条满足条件的直线,并计算其斜率。如果检测到的直线为垂直线,则斜率为无穷大或用特殊标识表示:
# 假设valid_lines只包含了一条满足条件的直线
if valid_lines:# 获取唯一满足条件的直线line = valid_lines[0]x1, y1, x2, y2 = line[0]# 计算斜率,注意处理除以零的情况if x1 != x2:slope = (y2 - y1) / (x2 - x1)else:slope = 'Vertical' # 或者用其他方式表示垂直线# 打印或保存直线信息print(f"Detected Line: ({x1}, {y1}) to ({x2}, {y2}), Slope: {slope}")# 保存至文件(示例:文本文件)with open('line_info.txt', 'w') as file:file.write(f"Start Point: ({x1}, {y1})\nEnd Point: ({x2}, {y2})\nSlope: {slope}\n")
else:print("No valid line detected.")
绘制并显示检测到的直线
我们将筛选后的直线绘制在图像上,并使用 matplotlib
显示结果:
# 绘制筛选后的直线
if valid_lines is not None:for line in valid_lines:x1, y1, x2, y2 = line[0]cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) # 红色绘制直线# 显示结果
plt.figure(figsize=(10, 6))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Detected Lines with Slope between 1 to 2')
plt.show()
完整代码
以下是完整的代码:
import cv2
import numpy as np
import matplotlib.pyplot as pltdef filter_lines_by_slope_x_range_and_y(lines, min_slope=1, max_slope=2, min_x=112, max_x=2400, min_y=310):"""筛选符合斜率范围、x坐标范围及至少一端y坐标大于min_y的直线"""valid_lines = []for line in lines:x1, y1, x2, y2 = line[0]# 检查x坐标是否在指定范围内且至少一端的y坐标大于min_yif (min_x <= x1 <= max_x or min_x <= x2 <= max_x) and (y1 > min_y or y2 > min_y):# 避免除以零错误(垂直线)if x1 == x2:continueslope = (y2 - y1) / (x2 - x1)# 考虑斜率的正负,分别对应不同方向if (min_slope <= slope <= max_slope) or (-max_slope <= slope <= -min_slope):valid_lines.append(line)return valid_lines# 读取图像
image = cv2.imread('rotated_image.jpg') # 替换为你的图片路径
if image is None:print("Image not found.")exit()# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用高斯模糊减少噪声
gray = cv2.GaussianBlur(gray, (5, 5), 0)# Canny边缘检测
edges = cv2.Canny(gray, 100, 150, apertureSize=3)# 使用霍夫变换检测直线,注意此函数返回的是直线段而非参数空间
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=400, minLineLength=100, maxLineGap=50)# 筛选符合斜率范围的直线
valid_lines = filter_lines_by_slope_x_range_and_y(lines)# 假设valid_lines只包含了一条满足条件的直线
if valid_lines:# 获取唯一满足条件的直线line = valid_lines[0]x1, y1, x2, y2 = line[0]# 计算斜率,注意处理除以零的情况if x1 != x2:slope = (y2 - y1) / (x2 - x1)else:slope = 'Vertical' # 或者用其他方式表示垂直线# 打印或保存直线信息print(f"Detected Line: ({x1}, {y1}) to ({x2}, {y2}), Slope: {slope}")# 保存至文件(示例:文本文件)with open('line_info.txt', 'w') as file:file.write(f"Start Point: ({x1}, {y1})\nEnd Point: ({x2}, {y2})\nSlope: {slope}\n")
else:print("No valid line detected.")# 绘制筛选后的直线
if valid_lines is not None:for line in valid_lines:x1, y1, x2, y2 = line[0]cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) # 红色绘制直线# 显示结果
plt.figure(figsize=(10, 6))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Detected Lines with Slope between 1 to 2')
plt.show()
注意:由于传统视觉处理的限制,代码中的限制条件均需根据自己的图像实际需求进行限制,限制完成后任有多余线条,可调节霍夫变换函数的相关参数,基本能满足需求!!!
结语
本文介绍了如何使用 OpenCV 和霍夫变换检测图像中的直线,并筛选出符合特定斜率范围的直线。通过这种方法,我们可以更加精确地处理图像中的特定特征。如果你有任何问题或建议,欢迎在评论区留言讨论。
相关文章:
Python OpenCV与霍夫变换:检测符合特定斜率范围的直线
在计算机视觉和图像处理领域,检测图像中的直线是一项常见且重要的任务。OpenCV 提供了许多强大的工具来进行图像处理,其中霍夫变换(Hough Transform)就是用于检测直线的经典方法。本文将介绍如何使用 OpenCV 和霍夫变换来检测图像…...

ubuntu22.04+pytorch2.3安装PyG图神经网络库
ubuntu下安装torch-geometric库,图神经网络 开发环境 ubuntu22.04 conda 24.5.0 python 3.9 pytorch 2.0.1 cuda 11.8 pyg的安装网上教程流传着许多安装方式,这些安装方式主要是:预先安装好pyg的依赖库,这些依赖库需要对应上pyth…...
新型开发语言的试用感受-仓颉语言发布之际
经常听一些媒体介绍一些新型的开发语言,所以最近心血来潮,安装了几种感受了一些。 先看名气,如ziglang,网址为:Home ⚡Zig Programming Language 号称是可以取代C语言的一门新语言,其实我主要是受下面这篇…...

基于字典学习的地震数据降噪(MATLAB R2021B)
稀疏表示基于研究者们提出了许多变换基函数的方法逐渐成型,比如小波域,曲波域,dreamlet 域等,其原理是利用地震信号在变换域内的稀疏性和可分离性以去除噪声。继 Donoho发表非线性去噪方法-小波阈值萎缩方法,在后续的研…...

【Web】
1、配仓库 [rootlocalhost yum.repos.d]# vi rpm.repo ##本地仓库标准写法 [baseos] namemiaoshubaseos baseurl/mnt/BaseOS gpgcheck0 [appstream] namemiaoshuappstream baseurlfile:///mnt/AppStream gpgcheck0 2、挂载 [rootlocalhost ~]mount /dev/sr0 /mnt mount: /m…...

kafka-3
Kafka 消费组 consumer-offsets-N 稀疏索引 Kafka集群 集群搭建 集群启动和验证 Topic的意义 Topic和Partition 分区 副本 集群操作指令 多分区&多副本 多分区消费组 Rebalance机制 Rebalance机制处理流程 Rebalance机制-Range Rebalance机制-RoudRobin Rebalance机制-St…...
MySQL性能优化 二、表结构设计优化
1.设计中间表 设计中间表,一般针对于统计分析功能,或者实时性不高的需求。 2.设计冗余字段 为减少关联查询,创建合理的冗余字段(创建冗余字段还需要注意数据一致性问题) 3.折表 对于字段太多的大表,考…...

用HttpURLConnection复现http响应码405
目录 使用GET方法,访问GET接口,服务端返回405使用GET方法,访问POST接口,服务端返回405使用POST方法,访问GET接口,服务端返回405 使用GET方法,访问GET接口,服务端返回405 发生场景&a…...

2-27 基于matlab的一种混凝土骨料三维随机投放模型
基于matlab的一种混凝土骨料三维随机投放模型,为混凝土细观力学研究提供一种快捷的三维建模源代码。可设置骨料数量,边界距离、骨料大小等参数。程序已调通,可直接运行。 2-27 matlab 混凝土骨料三维随机投放模型 - 小红书 (xiaohongshu.com)…...
ISA95-Part4-业务流程的解析与设计思路
MES/MOM系统实现ISA-95标准的业务流程通常遵循以下思路,并包含一系列内容。 一、功能模块: 1. 需求分析与规划: - 确定业务流程需求,包括订单管理、生产调度、库存控制等,并规划如何将这些流程与MES/MOM系统集成。 2. 系统集成架构设计: - 设计一个系统集成架构,确保M…...

【Spring Cloud】一个例程快速了解网关Gateway的使用
Spring Cloud Gateway提供了一个在Spring生态系统之上构建的API网关,包括:Spring 5,Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的路由方式,并为它们提供一些网关基本功能,例如&…...

仿哔哩哔哩视频app小程序模板源码
仿哔哩哔哩视频app小程序模板源码 粉色的哔哩哔哩手机视频网页,多媒体视频类微信小程序ui前端模板下载。包含:视频主页和播放详情页。 仿哔哩哔哩视频app小程序模板源码...

数据库存储引擎
MySQL体系结构 存储引擎 -- 查询建表语句 show create table account; -- 查询引擎 show engines; InnoDB 特点 DML操作遵循ACID模型,支持事务 行级锁,提高并发访问性能支持外键约束 文件 xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样…...

【单片机毕业设计选题24049】-基于STM32单片机的智能手表设计
系统功能: 显示时间,温湿度,体温信息,播放音乐及控制红外小夜灯,通过蓝牙模块连接手机APP。 系统上电后OLED显示“欢迎使用智能手表系统请稍后”,两秒后进入正常页面显示 第一行显示获取到的当前时间 第二行显示获…...

利用面向AWS的Thales Sovereign解决方案保护AI之旅
亚马逊网络服务(AWS)是全球最大的云服务提供商。众所周知,他们致力于提供工具、解决方案和最佳实践,使其客户能够安全地利用AWS上的生成式人工智能 (GenAI) 工作负载。组织正在迅速使用GenAI为企业带来更高的生产力和创造力。在GenAI的几乎所有用途中&am…...
学习笔记——交通安全分析13
目录 前言 当天学习笔记整理 5城市主干道交通安全分析 结束语 前言 #随着上一轮SPSS学习完成之后,本人又开始了新教材《交通安全分析》的学习 #整理过程不易,喜欢UP就点个免费的关注趴 #本期内容接上一期12笔记 当天学习笔记整理 5城市主干道交…...
PHP-实例-文件上传
1 需求 2 basename 在 PHP 中,basename() 函数用于返回路径中的文件名部分。如果路径中包含了文件扩展名,则该函数也会返回它。如果路径的结尾有斜杠(/)或反斜杠(\),则 basename() 函数会返回空…...

LeetCode刷题之HOT100之完全平方数
2024 7/7 转眼间就到周日啦!昨天下午开组会,开了三个半小时。如坐针毡,会后跑了个步、洗了个澡、洗了衣服、躺床上看了会《罪与罚》,睡着了。早上起来,去拿我昨晚充电的车,当我看到车没有停在昨天的位置&am…...

【SpringCloud应用框架】Nacos集群架构说明
第六章 Spring Cloud Alibaba Nacos之集群架构说明 文章目录 前言一、Nacos支持三种部署模式二、集群部署说明三、预备环境 前言 到目前为止,已经完成了对Nacos的一些基本使用和配置,接下来还需要了解一个非常重要的点,就是Nacos的集群相关的…...

JS进阶-作用域
学习目标: 掌握作用域 学习内容: 作用域局部作用域全局作用域作用域链JS垃圾回收机制拓展-JS垃圾回收机制-算法说明闭包变量提升 作用域: 作用域规定了变量能够被访问的"范围",离开了这个"范围"变量便不能被…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...