Изучение преобразования линии Хафа в Python: подробное руководство

Обнаружение линий играет решающую роль в приложениях компьютерного зрения, таких как распознавание объектов, обнаружение полос движения и анализ изображений. Одним из популярных методов обнаружения линий является преобразование линий Хафа. В этой статье мы рассмотрим различные методы реализации преобразования линии Хафа в Python с использованием библиотеки OpenCV. Мы предоставим примеры кода для каждого метода, чтобы помочь вам понять и эффективно применять концепции.

Метод 1: функция HoughLines OpenCV
Библиотека OpenCV предоставляет удобную функцию под названием HoughLines, которая напрямую вычисляет линии с помощью преобразования линий Хафа. Вот пример того, как его использовать:

import cv2
import numpy as np
def detect_lines_hough(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)
    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))
            cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    return image
# Usage example
input_image = cv2.imread('input.jpg')
output_image = detect_lines_hough(input_image)
cv2.imshow('Hough Lines', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Метод 2: Вероятностное преобразование Хафа
Вероятностное преобразование Хафа является расширением стандартного преобразования Хафа, которое обеспечивает более эффективный способ обнаружения линий. Вот пример того, как его использовать:

import cv2
import numpy as np
def detect_lines_probabilistic_hough(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    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(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    return image
# Usage example
input_image = cv2.imread('input.jpg')
output_image = detect_lines_probabilistic_hough(input_image)
cv2.imshow('Probabilistic Hough Lines', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Метод 3: реализация собственного преобразования Хафа
Для более глубокого понимания преобразования Хафа вы также можете реализовать его с нуля. Вот пример:

import cv2
import numpy as np
def detect_lines_custom_hough(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    height, width = edges.shape[:2]
    rho_max = int(np.sqrt(height2 + width2))
    theta_values = np.deg2rad(np.arange(0, 180))
    accumulator = np.zeros((2*rho_max, len(theta_values)), dtype=np.uint8)
    for y in range(height):
        for x in range(width):
            if edges[y, x] > 0:
                for theta_index, theta in enumerate(theta_values):
                    rho = int(x * np.cos(theta) + y * np.sin(theta))
                    accumulator[rho + rho_max, theta_index] += 1
    lines = np.argwhere(accumulator > threshold)
    for rho_index, theta_index in lines:
        rho = rho_index - rho_max
        theta = theta_values[theta_index]
        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(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    return image
# Usage example
input_image = cv2.imread('input.jpg')
output_image = detect_lines_custom_hough(input_image)
cv2.imshow('Custom Hough Lines', output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

В этой статье мы рассмотрели несколько методов реализации преобразования линии Хафа в Python. Мы рассмотрели встроенную функцию HoughLines, предоставляемую OpenCV, вероятностное преобразование Хафа (HoughLinesP) и специальную реализацию с нуля. Каждый метод имеет свои преимущества и может применяться в зависимости от конкретных требований. Понимая и используя эти методы, вы сможете эффективно обнаруживать и извлекать линии из изображений в различных приложениях компьютерного зрения.

Используя преобразование линий Хафа, вы можете улучшить конвейер обработки изображений и обеспечить надежное обнаружение линий. Независимо от того, работаете ли вы над распознаванием объектов, обнаружением полос движения или над любой другой задачей компьютерного зрения, связанной с линиями, преобразование линий Хафа – это мощный инструмент, который обязательно должен быть в вашем наборе инструментов.

Не забывайте экспериментировать и настраивать параметры в соответствии с вашим конкретным вариантом использования, чтобы добиться оптимальных результатов. Приятного кодирования!