3.霍夫曼求直线原理与代码(python)

一、原理

我们常用的直线方程是y=kx+b

对这个公式移项后得到b=y-kx

        其实,当k,b确定时,这条直线就确定了。我对霍夫曼求直线的理解是:在一个二维平面上有很多个点,然后对k,b取不同的值时得到不同的直线,查看二维平面上有多少个点落到不同的直线上,比如:

k,bk_{1},b_{1},时平面上有5个点满足直线方程y=k_{1}x+b_{1}

k,bk_{2},b_{2},时平面上有8个点满足直线方程y=k_{2}x+b_{2}

k,bk_{3},b_{3},时平面上有2个点满足直线方程y=k_{3}x+b_{3}

        此时我们如果定义至少有4个点在直线上时才能确定为直线,那么我们就将第三种情况排除了,因为它只有两个已知点满足第三种情况的直线。

       当然,我们也可以知道,上面第二种情况的直线满足的点的个数最多,第一种情况也满足大于4个点,那我们获得的直线是不是就两条呢,这个还不确定,我们可以再加个条件,就是获得的直线之间的距离最小是3.这个时候我们还需要计算两条直线的距离,如果距离小于3,那么最后的直线只有一条,即第二种情况的直线;如果距离大于3,则两条直线都是我们需要的直线。

       我们了解了求直线的原理,而霍夫曼直线不是直接这样求的,他是怎么求的呢,可以说是用了移向后的公式b=y-kx

       大家知道,这个公式的k=tan\theta =\frac{sin\theta }{cos\theta }

       代入直线公式上面公式得b=-\frac{sin\theta }{cos\theta }x+y

       根据上面原理可以知道,我们是通过对k,b取不同的值求直线的,那么当我们对k,b取一组值后,上式中的b,\theta就成了常数,既然是常数,那么我也可以把-\frac{sin\theta }{cos\theta }设成\frac{cos\theta }{sin\theta },相当于对k做了一次变换,只是最后写直线的时候还原回来就行。那么做完这种变换后上式就变为

b=\frac{cos\theta }{sin\theta }x+y

       上式的两边同时乘以sin\theta得:bsin\theta =xcos\theta +ysin\theta

       bsin\theta是个常数,令r=bsin\theta

r =xcos\theta +ysin\theta

       经过上述的变换后,我们就对k,b取不同值时求直线转换为对r,\theta取不同值时求直线。当然,保留直线的原理和上面相同。

      原理就说到这里了,如果大家觉得哪里有问题或不理解,可以评论区讨论。

二、代码

在这里,直接看别人的霍夫曼直线代码了,博文地址为OpenCV-Python 霍夫变换 检测直线,圆形_python opencv 环形文字拉直-CSDN博客

大家也可以根据原理自己写代码。代码如下:

"""
cv2.HoughLines()dst:   输出图像. 它应该是个灰度图 (但事实上是个二值化图)lines: 储存着检测到的直线的参数对 (r,\theta) 的容器 rho : 参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素.theta: 参数极角 \theta 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)threshold:    设置阈值: 一条直线所需最少的的曲线交点srn and stn:  参数默认为0cv2.HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 )dst:    输出图像. 它应该是个灰度图 (但事实上是个二值化图) lines:  储存着检测到的直线的参数对 (x_{start}, y_{start}, x_{end}, y_{end}) 的容器rho :   参数极径 r 以像素值为单位的分辨率. 我们使用 1 像素.theta:  参数极角 \theta 以弧度为单位的分辨率. 我们使用 1度 (即CV_PI/180)threshold:    设置阈值: 一条直线所需最少的的曲线交点。超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。minLinLength: 能组成一条直线的最少点的数量. 点数量不足的直线将被抛弃.maxLineGap:   能被认为在一条直线上的两点的最大距离。
"""
import cv2
import numpy as np  original_img= cv2.imread("jianzhu.png", 0)
img = cv2.resize(original_img,None,fx=0.8, fy=0.8, interpolation = cv2.INTER_CUBIC)img = cv2.GaussianBlur(img,(3,3),0)
edges = cv2.Canny(img, 50, 150, apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180,118) #这里对最后一个参数使用了经验型的值
result = img.copy()
for line in lines:rho = line[0][0]  #第一个元素是距离rhotheta= line[0][1] #第二个元素是角度thetaprint (rho)print (theta)if  (theta < (np.pi/4. )) or (theta > (3.*np.pi/4.0)): #垂直直线pt1 = (int(rho/np.cos(theta)),0)               #该直线与第一行的交点#该直线与最后一行的焦点pt2 = (int((rho-result.shape[0]*np.sin(theta))/np.cos(theta)),result.shape[0])cv2.line( result, pt1, pt2, (255))             # 绘制一条白线else:                                                  #水平直线pt1 = (0,int(rho/np.sin(theta)))               # 该直线与第一列的交点#该直线与最后一列的交点pt2 = (result.shape[1], int((rho-result.shape[1]*np.cos(theta))/np.sin(theta)))cv2.line(result, pt1, pt2, (255), 1)           # 绘制一条直线cv2.imshow('Canny', edges )
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

产品经理学习-产品运营《海报制作》

如何策划一款优秀的海报 海报是什么&#xff1f; 是一种将文字和图片结合的信息传递形式&#xff1b;其作用和目的是把想传递给用户的信息高效的传递出去&#xff0c;让用户在极短的时间内产生兴趣&#xff0c;进而产生收藏、分享等行为。 海报的类型&#xff1a; 类型 特点 …

苹果家的脸部电脑终于来啦!

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

jdk17新特性—— record关键字(类似于Lombok功能)

目录 一、record关键字的概述1.1、概述1.2、特性 二、record关键字的代码示例2.1、record关键字代码示例2.2、record关键字代码.class文件示例2.3、record关键字代码示例 总结说明 三、record关键字实现密封接口的代码示例3.1、record关键字实现密封接口的代码示例 四、record关…

LSTM进行情感分析

LSTM进行情感分析的复现–pytorch的实现 关于TextCNN的复现参考本文章 TextCNN的复现–pytorch实现 - 知乎 (zhihu.com) 接下来主要是对代码内容的详解&#xff0c;完整代码将在文章末尾给出。 使用的数据集为电影评论数据集&#xff0c;其中正面数据集5000条左右&#xff…

2024美赛数学建模E题思路+代码

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…

IP、端口、网络协议、TCP-IP五层模型

目录 IP地址 端口号 网络协议 协议分层&#xff08;TCP/IP五层模型&#xff09; 应用层 传输层&#xff08;也叫运输层&#xff09; 网络层 数据链路层 物理层 A用户通过qq给B发送一个字符串所经历的过程 IP地址 ip地址是一台主机的网络地址。 ip地址主要是用…

【教程】谈一谈 IPA 上传到 App Store Connect 的几种方法

【教程】谈一谈 IPA 上传到 App Store Connect 的几种方法 引言 在应用开发过程中&#xff0c;将应用程序上传到 App Store Connect 是一个关键的环节。本文将探讨几种常见的 IPA 文件上传方法&#xff0c;包括 Xcode、Application Loader、altool、Appuploader以及Transport…

【React】react组件传参

【React】react组件传参 一、props&#xff1a;父组件向子组件传参1、将普通的参数作为props传递2、将jsx作为props传递&#xff08;组件插槽&#xff09; 二、自定义事件&#xff1a;子父组件向父组件传参三、context进行多级组件传参四、redux全局状态管理 一、props&#xf…

Day06-Linux下目录命令讲解及重要文件讲解

Day06-Linux下目录命令讲解及重要文件讲解 1. Linux目录文件1.1 Linux系统目录结构介绍1.1.1 Linux与Windows目录结构对比 1.2 重要的Linux配置文件介绍1.2.1 /etc系统初始化及设置相关重要文件1.2.2 /usr目录的重要知识介绍------应用程序目录1.2.3 /var目录下的路径知识-----…

使用apifox创建一个Mock Server Api 接口

安装 下载 Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能&#xff0c;接口开发、测试、联调效率&#xff0c;提升 10 倍。最好用的接口文档管理工具&#xff0c;接口自动化测试工具。 创建mock api项目中使用 创建项…

【二进制漏洞】缓冲区溢出漏洞

天命&#xff1a;好像复现成功了&#xff0c;又好像没有完全成功 学习视频&#xff1a;抓住漏洞&#xff01;缓冲区溢出漏洞利用实例&#xff0c;如何利用溢出执行Shell Code_哔哩哔哩_bilibili 漏洞复现 实验环境&#xff1a;kali &#xff08;其实啥都试过&#xff0c;windo…

数据结构------算法时间复杂度

通俗的理解一下算法的时间复杂度 主要是看这个速发的时间性能&#xff0c;从这个算法规模入手&#xff0c;具体的看一下这个算法的所需时间与这个算法规模的关系 关系有 O(1) 常数次 1次 2次。。。。。。 O(n)一个for循环 O(n^2)两个for循环&#xff08;嵌套&#xff09; O(mn)…