使用 Python 和 OpenCV 改善图像歪斜校正

2024-04-25

我生成的用于检测和纠正偏差的代码给了我不一致的结果。我目前正在开展一个项目,该项目利用图像上的 OCR 文本提取(通过 Python 和 OpenCV),因此如果需要准确的结果,消除倾斜是关键。我的代码使用cv2.minAreaRect来检测倾斜。

我使用的图像都是相同的(并且将来也会如此),所以我不确定是什么导致了这些不一致。我包含了两组前后图像(包括来自cv2.minAreaRect)在我应用我的代码的地方,一个显示成功消除倾斜并显示倾斜未消除(看起来它增加了更多倾斜)。

Image 1 Before (-87.88721466064453) Image 1 Before

Image 1 After (successful deskew) Image 1 After

Image 2 Before (-5.766754150390625) Image 2 Before

Image 2 After (unsuccessful deskew) Image 2 After

我的代码如下。注意:我处理过的图像比此处包含的图像多得多。到目前为止,检测到的偏差始终在 [-10, 0) 或 (-90, -80] 范围内,因此我尝试在代码中解释这一点。

    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_gray = cv2.bitwise_not(img_gray)
    
    thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    coords = np.column_stack(np.where(thresh > 0))
    angle = cv2.minAreaRect(coords)[-1] 
      
    if (angle < 0 and angle >= -10):
        angle = -angle #this was intended to undo skew for values in [-10, 0) by simply rotating using the opposite sign
    else:
        angle = (90 + angle)/2  
     
    (h, w) = img.shape[:2]
    center = (w // 2, h // 2)
    
    M = cv2.getRotationMatrix2D(center, angle, 1.0)
    deskewed = cv2.warpAffine(img, M, (w, h), flags = cv2.INTER_CUBIC, borderMode = cv2.BORDER_REPLICATE)

我浏览了各种帖子和文章以找到适当的解决方案,但没有成功。这个帖子 https://stackoverflow.com/a/53852582对于理解偏斜值最有帮助,但即便如此我也无法走得太远。


Python Wand 是一个非常好的文本纠偏工具,它使用 ImageMagick。它基于氡变换。

Form 1:

Form 2:

from wand.image import Image
from wand.display import display


with Image(filename='form1.png') as img:
    img.deskew(0.4*img.quantum_range)
    img.save(filename='form1_deskew.png')
    display(img)

with Image(filename='form2.png') as img:
    img.deskew(0.4*img.quantum_range)
    img.save(filename='form2_deskew.png')
    display(img)

表 1 已校正:

表 2 已校正:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 和 OpenCV 改善图像歪斜校正 的相关文章

  • 如何解决 Python 'Pyzbar' 库的导入错误?

    我刚刚开始熟悉 Pyzbar 库 但是当使用decode方法我得到一个错误 这是代码 import cv2 import numpy as np import pyzbar code image cv2 imread C Users Ace
  • 使用SchemDraw库自动保存图像

    我想在Python中使用这个库来生成电气图 https cdelker bitbucket io SchemDraw https cdelker bitbucket io SchemDraw 我想在服务器中运行这段代码 这个想法是生成图像
  • 当你不需要Python中的索引时,如何创建For循环? [复制]

    这个问题在这里已经有答案了 如果我需要一个forPython 中的循环 for i in range 1 42 print spam 但不要使用i对于任何事情 pylint 都会抱怨未使用的变量 我应该如何处理这个问题 我知道你可以这样做
  • Python,将CSV文件转换为SQL表

    我有一个没有标题的 CSV 文件 并尝试从文件中的某些列创建 SQL 表 我尝试了这里给出的解决方案 使用 Python 将 CSV 文件导入 sqlite3 数据库表 https stackoverflow com questions 2
  • python 线程是如何工作的?

    我想知道 python 线程是并发运行还是并行运行 例如 如果我有两个任务并在两个线程中运行它们 它们是同时运行还是计划同时运行 我知道GIL并且线程仅使用一个 CPU 核心 这是一个复杂的问题 需要大量解释 我将坚持使用 CPython
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • pyqt5调用url时处于无响应状态

    我刚刚在 pyqt 中实现了登录 但在调用 url 和获取响应之间 qt 窗口显示无响应状态 谁能建议我如何避免不响应状态 code class Login QDialog def init self height width parent
  • Python 中意外的缩进错误[重复]

    这个问题在这里已经有答案了 我有一段简单的代码 我不明白我的错误来自哪里 解析器在第 5 行 if 语句 上用意外的缩进向我咆哮 有人看到这里的问题吗 我不 def gen fibs a b 0 1 while True a b b a b
  • Python 有哪些重要的语言特性(习语)需要尽早学习[重复]

    这个问题在这里已经有答案了 我有兴趣了解 StackOverflow 社区认为 Python 的重要语言特性 习语 是什么 将程序员定义为 Pythonic 的特征 Python pythonic 习语 Python 语言自然的或特有的 代
  • tf.keras.utils.image_dataset_from_directory,但标签来自 csv?

    请告诉我哪里出错了 我正在研究 Kaggle 狗品种分类挑战 我想尝试 one hot 编码与标签编码 图像未在图像目录中拆分 因此我无法将 推断 与 tf keras utils image dataset from directory
  • 使用 python 在网络上部署 matlab 应用程序

    您好 我想使用 python 在网络上部署 matlab 应用程序 有没有办法做到这一点 我已按照数学工作网站上的文档将我的应用程序转换为 jar 文件 java 类 有人能指出我前进的正确方向吗 事实上 您的 Matlab 代码打包为 J
  • 使用光栅重新投影 .tiff 文件:CRSError:无法解析 WKT。 OGR 错误代码 6

    我正在尝试使用以下代码将 tiff 文件重新投影到 EPSG 32638 我安装过的版本 光栅版本 1 1 5 Numpy 版本 1 18 1 这是我正在使用的代码 https rasterio readthedocs io en late
  • 单击按钮时执行 python 脚本

    我有一个带有一个按钮的 HTML 页面 当我们单击该按钮时 我需要执行一个 python 脚本 并返回到包含结果的同一 HTML 页面 所以我需要对返回值进行一些验证并执行一些操作 这是我的代码 HTML
  • 为 Mercurial 执行 hgweb.cgi 时,指定的 CGI 应用程序行为不当...

    我有 IIS 6 我将 Mercurial 安装在 c program files mercurial 中 我在 c program files python 中安装了 Python 2 6 I added extension handli
  • Pymacs 助手在 30 秒后未启动

    我见过其他关于此的问题 但没有一个得到真正的回答 而且没有一个是我的问题 我有一个新系统 emacs 23 1 Centos 6 2 我认为 我下载了最新的 pymacs 并安装了它 但是 我得到 error Pymacs helper d
  • 您忽略了哪些 PEP 8 准则,哪些是您坚持的? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 多年来 我编写的 Python 越多 我就越发现自己同意大多数准则 尽管我出于自己的原因始终有意地违反了一些准则 我很想知道 PEP 8 也可能
  • Pytest - 如何将参数传递给 setup_class?

    我有一些代码 如下所示 我得到了too few args当我运行它时出错 我没有打电话setup class明确地 所以不确定如何向它传递任何参数 我尝试用以下方法装饰该方法 classmethod 但仍然看到相同的错误 我看到的错误是这样
  • hashlib 和 urandom 哪个更随机?

    我正在和一个朋友一起开发一个项目 我们需要生成随机哈希 在我们有时间讨论之前 我们都提出了不同的方法 并且因为他们使用不同的模块 我想问你们大家什么会更好 如果有这样的事情的话 hashlib sha1 str random random
  • Python:使用 FOR 循环插入字典

    我已经在论坛中进行了搜索 但不明白是否可以使用以下构造将新条目插入到我的 Python 字典中 而不将其转换为列表 for x in range 3 pupils dictionary new key input Enter new key
  • Python-打印字符串一定次数[重复]

    这个问题在这里已经有答案了 可能的重复 Python 多次打印 https stackoverflow com questions 6293421 python printing multiple times 我想知道如何打印 String

随机推荐

  • 使用自己的路径在不同的 python 可执行文件下生成 multiprocessing.Process

    我有两个版本的Python 实际上是两个conda环境 path to bin 1 python path to bin 2 python 我想从一个版本的 python 启动一个在另一个版本中运行的函数 使用类似multiprocessi
  • 敲除验证

    我有一个 asp net mvc3 项目 我在其中使用淘汰赛绑定对表进行批量编辑 我想在保存数据时进行必需验证和数字验证等验证 有没有更简单的方法来进行淘汰验证 PS 我没有使用表格 看一下敲除验证 https github com eri
  • 井字游戏的极小极大

    我正在尝试用简单的极小极大算法来解决井字游戏 简单 但应该涵盖很多语言 到目前为止我所拥有的 该板表示为 9 个 未绑定 变量的数组 这些变量可以设置为x or o 获胜条件基本上是 win Player X1 X2 X3 X1 Playe
  • 如何在 IAR EWARM 5.4 中抑制警告(从错误转换)

    我有一个用于日志记录的宏 它接受可变数量的参数 该宏将由 GCC 在非嵌入式上下文中处理 并扩展为有效的 C 代码 尽管如此 无论我在何处调用宏 数千个位置 IAR EWARM 都会给出错误 Pe054 宏调用中的参数太少 EWARM 确实
  • AngularJS 阻止 symfony2 表单中的提交按钮

    我在 symfony2 中创建了表单 最后呈现了提交表单的按钮 当我添加ng app myApp 一切正常 但我无法提交此页面上的表单 为什么会这样以及如何解锁 FORM gt add company choice array mapped
  • NSAssert 与断言:您使用哪个以及何时使用?

    最近 我读到了两条非常有趣的建议 在评论中这个 StackOverflow 答案 https stackoverflow com questions 1375786 whats the point of nsassert actually
  • 如何将多个身份验证提供商链接到 Firebase 帐户?

    我无法成功执行此操作 我按照 Firebase 文档上的说明执行了以下步骤 使用现有的身份验证提供程序登录使用 我的案例 脸书 完成新身份验证提供程序的登录流程 直至 但不包括 调用其中之一Auth signInWith方法 我的情况 我想
  • Oauth2 Google 身份验证流程 - Next.JS / Express

    我正在使用 React Next Js 前端 并尝试通过 Google 的 Oauth2 策略实现身份验证 我对这个过程感到非常困惑 目前在客户端上 我有一个 Google 登录组件 其中包含客户端 ID 并且可以检索访问令牌
  • 如何将查询结果放入文本字​​段?

    我正在创建一个会计数据库 对于财务结果 我的表 单有一个文本字段 Previous Solde 其中显示了前几个月的销售情况 确切的金额是通过以下查询计算出来的 SELECT sq Argenta Prep Vorig Saldo Acco
  • 为什么导入在 setuptools Entry_point 脚本中失败,但在 python 解释器中却失败?

    我有以下项目结构 project project py init py setup py lib init py project init py tools py with project py from project lib impor
  • 从 Java 访问 Firefox 的证书信任存储

    我对这个几乎失去希望了 我正在尝试使用 Firefox 安装附带的 NSS 库通过 PKCS 11 从 Java 7 访问 Firefox 信任存储 这是代码 import java security KeyStore import jav
  • Spring 测试 DBunit 警告

    我正在使用 spring test dbunit 并且在单元测试中收到一条警告 其中包含以下消息 Code RunWith SpringJUnit4ClassRunner class ContextConfiguration locatio
  • jQuery 中的“this”是什么意思? [复制]

    这个问题在这里已经有答案了 在 jquery 中 什么是this手段以及何时使用 this在 JavaScript 中是非常特殊和强大的 它几乎可以意味着任何事情 我涵盖了其中一些here http blog niftysnippets o
  • 如何使用 nimbus-jose-jwt 解码 JWT 令牌以获取标头和有效负载的详细信息?

    我有以下内容JWT 令牌我想解码 eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsing1dCI6Ik5UQXhabU14TkRNeVpEZzNNVFUxWkdNME16RXpPREpoWldJNE5ETmxaRFU
  • Swift 4 Codable Realm 对象子类

    尝试将我的一些代码库切换到 Swift 4 的新版本Codable协议 我的设置看起来像这样 class Base Object Codable dynamic var id String dynamic var timestamp Str
  • VisualVM中的时间和时间(CPU)有什么区别

    我使用 VisualVM 来查找某个特定调用的所有时间都花在了哪里 我发现大部分时间都在数据库调用中 但是分析器显示85 的时间是java lang Object 只有15 的时间在数据库调用中 我读错了什么吗 The columns wi
  • 为什么使用非文字模式时无法访问此匹配模式?

    以下代码 let max column 7 edge match current column 0 gt Edge Left max column gt Edge Right gt Edge NotAnEdge 结果出现以下警告 warni
  • 使用 jQuery 按类名获取另一个元素中的元素

    如何通过 id 获取元素 然后在该元素内使用 jQuery 按类名获取所有元素 使用标准 JS 函数 getElementById 和 getElementsByClassName 可以很容易地做到这一点 但不幸的是 IE 7 8 不支持后
  • SetForegroundWindow 不适用于最小化进程[重复]

    这个问题在这里已经有答案了 找不到关于这个主题的任何好的答案 所以也许有人可以帮助我 我正在制作一个小型个人程序 我想将某个应用程序带到前台 它已经可以工作了 但是有一个小问题 当进程最小化时 我的代码将无法工作 该进程不会像未最小化时那样
  • 使用 Python 和 OpenCV 改善图像歪斜校正

    我生成的用于检测和纠正偏差的代码给了我不一致的结果 我目前正在开展一个项目 该项目利用图像上的 OCR 文本提取 通过 Python 和 OpenCV 因此如果需要准确的结果 消除倾斜是关键 我的代码使用cv2 minAreaRect来检测