霍夫变换(Hough Transform)

霍夫变换(Hough Transform)本文介绍了霍夫变换的概念及其在图像处理中的应用 特别是霍夫直线检测和霍夫圆检测

大家好,欢迎来到IT知识分享网。

1. 什么是霍夫变换

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。

霍夫变换于1962年由PaulHough首次提出,最初的Hough变换是设计用来检测直线和曲线,起初的方法要求知道物体边界线的解析方程,但不需要有关区域位置的先验知识。这种方法的一个突出优点是分割结果的Robustness,即对数据的不完全或噪声不是非常敏感。然而,要获得描述边界的解析表达常常是不可能的。后于1972年由Richard Duda & Peter Hart推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。

霍夫变换在OpenCV中分为霍夫线变换和霍夫圆变换两种。

2. 霍夫直线检测

Hough直线检测的基本原理在于利用点与线的对偶性,在我们的直线检测任务中,即图像空间中的直线与参数空间中的点是一一对应的,参数空间中的直线与图像空间中的点也是一一对应的。这意味着我们可以得出两个非常有用的结论:

因此Hough直线检测算法就是把在图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务。

2.1 霍夫直线检测的具体步骤

  1. 彩色图像->灰度图;
  2. 去噪(高斯核);
  3. 边缘提取(梯度算子、拉普拉斯算子、canny、sobel);
  4. 二值化(判断此处是否为边缘点,就看灰度值==255);
  5. 映射到霍夫空间(准备两个容器,一个用来展示hough-space概况,一个数组hough-space用来储存voting的值,因为投票过程往往有某个极大值超过阈值,多达几千,不能直接用灰度图来记录投票信息);
  6. 取局部极大值,设定阈值,过滤干扰直线;
  7. 绘制直线、标定角点。

2.2 霍夫直线检测的优缺点

优点:Hough直线检测的优点是抗干扰能力强,对图像中直线的残缺部分、噪声以及其它共存的非直线结构不敏感,能容忍特征边界描述中的间隙,并且相对不受图像噪声的影响。

缺点:Hough变换算法的特点导致其时间复杂度和空间复杂度都很高,并且在检测过程中只能确定直线方向,丢失了线段的长度信息。由于霍夫检测过程中进行了离散化,因此检测精度受参数离散间隔制约。

2.3 OpenCV中霍夫直线检测的应用

OpenCV的中用函数HoughLines(标准)和HoughLinesP(基于统计)来检测图像中的直线,函数原型如下:

2.3.1 标准霍夫检测

lines = cv.HoughLines( image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]] ) 

2.3.2 概率霍夫检测

lines = cv.HoughLinesP( image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]] ) 

测试代码如下:

import cv2 as cv import numpy as np import matplotlib.pyplot as plt src = cv.imread("demo-line.jpg") img = src.copy() # 二值化图像(Canny边缘检测) gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY) dst_img = cv.Canny(gray_img, 50, 150) # 霍夫线变换 lines = cv.HoughLines(dst_img, 0.5, np.pi / 180, 300) # 将检测的线绘制在原图上(注意是极坐标) for line in lines: rho, theta = line[0] a = np.cos(theta) b = np.sin(theta) # 找两个点 x0 = rho * a y0 = rho * b x1 = int(x0 + 1000 * (-b)) y1 = int(y0 + 1000 * a) x2 = int(x0 - 1000 * (-b)) y2 = int(y0 - 1000 * a) cv.line(img, (x1, y1), (x2, y2), (255, 0, 0), 3) # 显示图像 plt.subplot(311), plt.imshow(src, 'gray'), plt.title('src_img'), plt.axis('off') plt.subplot(312), plt.imshow(dst_img, 'gray'), plt.title('canny_img'), plt.axis('off') plt.subplot(313), plt.imshow(img, 'gray'), plt.title('HoughLines_img'), plt.axis('off') plt.show() 

效果如下:

在这里插入图片描述

3. 霍夫圆检测

霍夫圆变换的基本思路是认为图像上每一个非零像素点都有可能是一个潜在的圆上的一点,跟霍夫线变换一样,也是通过投票,生成累积坐标平面,设置一个累积权重来定位圆。

OpenCV中使用cv2.HoughCircles函数来实现霍夫圆检测,其函数原型如下:

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

测试代码如下:

import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('demo-circle.jpg',0) img = cv2.medianBlur(img,5) cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,200,param1=50,param2=30,minRadius=0,maxRadius=0) circles = np.uint16(np.around(circles)) for i in circles[0,:]: # draw the outer circle cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2) # draw the center of the circle cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) plt.subplot(121), plt.imshow(img, 'gray'), plt.title('src_img'), plt.axis('off') plt.subplot(122), plt.imshow(cimg, 'gray'), plt.title('HoughCircles_img'), plt.axis('off') plt.show() 

效果如下:

在这里插入图片描述

4. 源码仓库地址

🌼 图像处理、机器学习的常用算法汇总

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119673.html

(0)
上一篇 2025-11-03 20:15
下一篇 2025-11-03 20:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信