ocr 图像倾斜矫正-霍夫变换

图像预处理

在ocr处理时候,可能遇到的图片会是倾斜的,导致检测不全问题,进而影响后续识别问题。

常见的倾斜矫正方法

  • 霍夫轮廓检测
  • randon 变换
  • 基于PCA的方法

霍夫变换

  • 基本原理
    可以识别图像中的几何形状。它将图像空间中的特征点映射到参数空间进行投票,通过检测累计结果的局部极值点得到一个符合某特定形状的点的集合。经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。它的抗噪声、抗形变能力较强。另一种直线提取的方法是对图像边缘点进行链码追踪,在得到的链码串中提取直线。

霍夫变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。
摘自维基百科
ocr 图像倾斜矫正-霍夫变换_第1张图片

简单的霍夫直线变换:

  • 在笛卡尔坐标系对直线表达式做变换,变成霍夫空间,变换后的空间成为霍夫空间。
  • 即:笛卡尔坐标系中一条直线,对应霍夫空间的一个点。
  • 反过来同样成立(霍夫空间的一条直线,对应笛卡尔坐标系的一个点)
  • 如果笛卡尔坐标系的点共线,这些点在霍夫空间对应的直线交于一点,这也是必然,共线只有一种取值可能。

具体原理介绍可以参考后续的参考链接

使用霍夫变换实现倾斜图片的校准,原理是从图像中检测到对应的直线,然后基于直线之间的角度,来判断图像的倾斜角度,进而进行旋转;

用霍夫线变换探测出图像中的所有直线
计算出每条直线的倾斜角,求他们的平均值
根据倾斜角旋转矫正
最后根据文本尺寸裁剪图片

  • 实现
import os
import cv2
import sys
import math
import random
import imageio
import numpy as np
from scipy import misc, ndimage
import matplotlib.pyplot as plt


img_path = sys.argv[1]
 
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
 
# 霍夫变换
lines = cv2.HoughLines(edges, 1, np.pi / 180, 0)
rotate_angle = 0
for rho, theta in lines[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))
    if x1 == x2 or y1 == y2:
        continue
    t = float(y2 - y1) / (x2 - x1)
    rotate_angle = math.degrees(math.atan(t))
    if rotate_angle > 45:
        rotate_angle = -90 + rotate_angle
    elif rotate_angle < -45:
        rotate_angle = 90 + rotate_angle
print("rotate_angle : "+str(rotate_angle))
rotate_img = ndimage.rotate(img, rotate_angle)
imageio.imsave('ssss.png',rotate_img)
cv2.imshow("img", rotate_img)
cv2.waitKey(0)

结果

在这里插入图片描述

在这里插入图片描述

参考

  • https://zhuanlan.zhihu.com/p/47649796
  • https://zhuanlan.zhihu.com/p/203292567
  • https://zh.wikipedia.org/wiki/%E9%9C%8D%E5%A4%AB%E5%8F%98%E6%8D%A2
  • https://www.cnblogs.com/skyfsm/p/6902524.html

你可能感兴趣的:(OCR,opencv,霍夫变换,倾斜)