美文网首页
opencv+python -- 霍夫直线检测

opencv+python -- 霍夫直线检测

作者: 小兵12138 | 来源:发表于2019-04-15 10:25 被阅读0次

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

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

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

    4.霍夫直线检测的具体原理参见:
    https://blog.csdn.net/ycj9090900/article/details/52944708

    http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html

    http://lib.csdn.net/article/opencv/24201

    Code

    import cv2 as cv
    import numpy
    
    
    def line_detection(image):
        # 标准霍夫线变换
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        edges = cv.Canny(gray, 50, 150, apertureSize=3)
        lines = cv.HoughLines(edges, 1, numpy.pi/180, 200)
        for line in lines:
            # print(type(line))
            rho, theta = line[0]  # line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。
            a = numpy.cos(theta)  # theta是弧度
            b = numpy.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)  # 计算直线终点纵坐标
            # 注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长
            cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) # 点的坐标必须是元组,不能是列表
        cv.imshow("image_line", image)
    
    
    def line_detect_possible_demo(image):
        # 统计概率霍夫线变换
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize参数默认其实就是3
        lines = cv.HoughLinesP(edges, 1, numpy.pi/180, 100, minLineLength=50, maxLineGap=10)
        for line in lines:
            print(type(line))
            x1, y1, x2, y2 = line[0]
            cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
        cv.imshow("line_detect_possible_demo", image)
    
    
    src = cv.imread("./data/sudoku.png", cv.IMREAD_COLOR)
    cv.namedWindow("line", cv.WINDOW_AUTOSIZE)
    cv.imshow("line", src)
    # line_detection(src)
    line_detect_possible_demo(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    运行结果

    原图sudoku.png

    !*g](https://img.haomeiwen.com/i7855458/adc25a878af6e815.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    API

    1.opencv的HoughLines函数是标准霍夫线变换函数,该函数的功能是通过一组参数对

    的集合来表示检测到的直线,其函数原型为:HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines

    image参数表示边缘检测的输出图像,该图像为单通道8位二进制图像。

    rho参数表示参数极径

    以像素值为单位的分辨率,这里一般使用1像素。

    theta参数表示参数极角

    以弧度为单位的分辨率,这里使用1度。

    threshold参数表示检测一条直线所需最少的曲线交点。

    lines参数表示储存着检测到的直线的参数对

    的容器 。

    srn参数、stn参数默认都为0。如果srn = 0且stn = 0,则使用经典的Hough变换。

    min_theta参数表示对于标准和多尺度Hough变换,检查线条的最小角度。

    max_theta参数表示对于标准和多尺度Hough变换,检查线条的最大角度。

    2.opencv的HoughLinesP函数是统计概率霍夫线变换函数,该函数能输出检测到的直线的端点

    ,其函数原型为:HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) -> lines

    image参数表示边缘检测的输出图像,该图像为单通道8位二进制图像。

    rho参数表示参数极径

    以像素值为单位的分辨率,这里一般使用 1 像素。

    theta参数表示参数极角

    以弧度为单位的分辨率,这里使用 1度。

    threshold参数表示检测一条直线所需最少的曲线交点。

    lines参数表示储存着检测到的直线的参数对 (x_{start}, y_{start}, x_{end}, y_{end})

    的容器,也就是线段两个端点的坐标。

    minLineLength参数表示能组成一条直线的最少点的数量,点数量不足的直线将被抛弃。

    maxLineGap参数表示能被认为在一条直线上的亮点的最大距离。

    参考:
    https://www.cnblogs.com/FHC1994/p/9138315.html

    相关文章

      网友评论

          本文标题:opencv+python -- 霍夫直线检测

          本文链接:https://www.haomeiwen.com/subject/mxiywqtx.html