opencv-霍夫变换

news2024/11/24 19:36:18

霍夫变换就是一个可以让计算机学会自己找图形的算法。是图形处理领域内从图像中检测几何形状的基本方法之一。经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以进行任意型状物体的识别,例如圆和椭圆。

霍夫变换运用两个坐标空间之间的变换,将在一个空间具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测形状的问题转化成统计峰值问题

一,霍夫直线变换原理

 如下图,将xy坐标系转换为kb的坐标系。由于一条直线的kb值是确定的,所以在kb坐标系下,一条直线就可以表示为一个点

 在kb坐标系下,kb相当于变量,而xy相当于常量,所以,xy坐标系下的AB两点相当于霍夫空间的两条直线。在xy坐标系下,过A点有无数多条直线,对应霍夫空间中就是A点坐标对应直线上的无数多个点

读到这就可以发现,笛卡尔坐标系(xy坐标系)下的点 就代表了霍夫空间的一条直线,多个点就代表多条直线,如果这几个点共线,就代表这几个点对应在霍夫空间下的直线均交于一点,利用这个特点我们就可以检测图片中的直线

(错误更正:下图第一句多条曲线改为多条直线)在笛卡尔坐标系下,出现多个点,并且这多个点可以连成多条直线。将这些点均对应到霍夫空间中,可以看到交出了ABCD四个点,而AC点由三条直线交出,相比于BD更多,我们会选择尽可能多直线交出的点

 

 

 将笛卡尔坐标系用极坐标表示出来。接下来将其转换到霍夫空间中,由于极坐标系变量为ρ和θ,所以霍夫空间的xy轴就是ρ和θ。如下图,根据上式xcosθ+ysinθ=ρ将笛卡尔坐标系中的点转换到霍夫空间中即可,可以发现最终也交于一点,这个点就代表了笛卡尔坐标系下的直线

再举一个例子

二,霍夫圆变换原理

霍夫圆变换有a,b,r三个参数,构成三维空间

以上霍夫圆变换仅为简单介绍,在OpenCV中是有优化的,这里不做介绍 

三,霍夫变化在OpenCV中的应用

1,霍夫直线变换函数

OpenCV已经给我们封装好了函数,我们可以调用 cv2.HoughLines函数来使用霍夫直线变换检测图片中的直线。

rho就是上文提到的,如下蓝圈所示垂直距离。theta角度步长就是在选定一个θ值范围进行遍历代入时每次加几度,一般为1°。阈值可以简单的理解为直线的长度。返回值lines为极坐标表示的直线,如果我们需要利用这条直线,要把它转换为笛卡尔坐标下的直线

 

以下为将极坐标转换为笛卡尔坐标并画出直线的代码

lines = cv2.HoughLines(edges, 1, np.pi/180, 180)#通过调阈值来改变图像中找到直线的数量
#调完阈值还不行就调第二个参数1
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 *a)
    y2 = int(y0 - 1000 *a)
    cv2.line(picture, (x1, y1), (x2, y2), (0, 0, 255), 2)

检测直线代码实例

def line_detect(picture):
    gray = cv2.cvtColor(picture, cv2.COLOR_BGR2GRAY)
    gaussion = cv2.GaussianBlur(gray, (9, 9), 0)
    edges = cv2.Canny(gaussion, 50, 150)
    lines = cv2.HoughLines(edges, 1, np.pi/180, 180)
    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 *a)
        y2 = int(y0 - 1000 *a)
        cv2.line(picture, (x1, y1), (x2, y2), (0, 0, 255), 2)

 

 

2,霍夫直线变换优化函数-概率霍夫检测

概率霍夫检测核心点是采取概率挑选机制,选取某些点进行检测,而不是像cv2.HoughLines一样选取所有点,这样可以减少计算压力 

 3,霍夫圆变换函数

circles为返回值,返回(圆横坐标。圆纵坐标,半径)

 

def circle_detect(picture):
    gray = cv2.cvtColor(picture, cv2.COLOR_BGR2GRAY)
    gaussion = cv2.GaussianBlur(gray, (9, 9), 0)
    edges = cv2.Canny(gaussion, 50, 150)
    #通过修改阈值param1和param2来调整检测的圆。从20向后都是比较重要的要调整的参数
    circles = cv2.HoughCircles(edges,HOUGH_GRADIENT,1,20,param1=30,param2=20,minRadius=10,maxRadius=35)
    circles = np.uint16(np.around(circles))
    for circle in circles[0, :]:
        cv2.circle(picture, (circle[0],circle[1]), circle[2], (0, 0, 255), 2)    
        cv2.circle(picture, (circle[0],circle[1]), 2, (0, 0, 255), 2)

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

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

相关文章

CSP-J复赛 模拟题3

1.匿名信: 题目描述 出于对社会现状的担忧,Alice 决定给市长写一封建议信,考虑到市长的暴脾气,Alice 最终还是决定匿名上书,为了保证自己的绝对神秘,她还会从当天的报纸上将一些单词(或字母)裁剪下来并重…

安装glibc+mysql的权限问题

安装glibc glibc mysql 俗称绿色mysql 安装之前删掉mariadb: 数据库初始化时候,会⾃动找my.cnf配置,但是原有的mariadb配 置⽂件,会失败 [rootmysql3 ~]# ls -l /etc/my.cnf -rw-r--r--. 1 root root 570 6月 8 2017 /etc/my.cnf [rootm…

Vue路由入门学习

文章目录 路由的基本使用1.目标2.作用3.说明4.官网5.VueRouter的使用(52)两个核心步骤 组件的存放目录问题1.组件分类存放目录 路由的封装抽离 Vue中的路由: 路径和组件的 映射关系 路由的基本使用 1.目标 认识插件 VueRouter&#xff0c…

Midjourney仅10分钟搞定⼀套漫画,含MJ提⽰词分享

Midjourney能帮我们画漫画了,你敢信?⼀起来和⽹易设计师学习如何只⽤10分钟,即使你是设计⿇⽠,也能轻轻松松完成⼀张属于你⾃⼰的短⽚⼩漫画!今天就⽤MJ来实战⼀套漫画,包含创作⽤的⼯ 具和提⽰词的应⽤,以前来学习吧! 漫画先看成品图: ▍ Part1你要画个啥? 画漫画当…

复现一下最近学习的漏洞(sqlab 1-10)

第一个问题:为什么不能用#来闭合单引号呢? 在进行URL地址栏传参的时候,是有一套编码规范的。他不会编码英文、数字和某些符号。但是#它会进行编码。也就是%23。(先转ascii码,然后再转十六进制,之后加上%就是…

小白暴力学习001---Vue---第一个Vue

做本文主要是采用Vue3的教程,来源于菜鸟教程, https://www.runoob.com/vue3/vue3-tutorial.html 主要记录从小白开始如何使用Vue建立一个笔记本的网站,并用于记录 基础条件: 有明确的目标有兴趣能使用电脑,会百度 视…

前端的学习-CSS(二)-弹性盒子-flex

一:子元素的属性 order:项目的排列顺序,数值越小,排列越靠前,默认为0。 flex-grow:定义项目的放大比例,默认为 0 ,即如果存在剩余空间,也不放大。 flex-shrink&#xff1…

【链表OJ】常见面试题 2

文章目录 1.[链表分割](https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId8&&tqId11004&rp2&ru/activity/oj&qru/ta/cracking-the-coding-interview/question-ranking)1.1 题目要求1.2 哨兵位法 2.[链表的回文结构](https://www.…

Spring Boot集成liquibase快速入门Demo

1.什么是liquibase? Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在 changelog 文件中,便于版本控制,它的目标是提供一种数据库类型无关的解决…

小厂也是厂,3000我也干

2018年6月,大三暑假 那一天,我投递了家里附近的一家公司有响应了,他线上问我什么时候可以去面试,我说什么时候都行。 HR:“要不你下午来吧?” 我:“行,我家里离面试地点不远” 我…

zdpy+vue3+onlyoffice文档系统实战上课笔记 20240805

上次 上次计划 1、最近文档表格完善 2、实现登录功能 3、新建文件,复制文件,删除文件 4、其他 目前任务:最近文档表格完善 1、在名称前面,渲染这个文档的图标 2、大小的基本的单位是kb,超过1024kb则换成mb&#xff0…

编写一个期货跨期套利的程序,谈谈思路及案例

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

8.5 C++

思维导图 试编程 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <array>using namespace std;int main() {cout << "请输入一个字符…

Python 字典 ({})的概念与操作

1、使用字典 在Python中&#xff0c;字典(dictionary)是一系列键值对(k-v pair)。每个键都有相应的值对应&#xff0c;使用键来访问与之关联的值&#xff0c;与键关联的值可以为数、字符串、列表乃至字典。 在Python中&#xff0c;字典放在花括号&#xff08;{}&#xff09;中…

C++中const关键字的用法

C语言和C中const的不同 首先我们需要区分一下C语言中的const和C中的const&#xff0c;C语言中的const修饰的变量可以不初始化&#xff0c;但如果将一个变量定位为const类型还不初始化&#xff0c;那么之后就不能对这个变量直接赋值了。 如果我们使用C语言中的const定义的变量指…

error: resource android:attr/lStar not found

项目打正式包的提示resource android:attr/lStar not found&#xff0c;后来分析发现android:attr/lStar属性在androidx.core:core的包里面&#xff0c;然后便试着降低androidx.core:core的版本号&#xff0c;降低后发现还是报错&#xff0c;查看错误信息发现androidx.core:cor…

安装nodejs服务器

Java项目可以运行在tomcat服务器&#xff0c;开始完成前后端完全分离。前端有自己独立的工程。我们需要把前端独立的工程运行起来。 运行在nodejs服务器下。 验证是否安装成功&#xff1a;敲cmd--输入node --version 1.安装npm java项目需要依赖jar,安装maven。前端项目也需要依…

《Advanced RAG》-07-探索 RAG 中表格数据的处理方案

摘要 本文详细讨论了实现 Retrieval-Augmented Generation&#xff08;RAG&#xff09;时对表格进行处理的挑战&#xff0c;特别是在非结构化文档中自动准确地提取和理解表格信息。 首先介绍了RAG中管理表格的关键技术&#xff0c;包括表格解析和索引结构设计。 接着&#xff0…

PXE批量安装操作系统

PXE批量安装操作系统 系统环境rhedhat7.9关闭vmware内的dhcp服务 kickstart自动安装脚本的制作 在rhel7系统中提供图形的kickstart制作方式 在rhel8中已经把图形的工具取消&#xff0c;并添加到rhn网络中 在rhel8中如果无法通过rhn网络制作kickstart&#xff0c;可以使用模板…

LlamaIndex 实现 React Agent

React Agent 是指 LLM 对问题自行推理并调用外部工具解决问题&#xff0c;如下图所示&#xff0c;通过一些推理步骤最终找到想要的答案。 LlamaIndex 提供了实现 React Agent 的框架&#xff0c;通过框架可以轻松的实现上图中的步骤。那么&#xff0c;如果不用 LlamaIndex 应该…