python+OpenCV图像处理(十)霍夫变换简单图形检测

霍夫变换

霍夫变换(Hough Transform)是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如:直线、圆等)。最基本的霍夫变换是从黑白图像中检测直线。

霍夫变换是经典的检测直线的算法。其最初用来检测图像中的直线,同时也可以将其扩展,以用来检测图像中的简单结构。它最初是用于在二值化的图像中进行直线检测的。对于图像中的一条直线,利用直角坐标系,可以用公式表示为:

                                                                                   y=kx+b

如果从k-b参数空间的角度来考虑,则该直线的任意一点(x,y)将变成一个“点”。也就是说,将图像空间中所有的非零像素转换到k-b参数空间,那么它们将聚焦在一个点上,而且参数空间中的一个局部峰值点就很有可能对应着原图像空间的一条直线。不过,由于直线的斜率可能为无穷大,或者无穷小,那么在k-b参数空间就不便于对直线进行描述和刻画。所以,有人提出采用极坐标参数空间进行直线检测。在极坐标系中,直线可以表述为以下形式:

                                                                           \rho =xcos(\theta )+ysin(\theta )

上图(a)所示为原始的图像空间中的一个点(x_{0},y_{0}) ;(b)中所示为直角坐标系当中为过同一点的四条直线;

(c)所示为这四条直线在极坐标参数空间可以表示为四个点。

在OpenCV中,支持两种两种不同的霍夫直线变换,the Standard Hough Transform(SHT,标准霍夫变换)和Progressive Probability Hough Transform(PPHT,渐进概率式霍夫变换)。

SHT就是上述的在极坐标空间进行参数表示的方法,而PPHT是SHT的改进,它是在一定的范围内进行霍夫变换,从而减少计算量,缩短计算时间。

在OpenCV中检测直线的函数有cv2.HoughLines()-----(标准霍夫变换),cv2.HoughLinesP()------(渐进概率式霍夫变换)。

(一)标准霍夫变换

函数cv2.HoughLines()返回值实际上是一个二维数据矩阵,表述的就是上述的(\rho ,\theta),其中\rho的单位是像素长度(即直线到图像原点直线的距离,从上述图b中可以看出),\theta的单位是弧度,函数有四个参数输入:

通过调整边缘检测算子Canny阈值参数和标准霍夫变换阈值参数,来获取较好的检测效果。

  • 第一个参数,是需要进行检测的灰度图
  • 第二、三参数分别是\rho\theta的精确度,可以理解为步长。
  • 第四个参数为阈值T,认为当累加器中的值高于所设定的阈值T时,才认为是一条直线。
# 标准霍夫变换
img = cv2.imread('malu.jpg')
house = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 获取灰度图
edges = cv2.Canny(house, 50, 200)
lines = cv2.HoughLines(edges, 1, np.pi/180, 260)  # 霍夫变换返回的就是极坐标系中的两个参数  rho和theta
print(np.shape(lines))
lines = lines[:, 0, :]  # 将数据转换到二维
for rho, theta in lines:a = np.cos(theta)b = np.sin(theta)# 从图b中可以看出x0 = rho x cos(theta)#               y0 = rho x sin(theta)x0 = a*rhoy0 = b*rho# 由参数空间向实际坐标点转换x1 = int(x0 + 1000*(-b))y1 = int(y0 + 1000*a)x2 = int(x0 - 1000*(-b))y2 = int(y0 - 1000*a)cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 1)
cv2.imshow('img', img)
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)渐进概率式霍夫变换 

函数cv2.HoughLinesP()是一种概率直线检测,从原理上讲hough变换是一个耗时耗力的算法,尤其是对每一个点的计算,即便经过了canny转换,但有的时候点的数量依然很庞大,这时候采取一种概率挑选机制,不是所有的点都进行计算,而是随机的选取一些点来进行计算,这样的话在阈值设置上也需要降低一些。

与标准霍夫变换函数相比,在参数的输入上多了两个参数:minLineLengh(线的最短长度,比这个线段短的都忽略掉)和maxLineGap(两条直线之间的最大间隔,小于此值,就认为是一条直线)。

这个函数的输出直接是直线点的坐标位置,这样可以省去一系列for循环中的由参数空间到图像的实际坐标点的转换。

# 渐进概率式霍夫变换
img = cv2.imread('house1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 250)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, minLineLength=60, maxLineGap=10)
lines = lines[:, 0, :]
for x1, y1, x2, y2 in lines:cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

再进行边缘检测之前如果对图像进行去噪声操作,图像显示的效果将会更好。 

(三)利用霍夫变换检测圆环

圆的数学的数学表达式为:

(x-x_{0})^{2}+(y-y_{0})^{2}=r^{2}

所以一个圆的确定需要三个参数,那么就需要三层循环来实现,从而把图像上的所有点映射到三维空间上。寻找参数空间累加器的最大(或者大于某一阈值)的值。那么理论上圆的检测将比直线更耗时,然而OpenCV对其进行了优化,用了霍夫梯度法。

cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)

param1和param2就是\rho\theta的精确度,最后两个参数是所要检测的圆的最大最小半径,不能盲目的检测,否则浪费时间和空间。输出就是三个参数空间矩阵。

利用霍夫检测对印章进行定位:

img = cv2.imread('yinzhang.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('img_yuantu', img)
gaussian = cv2.GaussianBlur(gray, (3, 3), 0)
circles1 = cv2.HoughCircles(gaussian, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=15, maxRadius=80)
print(np.shape(circles1))             # hough_gradient 霍夫梯度法
circles = circles1[0, :, :]
circles = np.uint16(np.around(circles))
for i in circles[:]:cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 3)cv2.circle(img, (i[0], i[1]), 2, (255, 0, 255), 10)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

相关文章

Windows下安装scikit-learn

在安装sklearn前,首先确保安装了Numpy、Scipy和matplotlib 安装Numpy: 首先到https://pypi.org/project/numpy/#files下载安装包 注意文件的版本,如“numpy-1.19.1-cp36-cp36m-win_amd64.whl”表示该文件适用于widows操作系统下64位的Pyth…

华为发布面向2025十大趋势

来源:华为华为今日发布全球产业展望GIV2025,提出智能世界正在加速而来,触手可及,并预测:到2025年,智能技术将渗透到每个人、每个家庭、每个组织,全球58%的人口将能享有5G网络,14%的家…

python+OpenCV图像处理(十一)图像轮廓检测

图像轮廓检测 (一)检测轮廓 在OpenCV-python中,使用cv2.findContours()函数来对图像进行轮廓检测。 返回三个值:image,contours,hierarchy contours指的是轮廓本身,hierarchy是每条轮廓对应的…

python+OpenCV图像处理(十二)车牌定位中对图像的形态学组合操作处理

车牌定位中对图像的形态学组合操作处理 所谓的车牌定位,其中最关键的部分就是对图片的处理,参数的设置,并使之拥有泛化能力。 首先传入图片,在进行大规模的图片处理时,因为无法确定图片的尺寸,所以需要将…

ACL 2019 知识图谱的全方位总结

来源:AI科技评论翻译 | 栗峰  审校 | Camel编辑 | Pita ACL 2019已经结束,但其空前的规模仍然震撼人心:2900多篇提交论文,660篇被接收,3000多名会议注册人员,以及4个超过400人的研讨会(比一些…

word只在第一页插入页眉

首先点击插入>页眉 在设计栏中勾上“首页不同”,如下所示:

Redis应用场景(转)

(来源:http://www.cnblogs.com/shanyou/archive/2012/09/04/2670972.html) Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: StringHashListSetSorted set在具体描述这几种数据类型之前,我们先通过一张图了解下Redis内部内存管理中…

word删除页眉下面的横线

首先点击插入>页眉,输入页眉后,选中页眉内容: 点击“设计”栏: 点击页面边框: 然后按如下设置即可消除页眉下面的横线

TensorFlow 多任务学习

多任务学习 多任务学习,顾名思义,就是多个任务模型同时执行,进行模型的训练,利用模型的共性部分来简化多任务的模型,实现模型之间的融合与参数共享,可以在一定程度上优化模型的运算,提高计算机…

【工业互联网】全球工业互联网十大最具成长性技术展望(2019-2020年)

来源:中国工业互联网研究院来源:中国工业互联网研究院全球工业互联网十大最具成长性技术展望(2019-2020年)工业互联网工业互联网是第四次工业革命的重要基石,在世界范围已步入发展快车道,正处于面临重大突破…

win10调节屏幕亮度_自动调节电脑屏幕亮度软件,保护你的眼睛

本文共514个字,预计用时2分钟小伙伴们,今天给大家分享一个小软件,名字叫做 EyeCareApp,中文名:护眼软件EyeCareApp是一款能够调节屏幕亮度的软件,它可以调整屏幕亮度,滤除蓝光,有效减…

国家计划统筹布局哪些人工智能创新平台?

来源:智造智库建设布局人工智能创新平台,是强化对人工智能研发应用的基础支撑。未来,国家层面计划大力促进各类通用软件和技术平台的开源开放,且按照军民深度融合的要求和相关规定,推进军民共享共用。人工智能开源软硬…

install package vif包_2019-10-03【百宝箱】如何使用wireshark实时远程抓取openwrt路由器包...

前言经常遇到问题的时候需要抓取wifi数据包,常用的做法有三种:1、使用 专用网卡omnipeekwindows软件抓包2、使用 macbook pro的airtool软件抓包3、在路由器上使用tcpdump除了omnipeek 其他都不能实时操作。如何结合openwrt来达到远程实时抓包呢&#xff…

CNN中的卷积操作与权值共享

CNN中非常有特点的地方就在于它的局部连接和权值共享,通过卷积操作实现局部连接,这个局部区域的大小就是滤波器filter,避免了全连接中参数过多造成无法计算的情况,再通过参数共享来缩减实际参数的数量,为实现多层网络提…

python根据矩阵数值大小涂上不同深浅颜色

绘制矩阵颜色图 import matplotlib.pyplot as pltplt.matshow(np.random.rand(5,5), cmapplt.get_cmap(Greens), alpha0.5) # , alpha0.3 plt.show()

20150210--Smarty1-02

20150210--Smarty1-02 三、设计篇 1、Smarty注释 基本语法: {*注释内容*} 示例代码: 2、Smarty中的变量 1)从PHP中分配的变量(普通的变量、数组、对象) 基本语法: $smarty->assign(); 示例代码: demo02.php demo02.html 运行效…

python 绘制时频图 plt.specgram

时频图以横轴为时间,纵轴为频率,用颜色表示幅值。在一幅图中表示信号的频率、幅度随时间的变化 matplotlib.pyplot.specgram(x, NFFTNone, FsNone, FcNone, detrendNone, windowNone, noverlapNone, cmapNone, xextentNone, pad_toNone, sidesNone, s…

华为鸿蒙系统四大特性:基于微内核,面向全场景,分布式架构

来源:今日头条8月9日,在广东东莞召开的华为开发者大会上,华为正式发布了自研操作系统:鸿蒙OS。据华为消费者业务CEO、华为技术有限公司常务董事余承东介绍,鸿蒙OS是基于微内核的面向全场景的分布式操作系统。随着华为全…

VM虚拟机中 localhost login_UTM 2.0 虚拟机来了,解决上网和无声音问题

今天主要讲一下UTM虚拟机,如果你对UTM这款APP不太熟悉,我在这里大致讲一下,这款应用工具,它可以安装在 iPad 和 iPhone 上刷入电脑系统,举例子:在UTM中刷入win7系统。甚至还能刷入 Android 安卓系统&#x…

搅动世界的两大因素

原创:张晓峰提要:移动互联、云计算、大数据、人工智能等技术因素逐步成为新基础设施,而泛连接、泛共享、泛融合与泛协同为代表的非技术因素正在重构这个世界。二者叠加融汇、相因相生。每个人都渐进或主动或被动地“被”函数化、数字化、孪生…