• 直线检测(14)


    1.1 霍夫变换(Hough Transform) 
      霍夫变换(Hough Transform)换于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,是图像处理中从图像中检测几何形状的基本方法之一。经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以进行任意形状物体的识别,例如圆和椭圆。
      
      霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。

    1.2 霍夫直线检测(Hough Line Detection) 
      Hough直线检测的基本原理在于利用点与线的对偶性,在我们的直线检测任务中,即图像空间中的直线与参数空间中的点是一一对应的,参数空间中的直线与图像空间中的点也是一一对应的。这意味着我们可以得出两个非常有用的结论:
      1)图像空间中的每条直线在参数空间中都对应着单独一个点来表示;
      2)图像空间中的直线上任何一部分线段在参数空间对应的是同一个点。
      
      因此Hough直线检测算法就是把在图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务。

    直线检测进入霍尔直线检测空间

     1.3 代码实现

    import cv2 as cv
    import numpy as np
    
    #霍尔直线检测HoughLines
    
    def line_image(image):
        tmp_image=image.copy()
        gray = cv.cvtColor(tmp_image, cv.COLOR_BGR2GRAY)
        edges = cv.Canny(gray, 50, 150, apertureSize=3)
        # 提取图像中所有的直线 如果没有侧键到返回lines=nonetype
        '''
        霍夫直线(极坐标空间):边缘检测图片edges,半径步长1,角度增量np.pi/180,边缘提取的低值200.
        '''
        lines = cv.HoughLines(edges, 1, np.pi/180, 200)
        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))
            #在原图绘制直线(x1,y1)--->(x2,y2) 颜色:红色 像素:2px
            cv.line(tmp_image, (x1, y1), (x2, y2), (0, 0, 255), 2)
        cv.imshow('line',tmp_image)
    
    
    #霍尔直线检测HoughLinesP(推荐使用)
    def linep_image(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        edges = cv.Canny(gray, 50, 150, apertureSize=3)
        # 提取图像中所有的直线 如果没有侧键到返回lines=nonetype
        '''
        霍夫直线(极坐标空间):边缘检测图片edges,半径步长1,角度增量np.pi/180,边缘提取的低值200.最先直线的长度100px,直线中途允许有50px非直线
        '''
        lines = cv.HoughLinesP(edges, 1, np.pi/180, 100,minLineLength=100,maxLineGap=50)
        for line in lines:
            x1,y1,x2,y2=line[0]
            #在原图绘制直线(x1,y1)--->(x2,y2) 颜色:红色 像素:2px
            cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
        cv.imshow('linep',image)
    
    src = cv.imread("wangge.png")
    cv.imshow("原来", src)
    line_image(src)
    linep_image(src)
    cv.waitKey(0)
    cv.destroyAllWindows()

    效果展示

    相同代码进行倾斜直线检测

     

  • 相关阅读:
    什么是长尾关键词?【摘】
    Visual Studio 2010已经发布,简单列举一下新特性,重点学习一下
    增加反向链接的35个技巧【摘】
    鼠标移动上变为手的样式的css,cursor: pointer或者CURSOR: hand
    百度空间地址栏的logo咋成了迅雷的logo了,被攻击后遗症?
    百度优化技巧和方法【摘】
    asp入门之分页
    asp入门之操作数据库
    asp入门之简单介绍
    asp入门之在线编辑器(QQMail HtmlEditor 菜刀版 1.2版)改进版
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/10700898.html
Copyright © 2020-2023  润新知