• opencv 霍夫变换 实现图片旋转角度计算


    在OCR实际开发中,证件照采集角度有很大的偏差,需要将图片进行旋转校正,

    效果图:

    在应用中发现应该加入高斯模糊,可以极大减少误差线条.

     知道线条后 通过求斜率 得旋转角度 .(x1-x2)/(y1-y2) 

    结果

    结果还行吧 ! 当然还有直方图也可以判断,有待研究!

    霍夫变换

    Hough变换是经典的检测直线的算法。其最初用来检测图像中的直线,同时也可以将其扩展,以用来检测图像中简单的结构。

    OpenCV提供了两种用于直线检测的Hough变换形式。其中基本的版本是cv2.HoughLines。其输入一幅含有点集的二值图(由非0像素表示),其中一些点互相联系组成直线。通常这是通过如Canny算子获得的一幅边缘图像。cv2.HoughLines函数输出的是[float, float]形式的ndarray,其中每个值表示检测到的线(ρ , θ)中浮点点值的参数。下面的例子首先使用Canny算子获得图像边缘,然后使用Hough变换检测直线。其中HoughLines函数的参数3和4对应直线搜索的步长。在本例中,函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线。最后一个参数是经过某一点曲线的数量的阈值,超过这个阈值,就表示这个交点所代表的参数对(rho, theta)在原图像中为一条直线。具体理论可参考这篇文章

     1 #coding=utf-8
     2 import cv2
     3 import numpy as np  
     4 
     5 img = cv2.imread("/home/sunny/workspace/images/road.jpg", 0)
     6 
     7 img = cv2.GaussianBlur(img,(3,3),0)
     8 edges = cv2.Canny(img, 50, 150, apertureSize = 3)
     9 lines = cv2.HoughLines(edges,1,np.pi/180,118) #这里对最后一个参数使用了经验型的值
    10 result = img.copy()
    11 for line in lines[0]:
    12     rho = line[0] #第一个元素是距离rho
    13     theta= line[1] #第二个元素是角度theta
    14     print rho
    15     print theta
    16     if  (theta < (np.pi/4. )) or (theta > (3.*np.pi/4.0)): #垂直直线
    17                 #该直线与第一行的交点
    18         pt1 = (int(rho/np.cos(theta)),0)
    19         #该直线与最后一行的焦点
    20         pt2 = (int((rho-result.shape[0]*np.sin(theta))/np.cos(theta)),result.shape[0])
    21         #绘制一条白线
    22         cv2.line( result, pt1, pt2, (255))
    23     else: #水平直线
    24         # 该直线与第一列的交点
    25         pt1 = (0,int(rho/np.sin(theta)))
    26         #该直线与最后一列的交点
    27         pt2 = (result.shape[1], int((rho-result.shape[1]*np.cos(theta))/np.sin(theta)))
    28         #绘制一条直线
    29         cv2.line(result, pt1, pt2, (255), 1)
    30 
    31 cv2.imshow('Canny', edges )
    32 cv2.imshow('Result', result)
    33 cv2.waitKey(0)
    34 cv2.destroyAllWindows()

    概率霍夫变换

    观察前面的例子得到的结果图片,其中Hough变换看起来就像在图像中查找对齐的边界像素点集合。但这样会在一些情况下导致虚假检测,如像素偶然对齐或多条直线穿过同样的对齐像素造成的多重检测。

    要避免这样的问题,并检测图像中分段的直线(而不是贯穿整个图像的直线),就诞生了Hough变化的改进版,即概率Hough变换(Probabilistic Hough)。在OpenCV中用函数cv::HoughLinesP 实现。如下:

    #coding=utf-8
    import cv2
    import numpy as np  
    
    img = cv2.imread("/home/sunny/workspace/images/road.jpg")
    
    img = cv2.GaussianBlur(img,(3,3),0)
    edges = cv2.Canny(img, 50, 150, apertureSize = 3)
    lines = cv2.HoughLines(edges,1,np.pi/180,118)
    result = img.copy()
    
    #经验参数
    minLineLength = 200
    maxLineGap = 15
    lines = cv2.HoughLinesP(edges,1,np.pi/180,80,minLineLength,maxLineGap)
    for x1,y1,x2,y2 in lines[0]:
    	cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
    
    cv2.imshow('Result', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    参考:

    https://blog.csdn.net/sunny2038/article/details/9253823 

    CODE GITHUB :

  • 相关阅读:
    常用模块介绍
    正则表达式/re模块
    模块简介/模块的导入/模块的查找顺序/绝对导入和相对导入/软件开发目录规范
    迭代器/for循环本质/生成器/常用内置方法
    函数递归/二分法/列表,字典生成式/三元表达式/匿名函数/内置函数
    闭包函数/装饰器
    函数对象/函数的嵌套定义与调用/名称空间和作用域
    初识函数
    文件处理/光标移动/实时检测
    7-5字符编码和文件处理
  • 原文地址:https://www.cnblogs.com/luofeel/p/9150968.html
Copyright © 2020-2023  润新知