← 返回首页
霍夫变换
发表时间:2025-02-24 08:39:23
霍夫变换

霍夫变换(Hough Transform)是一种用于检测图像中简单形状的技术,特别是在检测直线、圆、椭圆和直线段等几何形状时非常有用。

1.霍夫变换

霍夫变换(Hough Transform)是一种用于图像处理和计算机视觉中的经典算法,主要用于从图像中检测形状(如直线、圆等)。它通过将图像从空间域(如二维图像)映射到参数空间(霍夫空间),从而实现形状的检测。以下是霍夫变换的详细解释:

1.1 霍夫变换的基本原理

霍夫变换的核心思想是将图像中的点(如边缘点)映射到参数空间,并在参数空间中寻找形状的参数。以直线检测为例:

如上图,原图像空间的蓝色点和红色点,分别对应到参数空间上的蓝色线和蓝色点,而原图像空间的蓝色线和红色线,分别对应到参数空间上的蓝色点和蓝色线。而原图像空间上的蓝色点和红色点的连线(二点共线),则对应到参数空间上蓝色线和红色线的交点(紫色点)。这样我们就可以把在原图像中的多点共线问题,转化为了新的参数空间上的多线共点问题。而多点共线问题就比较难寻找的,而多线共点则可以使用网格投票法简单找到。假设我们把参数空间上划分了很多NxN的网格,然后我们统计每个网格内直线出现的条数,则出现的越多则意味着原图像中有越多的点共线了,则该参数空间内的该网格对应的原图像空间的直线则就是一条由很多点组成的直线。当网格划分更细时,直线位置越准确,但对于噪声更敏感,一旦某些点略微偏差直线就难以识别;当网格划分更粗时,直线位置越不精确,但可以识别近似形成直线的情形。

总结来说,霍夫变换的核心思想是将原图像中的点映射到参数空间中的直线,从而将“多点共线”问题转化为“多线共点”问题。 - 在原图像中,一个点可以对应到参数空间中的一条直线。 - 如果原图像中有多个点共线,那么这些点在参数空间中对应的直线会相交于一个点。 - 因此,多线共点的交点位置就对应了原图像中的一条直线。

1.2 霍夫变换直线检测

下面我们使用Python和OpenCV实现车道线检测的例子,包括Canny边缘检测、ROI选择、霍夫变换、直线拟合和加权图像显示。

import cv2
import numpy as np


def detect_lane_lines(image_path):
    # 读取图像
    image = cv2.imread(image_path)
    if image is None:
        print("Error: Image not found.")
        return

    # 转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 高斯模糊
    blur_gray = cv2.GaussianBlur(gray, (3, 3), 0)

    # 边缘检测(Canny)
    edges = cv2.Canny(blur_gray, 250, 255)

    # 霍夫变换检测直线
    rho = 1 # 距离精度
    theta = np.pi / 180  # 角度精度
    threshold = 30  # 阈值
    min_line_length = 80  # 最小线长度
    max_line_gap = 10  # 最大线间间隙
    lines = cv2.HoughLinesP(edges, rho, theta, threshold, np.array([]), min_line_length, max_line_gap)

    if lines is not None:
        for line in lines:
            x1, y1, x2, y2 = line[0]
            cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 3)

    # 显示结果
    cv2.imshow('Lane Lines', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用函数
detect_lane_lines('./images/png/road01.png')