如何使用OpenCV自动校正文本图像

重磅干货,第一时间送达

今天,我们想与您分享解决图像偏移校正问题(拉直旋转图像)的简单解决方案。如果我们正在从歪斜图像中提取文本的内容,则必须以一种或另一种形式处理图像。从摄像机图片到扫描的文档-将清理后的图像馈送到OCR工具之前,去歪斜是图像预处理中的必要步骤。

去歪斜算法

让我们开始讨论Deskeweing算法的一般概念。我们的主要目标是将旋转的图像分成文本块,并确定它们的角度。为了让您详细了解我将使用的方法:

1. 照常-将图像转换为灰度。

2. 应用轻微的模糊以减少图像中的噪点。

3. 现在,我们的目标是找到带有文本的区域,即图像的文本块。为了使文本块检测更容易,我们将反转并最大化图像的颜色,这将通过阈值化来实现。因此,现在文本变为白色(恰好为255,255,255白色),而背景为黑色(同样为0,0,0黑色)。

4. 要查找文本块,我们需要合并该块的所有打印字符。我们通过膨胀(扩展白色像素)来实现。在X轴上使用较大的内核可以消除单词之间的所有空间,而在Y轴上使用较小的内核可以将彼此之间的一个块的行混合在一起,但保持文本块之间的较大间隔不变。

5. 现在,用最小面积矩形包围轮廓的简单轮廓检测将形成我们需要的所有文本块。

6. 确定倾斜角度的方法有很多种,但我们将坚持简单的方法-使用最大的文本块并使用其角度。

现在切换到python代码:

# Calculate skew angle of an imagedef getSkewAngle(cvImage) -> float: #Prep image, copy, convert to gray scale, blur, and threshold newImage = cvImage.copy() gray = cv2.cvtColor(newImage, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (9, 9), 0) thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV +cv2.THRESH_OTSU)[1] #Apply dilate to merge text into meaningful lines/paragraphs. #Use larger kernel on X axis to merge characters into single line, cancellingout any spaces. #But use smaller kernel on Y axis to separate between different blocks of text kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 5)) dilate = cv2.dilate(thresh, kernel, iterations=5) #Find all contours contours, hierarchy = cv2.findContours(dilate, cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) contours = sorted(contours, key = cv2.contourArea, reverse = True) #Find largest contour and surround in min area box largestContour = contours[0] minAreaRect= cv2.minAreaRect(largestContour) #Determine the angle. Convert it to the value that was originally used to obtainskewed image angle = minAreaRect[-1] if angle < -45: angle = 90 + angle return -1.0 * angle

获得偏斜角后,我们只需要重新旋转图像即可:

# Rotate the image around its centerdef rotateImage(cvImage, angle: float): newImage = cvImage.copy() (h, w) = newImage.shape[:2] center = (w // 2, h // 2) M= cv2.getRotationMatrix2D(center, angle, 1.0) newImage = cv2.warpAffine(newImage, M, (w, h), flags=cv2.INTER_CUBIC,borderMode=cv2.BORDER_REPLICATE) return newImage # Deskew imagedef deskew(cvImage): angle = getSkewAngle(cvImage) return rotateImage(cvImage, -1.0 * angle)
可视化步骤

可视化步骤

关于角度计算的注释

其他案例可能需要更多的计算,而不仅仅是采取最大的方法,并且可以开始尝试一些其他策略。

1-   可以使用所有文本块的平均角度:

allContourAngles = [cv2.minAreaRect(c)[-1]for c in contours]angle = sum(allContourAngles) /len(allContourAngles)

2-   可以采用中间块的角度:

middleContour = contours[len(contours) //2]angle = cv2.minAreaRect(middleContour)[-1]

3-   可以尝试最大,最小和中间块的平均角度。

largestContour = contours[0]middleContour = contours[len(contours) //2]smallestContour = contours[-1]angle =sum([cv2.minAreaRect(largestContour)[-1], cv2.minAreaRect(middleContour)[-1],cv2.minAreaRect(smallestContour)[-1]]) / 3

那只是我们可以立即想到的一些替代方式。继续尝试,找出最适合您的情况的方法!

测验

为了测试这种方法,我使用了一个新生成的带有Lorem Ipsum文本的PDF文件。本文档的首页以300 DPI分辨率(使用PDF文档时最常用的设置)呈现。之后,通过拍摄原始图像并在-10度到+10度范围内随机旋转来生成20个样本图像的测试数据集。然后,我将图像及其倾斜角度保存在一起。您可以在我的GitHub存储库中找到用于生成这些示例图像的所有代码,这里不再赘述。

测试结果的统计样本:

Item #0,with angle=1.77, calculated=1.77, difference=0.0%Item #1,with angle=-1.2, calculated=-1.19, difference=0.83%Item #2,with angle=8.92, calculated=8.92, difference=0.0%Item #3,with angle=8.68, calculated=8.68, difference=0.0%Item #4,with angle=4.83, calculated=4.82, difference=0.21%Item #5,with angle=4.41, calculated=4.4, difference=0.23%Item #6,with angle=-5.93, calculated=-5.91, difference=0.34%Item #7,with angle=-3.32, calculated=-3.33, difference=0.3%Item #8,with angle=6.53, calculated=6.54, difference=0.15%Item #9,with angle=-2.66, calculated=-2.65, difference=0.38%Item #10,with angle=-2.2, calculated=-2.19, difference=0.45%Item #11,with angle=-1.42, calculated=-1.4, difference=1.41%Item #12,with angle=-6.77, calculated=-6.77, difference=0.0%Item #13,with angle=-9.26, calculated=-9.25, difference=0.11%Item #14,with angle=4.36, calculated=4.35, difference=0.23%Item #15,with angle=5.49, calculated=5.48, difference=0.18%Item #16,with angle=-4.54, calculated=-4.55, difference=0.22%Item #17,with angle=-2.54, calculated=-2.54, difference=0.0%Item #18,with angle=4.65, calculated=4.66, difference=0.22%Item #19,with angle=-4.33, calculated=-4.32, difference=0.23%MinError: 0.0%MaxError: 1.41%Avg Error: 0.27%

这种方法效果很好,与真实的歪斜角度仅产生很小的偏差。对于人眼和OCR引擎而言,此类错误已不再明显。

(0)

相关推荐

  • 【OpenCV读取标记点坐标】管道测速

    文章目录 一.项目简介 二.思考步骤 1. 图像二值化 2. 滤波去噪 3. Canny算法检测边缘 4. 查找轮廓并计算 5. 绘制轮廓并表示质心 三.测试结果 四.工程代码 一.项目简介 昨天一个 ...

  • OpenCV探索之路(十一):轮廓查找和多边形包围轮廓

    Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...

  • OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

  • OpenCV探索之路(十六):图像矫正技术深入探讨

    刚进入实验室导师就交给我一个任务,就是让我设计算法给图像进行矫正.哎呀,我不太会图像这块啊,不过还是接下来了,硬着头皮开干吧! 那什么是图像的矫正呢?举个例子就好明白了. 我的好朋友小明给我拍了这几张 ...

  • opencv笔记(二十九)——提取轮廓相关函数使用方法

    opencv中常用的跟轮廓相关的操作有:findContours()查找轮廓:drawContours()画轮廓:轮廓填充:计算轮廓的面积和周长:提取轮廓凸包,矩形,最小外接矩形,外接圆等.它们都有相 ...

  • 图像特征之傅里叶描述子

    使用C++.opencv获取轮廓的傅里叶描述子 傅里叶描述子是一种图像特征,具体来说,是一个用来描述轮廓的特征参数.其基本思想是用物体边界信息的傅里叶变换作为形状特征,将轮廓特征从空间域变换到频域内, ...

  • 基于OpenCV实战:绘制图像轮廓(附代码)

    重磅干货,第一时间送达 山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高程图.这些线条可以手动绘制,也可以由计算机生成.在本文中,我们将看到如何使用OpenCV在简单图像上绘制轮廓线 ...

  • 自动驾驶中图像与点云融合的深度学习研究进展综述

    文章:Deep Learning for Image and Point Cloud Fusion in Autonomous Driving: A Review 作者:Yaodong Cui, IE ...

  • 通过串口 OpenCv 的智能车图像还原

    做过智能车摄像头的都知道,我们在做车的过程中如果光是看那些单片机传回来的01字符串的图像数据的话,那可是一件相关无聊的事情.不仅如此,看这样的数据还很废眼睛的.这样的话看没过多眼睛就开始累了,就开始不 ...

  • 基于OpenCV的表格文本内容提取

    重磅干货,第一时间送达 小伙伴们可能会觉得从图像中提取文本是一件很麻烦的事情,尤其是需要提取大量文本时.PyTesseract是一种光学字符识别(OCR),该库提了供文本图像. PyTesseract ...

  • 使用OpenCV自动去除背景色

    重磅干货,第一时间送达 几天前,我遇到了一个项目,要求将草图放到某个文件夹中时删除草图的白色背景.这都是在硬件扫描仪中发生的. 下面是一个草图示例: 第一步是安装此项目的依赖关系,具体需要内容我们将在 ...

  • 【从零学习OpenCV 4】分割图像——Mean-Shift分割算法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——Grabcut图像分割

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】分割图像——分水岭法

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 【从零学习OpenCV 4】创建图像窗口滑动条

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...