python:霍夫变换检测直线

霍夫变换检测直线

在Python中,可以使用OpenCV库来实现霍夫变换进行直线检测。

一、原理

1、霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是从黑白图像中检测直线(线段)。

2、Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等)

3、霍夫线变换是一种用来寻找直线的方法。用霍夫线变换之前, 首先需要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像。

二、代码实现:

python 复制代码
#霍夫直线变换做直线检测
import cv2 as cv
import numpy as np

#标准霍夫线变换
def line_detection(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)  # 转换为灰度图
    edges = cv.Canny(gray, 50, 150, apertureSize=3)  # 使用Canny算子进行边缘检测
    cv.imshow("edges", edges)
    lines = cv.HoughLines(edges, 1, np.pi / 180, 200)   # 使用霍夫变换检测直线
    for line in lines:
        rho, theta = line[0]  #line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。
        a = np.cos(theta)   #theta是弧度
        b = np.sin(theta)
        x0 = a * rho    #代表x = r * cos(theta)
        y0 = b * rho    #代表y = r * sin(theta)
        x1 = int(x0 + 1000 * (-b)) #计算直线起点横坐标
        y1 = int(y0 + 1000 * a)    #计算起始起点纵坐标
        x2 = int(x0 - 1000 * (-b)) #计算直线终点横坐标
        y2 = int(y0 - 1000 * a)    #计算直线终点纵坐标
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv.imshow("HoughLines", image)

#统计概率霍夫线变换
def line_detect_possible_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)
    lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5)
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv.imshow("HoughLinesP",image)

src = cv.imread('img.png')
print(src.shape)
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
line_detection(src)
src = cv.imread('img.png') #调用上一个函数后,会把传入的src数组改变,所以调用下一个函数时,要重新读取图片
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

img.png是要进行检测的原始图片的图片名称(输入你的图片路径)

input_image是要进行检测的原始图片

edges是边缘检测后的图片

HoughLines是进行标准霍夫变换后的图片

HoughLinesP是进行统计概率霍夫变换后的图片

注意:进行标准霍夫变换时计算的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长

三、输出结果:

原始图片

标准霍夫变换后的图片

统计概率霍夫变换后的图片

四、HoughLines函数和HoughLinesP函数的区别:

基于OpenCV进行直线检测可以使用HoughLines和HoughLinesP函数完成。

这两个函数之间的唯一区别在于,第一个函数使用标准霍夫变换,第二个函数使用概率霍夫变换(因此名称为 P)。概率版本之所以如此,是因为它仅分析点的子集并估计这些点都属于同一条线的概率。此实现是标准霍夫变换的优化版本,在这种情况下,它的计算强度较小且执行速度更快。

相关推荐
vvoennvv1 天前
【Python TensorFlow】 TCN-GRU时间序列卷积门控循环神经网络时序预测算法(附代码)
python·rnn·神经网络·机器学习·gru·tensorflow·tcn
自学互联网1 天前
使用Python构建钢铁行业生产监控系统:从理论到实践
开发语言·python
无心水1 天前
【Python实战进阶】7、Python条件与循环实战详解:从基础语法到高级技巧
android·java·python·python列表推导式·python条件语句·python循环语句·python实战案例
xwill*1 天前
RDT-1B: A DIFFUSION FOUNDATION MODEL FOR BIMANUAL MANIPULATION
人工智能·pytorch·python·深度学习
陈奕昆1 天前
n8n实战营Day2课时2:Loop+Merge节点进阶·Excel批量校验实操
人工智能·python·excel·n8n
程序猿追1 天前
PyTorch算子模板库技术解读:无缝衔接PyTorch模型与Ascend硬件的桥梁
人工智能·pytorch·python·深度学习·机器学习
雍凉明月夜1 天前
视觉opencv学习笔记Ⅲ
笔记·opencv·学习
秋邱1 天前
高等教育 AI 智能体的 “导学诊践” 闭环
开发语言·网络·数据库·人工智能·python·docker
组合缺一1 天前
Solon AI 开发学习6 - chat - 两种 http 流式输入输出
python·学习·http
沐浴露z1 天前
为什么使用SpringAI时通常用Builder来创建对象?详解 【Builder模式】和【直接 new】的区别
java·python·建造者模式