霍夫变换(opencv_python学习)


霍夫变换是一种常用的图像处理技术,用于检测图像中的直线、圆或其他形状。

霍夫线变换

解决霍夫变换用于检测图像中的直线问题。
OpenCV提供了两种执行霍夫变换检测直线的函数:cv.HoughLines() 和 cv.HoughLinesP()。

cv.HoughLines():

这个函数用于检测二值化图像中的直线。它的调用方式如下:

lines = cv.HoughLines(image, rho, theta, threshold)
  • image 是输入的二值化图像。
  • rho 和 theta 是霍夫空间中的极坐标参数分辨率。
  • threshold 是用于判定一条直线是否被检测到的阈值。

该函数返回一个包含检测到的直线参数(ρ 和 θ)的数组。你可以使用这些参数来绘制直线。

cv.HoughLinesP():

这个函数与cv.HoughLines()类似,但是它可以在输入的图像中检测到线段而不仅仅是直线。其调用方式如下:

lines = cv.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
  • image 是输入图像。
  • rho 和 theta 是霍夫空间中的极坐标参数分辨率。
  • threshold 是用于判定一条线段是否被检测到的阈值。
  • minLineLength 是允许被检测到的线段的最小长度。
  • maxLineGap 是被视为同一线段的两个线段之间的最大间隙。

该函数返回一个包含检测到的线段的数组,每个线段由其两个端点坐标(x1, y1)和(x2, y2)表示。

在使用这两个函数之前,通常需要先对图像进行预处理,如二值化处理、边缘检测等,以便提供给霍夫变换函数。

一般霍夫线变换

import numpy as np
import cv2 as cv

# 读取图像
img = cv.imread('pic1.jpg')

# 将图像转为灰度图像
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 获取图像尺寸
rows, cols = gray.shape

# 边缘检测
edges = cv.Canny(gray, 50, 150, apertureSize=3)

# 执行霍夫变换检测直线
lines = cv.HoughLines(edges, 1, np.pi/180, 200)

# 绘制检测到的直线
if lines is not None:
    for line in lines:
        rho, theta = line[0]
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a * rho
        y0 = b * rho
        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), (0, 0, 255), 2)

# 显示结果
cv.imwrite('pic.jpg', img)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

概率霍夫线变换

当图像中存在大量噪声、部分遮挡或直线不明显时,传统霍夫变换可能会出现一些问题。为了解决这些问题,可以使用概率霍夫变换(Probabilistic Hough Transform)。

概率霍夫变换是一种改进的霍夫变换方法,它不仅能检测直线,还可以估计直线的起点和终点。相比于传统霍夫变换,概率霍夫变换的计算速度更快,因为它只对部分边缘点进行投票。

# 执行概率霍夫变换检测直线
lines = cv.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=50, maxLineGap=10)

# 绘制检测到的直线
if lines is not None:
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)

在这里插入图片描述

霍夫圈变换

cv.HoughCircles() 函数是 OpenCV 中用于执行霍夫圆变换的函数。该函数可用于在图像中检测圆形对象。

函数原型如下:

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

参数说明:

  • image:输入的8位单通道灰度图像。
  • method:指定霍夫圆变换的方法,一般使用 cv.HOUGH_GRADIENT。
  • dp:累加器分辨率与图像分辨率的倒数的比例。常用的取值范围是 1 到 10 之间。
  • minDist:检测到的圆之间的最小距离,如果两个圆间的距离小于此值,则会将其视为同心圆。
  • param1:可以根据图像特性调整的第一个处理参数。
  • param2:可以根据图像特性调整的第二个处理参数。
  • minRadius 和 maxRadius:要检测的圆的最小和最大半径。

返回值:

  • circles:包含检测到的圆的信息的 Numpy 数组。每个圆由三个值构成:圆心的 x 坐标、圆心的 y 坐标和半径。
    注意事项:

  • cv.HoughCircles() 函数对于噪声敏感,因此在应用之前可能需要进行图像预处理,例如降噪、平滑化或调整图像对比度。
    调整参数 minDist、param1、param2、minRadius 和 maxRadius 可能需要根据具体图像场景进行调试。

# 霍夫圆变换
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=30, param1=50, param2=30, minRadius=0, maxRadius=0)

# 绘制检测到的圆
if circles is not None:
    circles = np.round(circles[0, :]).astype("int")
    for (x, y, r) in circles:
        cv.circle(img, (x, y), r, (0, 255, 0), 2)

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值