opencv-霍夫变换

霍夫变换(Hough Transform)是一种图像处理技术,用于检测图像中的直线、圆和其他简单形状。它通过将图像空间(像素空间)中的点映射到参数空间,从而将形状检测问题转换为参数空间中的峰值检测问题。霍夫变换最常用的应用是直线检测和圆检测。

1. 直线检测

在直线检测中,霍夫变换将图像中的点映射到直线参数空间。通常有两种表示直线的方式:

  • 标准方程: ( y = mx + c )
  • 极坐标方程: ( \rho = x \cos \theta + y \sin \theta )

其中,(\rho) 是从原点到直线的垂直距离,(\theta) 是从x轴正方向逆时针旋转到该垂直线的角度。

OpenCV中的霍夫直线变换

在OpenCV中,有两种实现霍夫直线变换的方法:

  1. 标准霍夫变换 cv2.HoughLines
  2. 概率霍夫变换 cv2.HoughLinesP
标准霍夫变换 cv2.HoughLines
python 复制代码
import cv2
import numpy as np

# 读取图像并转换为灰度图
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

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

# 标准霍夫变换
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)

# 绘制检测到的直线
if lines is not None:
    for rho, theta in lines[:, 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))
        cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

cv2.imshow('Detected Lines', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
概率霍夫变换 cv2.HoughLinesP
python 复制代码
import cv2
import numpy as np

# 读取图像并转换为灰度图
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

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

# 概率霍夫变换
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, threshold=100, minLineLength=100, maxLineGap=10)

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

cv2.imshow('Detected Lines', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 圆检测

霍夫圆变换是霍夫变换的另一种形式,用于检测图像中的圆。

OpenCV中的霍夫圆变换

在OpenCV中,可以使用 cv2.HoughCircles 来实现霍夫圆变换。

python 复制代码
import cv2
import numpy as np

# 读取图像并转换为灰度图
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用高斯模糊
gray = cv2.GaussianBlur(gray, (9, 9), 2)

# 霍夫圆变换
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1.2, minDist=30, param1=50, param2=30, minRadius=10, maxRadius=100)

# 绘制检测到的圆
if circles is not None:
    circles = np.uint16(np.around(circles))
    for i in circles[0, :]:
        cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)
        cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3)

cv2.imshow('Detected Circles', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

总结

  • 霍夫直线变换 :可以使用标准霍夫变换(cv2.HoughLines)和概率霍夫变换(cv2.HoughLinesP)来检测图像中的直线。标准霍夫变换适用于检测直线较多的场景,而概率霍夫变换更适合检测少量且较长的直线。
  • 霍夫圆变换 :可以使用 cv2.HoughCircles 检测图像中的圆形物体。通过调节参数,可以检测不同大小和不同间距的圆。

霍夫变换在图像处理和计算机视觉中有广泛的应用,尤其适用于检测图像中的几何形状,如直线和圆。

相关推荐
音视频牛哥12 分钟前
从H.264到AV1:音视频技术演进与模块化SDK架构全解析
人工智能·音视频·大牛直播sdk·rtsp h.265·h.264 h.265 av1·h.265和h.266·enhenced rtmp
AIbase202422 分钟前
如何快速找到最适合的AI绘画工具?避免在200+工具中挑花眼?
人工智能
机器之心1 小时前
DeepSeek开源新基础模型,但不是V4,而是V3.1-Base
人工智能·openai
金融小师妹1 小时前
AI多因子模型解析:黄金涨势受阻与美联储9月降息政策预期重构
大数据·人工智能·算法
R-G-B1 小时前
【P38 6】OpenCV Python——图片的运算(算术运算、逻辑运算)加法add、subtract减法、乘法multiply、除法divide
人工智能·python·opencv·图片的运算·图片加法add·图片subtract减法·图片乘法multiply
拖拖7651 小时前
解读《Thyme: Think Beyond Images》——让大模型“写代码”思考图像
人工智能
双向331 小时前
模型量化大揭秘:INT8、INT4量化对推理速度和精度的影响测试
人工智能
lisuwen1161 小时前
GPT-5 上线风波深度复盘:从口碑两极到策略调整,OpenAI 的变与不变
大数据·人工智能·gpt·chatgpt
硅谷秋水2 小时前
在相机空间中落地动作:以观察为中心的视觉-语言-行动策略
机器学习·计算机视觉·语言模型·机器人
新智元2 小时前
16 岁天才少年炒掉马斯克,空降华尔街巨头!9 岁上大学,14 岁进 SpaceX
人工智能·openai