OCR图片矫正、表格检测及裁剪综合实践
问题描述
实际工程中,我们经常需要对图片进行预处理,比如:
1、图片是倾斜的
2、图片背景需要处理掉
3、图片的公章需要剔除
4、图片过暗,过亮
5、图片表格检测
6、图片表格版面分析
。。。。。。等等各种情况。
结果展示
本文以表格图片为例,介绍如何进行矫正、表格检测及裁剪保存图片。
原始图片

矫正之后

表格检测

裁剪之后

代码详解
图片矫正
通过多次旋转计算最佳旋转角度并应用旋转矩阵矫正图片
#coding=utf-8
import cv2
import numpy as np
def rotate_image(image, angle):(h, w) = image.shape[: 2]center = (w // 2, h // 2)M = cv2.getRotationMatrix2D(center, angle, 1.0)corrected = cv2.warpAffine(image, M, (w, h), flags = cv2.INTER_CUBIC, \borderMode = cv2.BORDER_REPLICATE)return correcteddef determine_score(arr):histogram = np.sum(arr, axis = 2, dtype = float)score = np.sum((histogram[..., 1 :] - histogram[..., : -1]) ** 2, \axis = 1, dtype = float)return scoredef correct_skew(image, delta = 0.05, limit = 10):thresh = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + \cv2.THRESH_OTSU)[1]angles = np.arange(-limit, limit + delta, delta)img_stack = np.stack([rotate_image(thresh, angle) for angle \in angles], axis = 0)scores = determine_score(img_stack)best_angle = angles[np.argmax(scores)]corrected = rotate_image(image, best_angle)return best_angle, corrected
if __name__ == "__main__":batch_folder = r'D:\temp\pics'out_folder = r'D:\temp\picsout/'for root, dirs, files in os.walk(batch_folder):for file in files:file_path = os.path.join(root, file)file_path = file_path.replace('\\', '/')img = cv2.imread(file_path, 0)angle, corrected = correct_skew(img)print(angle,file_path)cv2.imwrite(out_folder + file_path.split('/')[-1], corrected)
表格识别
通过微软的table-transformer-detection进行表格,该模型可在Hugging Face 官网下载。
图片裁剪
通过PIL里的Image的crop方法对指定的let_top,right_bottom进行裁剪。
相关代码见下:
from PIL import Image
import matplotlib.pyplot as plt
file_path = r'D:\temp\pics\efb.jpg'
image = Image.open(file_path).convert("RGB")
width, height = image.size
image.resize((int(width * 0.5), int(height * 0.5)))
from transformers import DetrFeatureExtractorfeature_extractor = DetrFeatureExtractor()
encoding = feature_extractor(image, return_tensors="pt")
encoding.keys()
from transformers import TableTransformerForObjectDetection
model = TableTransformerForObjectDetection.from_pretrained(r"D:\Modles\table-transformer-detection/")
import torchwith torch.no_grad():outputs = model(**encoding)
COLORS = [[0.000, 0.447, 0.741], [0.850, 0.325, 0.098], [0.929, 0.694, 0.125],[0.494, 0.184, 0.556], [0.466, 0.674, 0.188], [0.301, 0.745, 0.933]]def plot_results(pil_img, scores, labels, boxes):plt.figure(figsize=(16, 10))plt.imshow(pil_img)ax = plt.gca()colors = COLORS * 100for score, label, (xmin, ymin, xmax, ymax), c in zip(scores.tolist(), labels.tolist(), boxes.tolist(), colors):ax.add_patch(plt.Rectangle((xmin, ymin), xmax - xmin, ymax - ymin,fill=False, color=c, linewidth=3))text = f'{model.config.id2label[label]}: {score:0.2f}'ax.text(xmin, ymin, text, fontsize=15,bbox=dict(facecolor='yellow', alpha=0.5))plt.axis('off')plt.show()if __name__ == "__main__":width, height = image.sizeresults = feature_extractor.post_process_object_detection(outputs, threshold=0.2, target_sizes=[(height, width)])[0]plot_results(image, results['scores'], results['labels'], results['boxes'])print(results['scores'])print(results['labels'])print(results['boxes'])print(results['boxes'][0][0],type((results['boxes'][0][0])))x0=int(results['boxes'][0][0].item())-50y0=int(results['boxes'][0][1].item())-50x1=int(results['boxes'][0][2].item())+50y1=int(results['boxes'][0][3].item())+50img2 = image.crop((x0,y0,x1,y1))img2.save(r"D:\\efb.jpg")
相关文章:
OCR图片矫正、表格检测及裁剪综合实践
问题描述 实际工程中,我们经常需要对图片进行预处理,比如: 1、图片是倾斜的 2、图片背景需要处理掉 3、图片的公章需要剔除 4、图片过暗,过亮 5、图片表格检测 6、图片表格版面分析 。。。。。。等等各种情况。 结果展示…...
c++ 容器 vector
vector的意思就是向量,就是一个顺序表的意思,这个顺序表可以存任意的类型,因为其线性的内存特点,所以在stl里是经常被使用的存在。 vector vector既然要能储存任意的变量,那么就必须使用模板: 这里的T就是变量类型&a…...
零基础部署Minecraft到云服务器上教程
零基础部署Minecraft到云服务器上教程 温馨提示 温馨提示 本教程是由博主个人飞书上直接复制下来,观感较差,请下载本教程对应的pdf资源文件进行查看(在最顶端,不过恳请各位留下一个赞再走吧)。本教程不包含云服务的购…...
常见cms漏洞之dedecms
DedeCMS是织梦团队开发PHP 网站管理系统,它以简单、易用、高效为特色,组建出各种各样各具特色的网站,如地方门户、行业门户、政府及企事业站点等。 下载地址请网上自行寻找 搭建方式选择php study 首先搭建环境 #前台http://localhost/dedecm…...
深入探究Liunx服务器内存:模拟程序实际占用与缓存占用内存
文章目录 深入探究Liunx服务器内存:模拟程序实际占用与缓存占用内存实际内存占用:使用 memtester安装 memtester下载和编译安装 memtester 使用 memtester 缓存占用:使用虚拟内存构造内存消耗创建虚拟内存目录挂载虚拟内存创建大文件以消耗内…...
《Milvus Cloud向量数据库指南》——Zilliz Cloud 高可用性深度解析:赋能GenAI应用,引领非结构化数据新纪元
在人工智能与大数据技术日新月异的今天,非结构化数据的处理与分析已成为推动行业智能化转型的关键驱动力。Zilliz Cloud,作为基于开源向量数据库Milvus构建的全托管解决方案,不仅革新了非结构化数据的存储与查询方式,更以其卓越的高可用性设计,为开发人员构建高效、可靠的…...
2024/8/4 维高-STD60N驱动器(伺服)---客户反馈:电机异响
步进电机 MHS1A86-60B85B ,额定电流6A 步骤一:设置额定电流 std60n驱动器拔码全部为off(后台设置),伺服后台连上后设置h00-11按电机铭牌进行 设置下额定电流 步骤二:最好设置峰值电流一…...
驾驭RESTful海洋:在PyCharm中配置和使用REST客户端全攻略
标题:驾驭RESTful海洋:在PyCharm中配置和使用REST客户端全攻略 引言 在当今的软件开发中,REST(Representational State Transfer)API已成为前后端分离架构的核心组成部分。PyCharm,作为业界领先的集成开发…...
策略模式的一次应用
项目的需求是将一组图像按照相似度分类。 采用了模板匹配计算相似度的实现方式。 #include <opencv2/core.hpp> #include <openev2/core/utility.hpp> #include <opencv2/highqui.hpp> #include <openav2/imgproc.hpp> cv::Mat image matched; double …...
探索PyCharm的C/C++支持:一站式配置指南
探索PyCharm的C/C支持:一站式配置指南 引言 PyCharm,作为JetBrains家族中的一个强大IDE,以其对Python的卓越支持而闻名。然而,PyCharm的多语言支持同样不容小觑。本文将带领你了解如何在PyCharm中配置C/C环境,让你在…...
手机三要素接口怎么对接呢?(一)
一、什么是手机三要素? 手机三要素又叫运营商三要素,运营商实名认证,运营商实名核验,手机三要素实名验证,手机三要素实名核验,每个人的称呼都不同,但是入参和出参是一样的。 输入姓名、身份证…...
状态同步帧同步
帧同步: 有明确的逻辑帧概念,按照固定的逻辑帧间隔同步帧数据 原理 锁帧:mmo那种游戏,服务器需要收到第k帧所有客户端的指令,就算没有操作也发个空指令上去(相对来说回合制卡牌这类就简单很多࿰…...
Flink 开发语言选择 —— Java vs Scala
引言 Apache Flink 是一个用于处理无界和有界数据流的开源分布式计算框架。随着 Flink 的日益流行,越来越多的开发者开始考虑使用哪种编程语言来进行 Flink 应用程序的开发。本文将探讨在 Flink 中使用 Java 和 Scala 的优缺点,并帮助你做出更明智的选择…...
如何在 Apache Web 服务器中安装、配置和使用模块
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 ## 状态:已弃用本文涵盖的是不再受支持的 Ubuntu 版本。如果您目前正在运行 Ubuntu 12.04 服务器,我们强烈建议升…...
海信聚好看的DBDocter软件使用心得
在墨天轮大会看到这个软件,好称是内核级别的诊断工具, 工作空闲下载免费看看 结果要1.7GB还TAR. DBdoctor是一款内核级数据库性能诊断软件。可以对数据库做细粒度的扫描,帮助您一分钟内找到数据库性能问题,实现性能诊断百倍提效。针对数据库性能诊断门…...
dfs深搜
Problem - C - Codeforces 无向图,判断是否是子叶....
【React】详解 index.js 文件
文章目录 一、index.js文件的基本结构1. 引入必要的模块2. 渲染根组件3. 注册服务工作者(可选) 二、index.js文件的详细解析1. ReactDOM.render的作用2. 为什么使用React.StrictMode3. 服务工作者的注册 三、index.js文件的最佳实践1. 使用模块化引入2. …...
Android NDK/JNI面试题大全及参考答案(3万字长文)
目录 什么是NDK?它主要用来做什么? 为什么在Android开发中使用NDK? 描述一下NDK和JDK之间的关系 举出一些使用NDK开发的应用场景 什么是JNI?它如何与NDK配合使用? 如何安装和配置Android NDK? 在Android Studio中如何配置NDK路径? 描述一下NDK工具链中的主要工具…...
从根儿上学习spring一 之杂谈
相信学做Java开发的同学从开始工作时就被问及什么是spring的依赖注入,以及切面编程。今天我们简单再聊聊这两个概念。 依赖注入 这里的依赖不是动词依赖依靠的意思,而是名词。可以把这两个词翻过来读下”注入依赖“,所谓的依赖可以理解成一…...
AI智能名片小程序在促销性内容营销中的创新应用与策略分析
摘要:在数字化时代,企业营销手段日益丰富多元,促销性内容作为吸引顾客、促进消费的关键手段之一,其形式与效率不断被革新。随着人工智能(AI)技术的飞速发展,AI智能名片小程序作为一种新兴的营销…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
