OpenCV图像处理(十九)---霍夫变换

 内能(internal energy) 从微观的角度来看,是分子无规则运动能量总和的统计平均值。分子无规则运动的能量包括分子的动能、分子间相互作用势能以及分子内部运动的能量。物体的内能不包括这个物体整体运动时的动能和它在重力场中的势能。

原则上讲,物体的内能应该包括其中所有微观粒子的动能、势能、化学能、电离能和原子核内部的核能等能量的总和,但在一般热力学状态的变化过程中,物质的分子结构、原子结构和核结构不发生变化,所以可不考虑这些能量的改变。但当在热力学研究中涉及化学反应时,需要把化学能包括到内能中。                                        

科普

知识

前言

      在上周的文章中,我们学习了图像的模板匹配方法,了解到模板匹配作为目标追踪算法之一,非常实用,它的主要操作就是在目标图像中遍历查找我们的模板,达到匹配的目的。今天我们继续来学习图像的新知识--霍夫变换。 

一、霍夫变换

      霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。

      现在广泛使用的霍夫变换是由RichardDuda和PeterHart在公元1972年发明,并称之为广义霍夫变换(generalizedHoughtransform),广义霍夫变换和更早前1962年的PaulHough的专利有关。经典的霍夫变换是侦测图片中的直线,之后,霍夫变换不仅能识别直线,也能够识别任何形状,常见的有圆形、椭圆形。1981年,因为DanaH.Ballard的一篇期刊论文"Generalizing the Hough transform to detect arbitrary shapes",让霍夫变换开始流行于计算机视觉界。

      一段话总结:霍夫变换的存在就是为了找出物体的形状,包括,直线,圆形,椭圆等等,当然我们栏目更加注重实践,它的原理我们在这里简单的说一下,将图像中的像素值所在的坐标进行空间变换到另一个坐标,而在另一个坐标中,例如直线或者圆圈等区域的像素值将会对应一条直线方程,而且不同的形状之间的直线方程是不同的,因此可以找出直线等形状,如果需要了解他的具体数学原理,我们可以后期单独交流哦。

     我们今天的分享:将霍夫变换应用到圆圈的查找中,涉及的方法包括图像灰度转换,滤波等操作。

1.1 原始图像

(驾驶室实景,方向盘在右边?) 

1.2 代码实践

#coding:utf-8
import cv2
import numpy as np


# 导入图像路径
img_path = './driver.jpg'
# 读取图像
src_img = cv2.imread(img_path)
# 图像灰度化
gray_img = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY)
# 图像滤波 此处采用高斯滤波  防止图像由噪声
gray_img = cv2.GaussianBlur(gray_img,(7,7),0)
#gray_img = cv2.bilateralFilter(gray_img, 21, 75, 75)


# 调用霍夫变换函数找到图像中的圆圈
circles = cv2.HoughCircles(gray_img, cv2.HOUGH_GRADIENT, 1, 125,
                           param1=90, param2=68, minRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
    # 画出圆圈的外圈,(0, 255, 0)表示BGR中的绿色(G=255)
    cv2.circle(src_img, (i[0], i[1]), i[2], (0, 255, 0), 2)
    # 画出圆心(0, 0, 255)表示BGR中的红色(R=255)
    cv2.circle(src_img, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imshow("huofu_cicle", src_img)
# 保存实验结果
cv2.imwrite("huofu_cicle.jpg", src_img)
cv2.waitKey()

代码解读:如上代码较为简单,首先读入图像,然后进行灰度化、高斯滤波操作,接着调用霍夫变换函数进行圆圈的位置查找,该函数返回找到圆圈的圆心和范围,然后利用画圈函数进行绘制。这里我们重点关注下霍夫变换函数的参数值。

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

image:8位,单通道图像。如果使用彩色图像,需要先转换为灰度图像。

method:定义检测图像中圆的方法。目前唯一实现的方法是cv2.HOUGH_GRADIENT。

dp:累加器分辨率与图像分辨率的反比。dp获取越大,累加器数组越小。

minDist:检测到的圆的中心,(x,y)坐标之间的最小距离。如果minDist太小,则可能导致检测到多个相邻的圆。如果minDist太大,则可能导致很多圆检测不到。

param1:用于处理边缘检测的梯度值方法。

param2:cv2.HOUGH_GRADIENT方法的累加器阈值。阈值越小,检测到的圈子越多。

minRadius:半径的最小大小(以像素为单位)。

maxRadius:半径的最大大小(以像素为单位)。

1.3 效果展示

(可以看到,图中方向盘位置(圆圈)已经被找到了,但是效果不是很理想,可以适当调整一下所用函数的参数)

结语

     今天的文章分享到这里就结束了,我们主要学习了霍夫变换的函数使用和代码实践,虽说霍夫变换的效果可能不是很好,需要手动调整。但是,这并不影响我们的使用,因此霍夫变换的使用范围还是很广的。期待大家都能掌握今天的代码哦,我们下期再见!

编辑:玥怡居士|审核:小圈圈居士

往期精彩回顾

OpenCV图像处理(十八)---图像之模板匹配

OpenCV图像处理(十七)---图像直方图均衡化

OpenCV图像处理(十六)---图像直方图

扫码关注更多精彩

点亮在看,你最好看!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值