当前位置: 首页 > news >正文

网站建设 系统维护海外推广营销系统

网站建设 系统维护,海外推广营销系统,网页版梦幻西游vip价格表,做自己的免费网站OpenCV入门(十八)快速学会OpenCV 17 直线检测1.霍夫直线变换概述2.霍夫变换原理3.操作实例3.1 HoughLines函数3.2 HoughLinesP函数作者:Xiou 1.霍夫直线变换概述 霍夫变换是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫变换采用…

OpenCV入门(十八)快速学会OpenCV 17 直线检测

  • 1.霍夫直线变换概述
  • 2.霍夫变换原理
  • 3.操作实例
    • 3.1 HoughLines函数
    • 3.2 HoughLinesP函数

作者:Xiou

1.霍夫直线变换概述

霍夫变换是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方式来获取当前图像内的形状集合,该变换由Paul Hough(霍夫)于1962年首次提出。最初的霍夫变换只能用于检测直线,经过发展后,霍夫变换不仅能够识别直线,还能识别其他简单的图形结构,常见的有圆、椭圆等。

霍夫直线变换用来在图像内寻找直线,在OpenCV中,可以用函数cv2.HoughLines()和函数cv2.HoughLinesP()实现。

霍夫变换 (Hough Line Transform) 是图像处理中的一种特征提取技术. 通过平面空间到极值坐标空间的转换, 可以帮助我们实现直线检测。

2.霍夫变换原理

为了方便说明问题,先以我们熟悉的笛卡儿坐标系(与笛卡儿空间对应)为例来说明霍夫变换的基本原理。与笛卡儿坐标系对应,我们构造一个霍夫坐标系(对应于霍夫空间)。在霍夫坐标系中,横坐标采用笛卡儿坐标系中直线的斜率k,纵坐标使用笛卡儿坐标系中直线的截距b。

首先,我们观察笛卡儿空间中的一条直线在霍夫空间内的映射情况。例如,在图16-1中,左图是笛卡儿x-y坐标系(笛卡儿空间),右图是霍夫k-b坐标系(霍夫空间)。在笛卡儿空间中,存在着一条直线y=k0x+b0,该直线的截距k0是已知的常量,截距b0也是已知的常量。将该直线映射到霍夫空间内,找到已知的点(k0, b0),即完成映射。

从上述分析中可知,笛卡儿空间内的一条直线,其斜率为k,截距为b,映射到霍夫空间内成为一个点(k, b)。或者,可以这样理解,霍夫空间内的一个点(k0, b0),映射到笛卡儿空间,就是一条直线y=k0x+b0。

当我们把直线 y = kx + b 画在指标坐标系上, 如下图. 我们再从原点引线段到直线上的任一点。

在这里插入图片描述

我们可以得到这条线段与 x 轴的夹角为 θ, 距离是 r. 对于直线上的任一点 (x0, y0), 我们可以得到公式:

在这里插入图片描述

综上所述,在霍夫空间内,经过一个点的直线越多,说明其在笛卡儿空间内映射的直线,是由越多的点所构成(穿过)的。我们知道,两个点就能构成一条直线。但是,如果有一个点是因为计算错误而产生的,那么它和另外一个点,也会构成一条直线,此时就会凭空构造出一条实际上并不存在的直线。这种情况是要极力避免的。因此,在计算中,我们希望用更多的点构造一条直线,以提高直线的可靠性。也就是说,如果一条直线是由越多点所构成的,那么它实际存在的可能性就越大,它的可靠性也就越高。因此,霍夫变换选择直线的基本思路是:选择有尽可能多直线交汇的点。

3.操作实例

3.1 HoughLines函数

OpenCV提供了函数cv2.HoughLines()用来实现霍夫直线变换,该函数要求所操作的源图像是一个二值图像,所以在进行霍夫变换之前要先将源图像进行二值化,或者进行Canny边缘检测。

函数cv2.HoughLines()的语法格式为:

        lines=cv2.HoughLines(image, rho, theta, threshold)

式中:
● image是输入图像,即源图像,必须是8位的单通道二值图像。如果是其他类型的图像,在进行霍夫变换之前,需要将其修改为指定格式。
● rho为以像素为单位的距离r的精度。一般情况下,使用的精度是1。
● theta为角度θ的精度。一般情况下,使用的精度是π/180,表示要搜索所有可能的角度。
● threshold是阈值。该值越小,判定出的直线就越多。通过上一节的分析可知,识别直线时,要判定有多少个点位于该直线上。在判定直线是否存在时,对直线所穿过的点的数量进行评估,如果直线所穿过的点的数量小于阈值,则认为这些点恰好(偶然)在算法上构成直线,但是在源图像中该直线并不存在;如果大于阈值,则认为直线存在。所以,如果阈值较小,就会得到较多的直线;阈值较大,就会得到较少的直线。
● 返回值lines中的每个元素都是一对浮点数,表示检测到的直线的参数,即(r, θ),是numpy.ndarray类型。

有一点需要强调的是,使用函数cv2.HoughLines()检测到的是图像中的直线而不是线段,因此检测到的直线是没有端点的。所以,我们在进行霍夫直线变换时所绘制的直线都是穿过整幅图像的。

代码实例:

import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('tes.jpg')
# 转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 边缘检测, Sobel算子大小为3
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
orgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
oShow = orgb.copy()
# 霍夫曼直线检测
lines = cv2.HoughLines(edges, 1, np.pi / 180, 140)#遍历
for line in lines:# 获取rho和thetarho, 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(orgb, (x1, y1), (x2, y2), (0, 0, 255), 2)
#展示
plt.subplot(121)
plt.imshow(oShow)
plt.axis('off')
plt.subplot(122)
plt.imshow(orgb)
plt.axis('off')

输出结果:

在这里插入图片描述

3.2 HoughLinesP函数

OpenCV提供了函数cv2.HoughLines()用来实现霍夫直线变换,此函数在 HoughLines 的基础上末尾加了一个代表概率 (Probabilistic) 的 P, 表明它可以采用累计概率霍夫变换, 来找出二值图像中的直线。

该函数要求所操作的源图像是一个二值图像,所以在进行霍夫变换之前要先将源图像进行二值化,或者进行Canny边缘检测。函数cv2.HoughLinesP()的语法格式为:

        lines=cv2.HoughLinesP(image, rho, theta, threshold)

参数:

image: 输入图像
rho: 线性搜索半径步长, 以像素为单位
theta: 线性搜索步长, 以弧度为单位
threshold: 累计阈值
minLineLength: 最短直线长度
maxLineGap: 最大孔隙距离

代码实例:

import numpy as np
import cv2
from matplotlib import pyplot as plt# 读取图片
image = cv2.imread("tes.jpg")
image_copy = image.copy()# 转换成灰度图
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 边缘检测, Sobel算子大小为3
edges = cv2.Canny(image_gray, 170, 220, apertureSize=3)# 霍夫曼直线检测
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=100, maxLineGap=10)# 遍历
for line in lines:# 获取坐标x1, y1, x2, y2 = line[0]cv2.line(image_copy, (x1, y1), (x2, y2), (0, 0, 255), thickness=5)# 图片展示
f, ax = plt.subplots(2, 2, figsize=(12, 12))# 子图
ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
ax[0, 1].imshow(image_gray, "gray")
ax[1, 0].imshow(edges, "gray")
ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB))# 标题
ax[0, 0].set_title("original")
ax[0, 1].set_title("image gray")
ax[1, 0].set_title("image edge")
ax[1, 1].set_title("image line")plt.show()

输出结果:

在这里插入图片描述

在这里插入图片描述

http://www.tj-hxxt.cn/news/26647.html

相关文章:

  • 做电影网站收入点金推广优化公司
  • 网站建设里怎么写文章竞价推广是做什么的
  • 网站优化关键词排名怎么做最吸引人的营销广告词
  • 东宁网站制作p2p万能搜索种子
  • 网盘可以做网站空间吗域名收录提交入口
  • 深圳 网站建设公广州seo推广
  • 政府网站建设 会议湖北seo关键词排名优化软件
  • 做网站用什么数据库品牌策划方案怎么做
  • 百度站长网站规则改版seo推广如何做
  • wordpress文章迁移seo公司 杭州
  • 做电子书的网站很有名后来被关闭了百度健康
  • 网站备案哪个部门百度排名怎么做
  • 网页设计实验报告实验步骤盐城seo排名
  • 教育品牌加盟网站建设新浪体育最新消息
  • 求职网站开发开题报告产品宣传
  • 做网站如何快速推广一款产品百度快速排名优化工具
  • 中企动力做的电梯网站seo视频教程百度网盘
  • 工艺品网站设计站长工具官网
  • 装修公司做宣传在哪个网站网络营销技巧培训
  • 政府网站改版方案私域流量营销
  • 我做的网站怎样被百度收录百度一下你知道
  • 网站权限怎么设置方法怎么推广一个产品
  • 高品质的网站设计制作seo快速排名软件网站
  • 专业网站建设搭建seo关键词挖掘
  • 爱站库网页设计与制作教程
  • dota2海涛做的网站网站制作网站推广
  • java自学旺道智能seo系统
  • 徐州网站客户一键优化是什么意思
  • 电商网站页面分类网站推广的软件
  • 建个什么网站赚钱百度seo关键词排名优化