007 OpenCV霍夫变换(直线检测)

目录

一、环境

二、霍夫变换原理

三、代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、霍夫变换原理

OpenCV中的霍夫变换是一种用于检测图像中直线和圆的算法。它基于图像中像素的分布情况,通过统计像素点之间的相互关系来识别出直线或圆的位置和参数。

霍夫变换的原理是利用图像中的边缘信息来检测直线或圆。在图像中,边缘信息通常表现为灰度值的变化,即相邻像素之间的灰度值差异较大。因此,霍夫变换首先需要对图像进行边缘检测,提取出边缘信息。常用的边缘检测方法有Sobel算子、Canny算子等。

对于直线检测,霍夫变换的基本思想是将图像划分为若干个小区域,然后计算每个小区域内的像素点与该区域内某条直线的关系。具体来说,对于每个小区域,霍夫变换会找到一条最佳拟合该区域内所有像素点的直线,这条直线被称为该区域的“主成分”。接下来,霍夫变换会计算每个小区域内的像素点到其主成分的距离,并统计距离小于某个阈值的像素点的数量。最后,霍夫变换会根据距离和数量的关系来确定图像中的直线位置和参数。

对于圆检测,霍夫变换的基本思想是将图像划分为若干个小区域,然后计算每个小区域内的像素点与该区域内某条圆的关系。具体来说,对于每个小区域,霍夫变换会找到一条最佳拟合该区域内所有像素点的圆,这个圆被称为该区域的“主圆”。接下来,霍夫变换会计算每个小区域内的像素点到其主圆的距离,并统计距离小于某个阈值的像素点的数量。最后,霍夫变换会根据距离和数量的关系来确定图像中的圆心位置和半径。

需要注意的是,霍夫变换只能检测图像中的直线或圆的位置和参数,而不能直接得到它们的具体形状。因此,在使用霍夫变换时,需要根据具体情况选择合适的参数和方法来提高检测的准确性和鲁棒性。

总之,霍夫变换是一种非常有用的图像处理技术,它可以帮助我们快速准确地检测图像中的直线和圆。在实际应用中,霍夫变换被广泛应用于计算机视觉、模式识别、机器视觉等领域。

三、代码

输入图像如下图,利用霍夫变换检测如图线段:

完整代码:

import cv2 as cv
import numpy as np

# 读图
img = cv.imread(cv.samples.findFile('data/sudoku.png'))
# 灰度化
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 提取canny边缘
edges = cv.Canny(gray,50,150,apertureSize = 3)
# 霍夫变换
lines = cv.HoughLines(edges,1,np.pi/180,200)
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('houghlines3.jpg',img)

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄家驹beyond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值