Python实现Canny及Hough算法代码实例解析

  • Post category:Python

下面是详细讲解“Python实现Canny及Hough算法代码实例解析”的完整攻略。

Canny算法

Canny算法是一种经典的边缘检测算法,其基本思想是通过多次滤波和非极大值抑制来检测图像中的边缘,并通过双阈值处理来提取边缘。

下面是一个Python实现Canny算法的示例:

import cv2
import numpy as np

def canny(image, low_threshold, high_threshold):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
    edges = cv2.Canny(blur, low_threshold, high_threshold)
    return edges

image = cv2.imread('test.jpg')
edges = canny(image, 50, 150)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码中,首先定义了一个canny函数,该函数接受一个图像、一个低阈值和一个高阈值,使用高斯滤波和Canny算法检测图像中的边缘,并返回边缘图像。

然后,读取一张测试图像,并使用canny函数检测边缘。最后,显示边缘图像。

Hough变换

Hough变换是一种经典的图像处理算法,其基本思想是将图像中的直线转换为参数空间中的点,通过在参数空间中寻找交点来检测图像中的直线。

下面是一个Python实现Hough变换的示例:

import cv2
import numpy as np

def hough_lines(image, rho, theta, threshold):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150)
    lines = cv2.HoughLines(edges, rho, theta, threshold)
    return lines

def draw_lines(image, lines):
    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)

image = cv2.imread('test.jpg')
lines = hough_lines(image, 1, np.pi/180, 200)
draw_lines(image, lines)
cv2.imshow('Lines', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

上述代码中,首先定义了一个hough_lines函数,该函数接受一个图像、一个rho值、一个theta值和一个阈值,使用Canny算法和Hough变换检测图像中的直线,并返回直线参数。

然后,定义了一个draw_lines函数,该函数接受一个图像和直线参数,将直线绘制在图像上。

然后,读取一张测试图像,并使用hough_lines函数检测直线,然后使用draw_lines函数将直线绘制在图像上。最后,显示带有直线的图像。

总结

Canny算法和Hough变换是经典的图像处理算法,可以使用OpenCV库在Python中进行实现。在实现过程中,需要使用Canny算法检测边缘和Hough变换检测直线,并使用绘图函数将直线绘制在图像上。