使用Python+OpenCV2进行图片中的文字分割(支持竖版)

把图片中的文字,识别出来,并将每个字的图片抠出来;

import cv2
import numpy as npHIOG = 50
VIOG = 3
Position = []'''水平投影'''
def getHProjection(image):hProjection = np.zeros(image.shape,np.uint8)# 获取图像大小(h,w)=image.shape# 统计像素个数h_ = [0]*hfor y in range(h):for x in range(w):if image[y,x] == 255:h_[y]+=1#绘制水平投影图像for y in range(h):for x in range(h_[y]):hProjection[y,x] = 255# cv2.imshow('hProjection2',cv2.resize(hProjection, None, fx=0.3, fy=0.5, interpolation=cv2.INTER_AREA))# cv2.waitKey(0)return h_def getVProjection(image):vProjection = np.zeros(image.shape,np.uint8);(h,w) = image.shapew_ = [0]*wfor x in range(w):for y in range(h):if image[y,x] == 255:w_[x]+=1for x in range(w):for y in range(h-w_[x],h):vProjection[y,x] = 255# cv2.imshow('vProjection',cv2.resize(vProjection, None, fx=1, fy=0.1, interpolation=cv2.INTER_AREA))# cv2.waitKey(0)return w_def scan(vProjection, iog, pos = 0):start = 0V_start = []V_end = []for i in range(len(vProjection)):if vProjection[i] > iog and start == 0:V_start.append(i)start = 1if vProjection[i] <= iog and start == 1:if i - V_start[-1] < pos:continueV_end.append(i)start = 0return V_start, V_enddef checkSingle(image):h = getHProjection(image)start = 0end = 0for i in range(h):pass#分割
def CropImage(image,dest,boxMin,boxMax):a=boxMin[1]b=boxMax[1]c=boxMin[0]d=boxMax[0]cropImg = image[a:b,c:d]cv2.imwrite(dest,cropImg)#开始识别
def DOIT(rawPic):# 读入原始图像origineImage = cv2.imread(rawPic)# 图像灰度化   #image = cv2.imread('test.jpg',0)image = cv2.cvtColor(origineImage,cv2.COLOR_BGR2GRAY)# cv2.imshow('gray',image)# 将图片二值化retval, img = cv2.threshold(image,127,255,cv2.THRESH_BINARY_INV)# kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))# img = cv2.erode(img, kernel)# cv2.imshow('binary',cv2.resize(img, None, fx=0.3, fy=0.3, interpolation=cv2.INTER_AREA))#图像高与宽(h,w)=img.shape#垂直投影V = getVProjection(img)start = 0V_start = []V_end = []# 对垂直投影水平分割V_start, V_end = scan(V, HIOG)if len(V_start) > len(V_end):V_end.append(w-5)# 分割行,分割之后再进行列分割并保存分割位置for i in range(len(V_end)):#获取行图像if V_end[i] - V_start[i] < 30:continuecropImg = img[0:h, V_start[i]:V_end[i]]# cv2.imshow('cropImg',cropImg)# cv2.waitKey(0)#对行图像进行垂直投影H = getHProjection(cropImg)H_start, H_end = scan(H, VIOG, 40)if len(H_start) > len(H_end):H_end.append(h-5)for pos in range(len(H_start)):# 再进行一次列扫描DcropImg = cropImg[H_start[pos]:H_end[pos], 0:w]d_h, d_w = DcropImg.shape# cv2.imshow("dcrop", DcropImg)sec_V = getVProjection(DcropImg)c1, c2 = scan(sec_V, 0)if len(c1) > len(c2):c2.append(d_w)x = 1while x < len(c1):if c1[x] - c2[x-1] < 12:c2.pop(x-1)c1.pop(x)x -= 1x += 1# cv2.waitKey(0)if len(c1) == 1:Position.append([V_start[i],H_start[pos],V_end[i],H_end[pos]])else:for x in range(len(c1)):Position.append([V_start[i]+c1[x], H_start[pos],V_start[i]+c2[x], H_end[pos]])#根据确定的位置分割字符number=0for m in range(len(Position)):rectMin =  (Position[m][0]-5,Position[m][1]-5)rectMax =  (Position[m][2]+5,Position[m][3]+5)cv2.rectangle(origineImage,rectMin, rectMax, (0 ,0 ,255), 2)number=number+1#start-cropCropImage(origineImage,'result/' + '%d.jpg' % number,rectMin,rectMax)# cv2.imshow('image',cv2.resize(origineImage, None, fx=0.6, fy=0.6, interpolation=cv2.INTER_AREA))cv2.imshow('image',origineImage)cv2.imwrite('result/' + 'ResultImage.jpg' , origineImage)cv2.waitKey(0)#############################
rawPicPath = r"H:\TEMP\TEXT_PROCCESS\TEST05.jpg"
DOIT(rawPicPath)
#############################

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/679785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Structured Streaming

目录 一、概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;两种处理模型 &#xff08;三&#xff09;Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 &#xff08;一&#xff09;实现步骤 &…

PaddleDetection学习5——使用Paddle-Lite在 Android 上实现实时的人脸检测(C++)

使用Paddle-Lite在 Android 上实现实时的人脸检测 1 环境准备2. 部署步骤2.1 下载Paddle-Lite-Demo2.2 运行face_detection_demo项目3 使用Opencv对后处理进行优化4 开启手机摄像头进行人脸检测1 环境准备 参考前一篇在 Android 上使用Paddle-Lite实现实时的目标检测功能 2. …

【GAMES101】Lecture 22 物理模拟与仿真

目录 单粒子模拟 显式欧拉方法 改进 中点法/修正的欧拉方法 自适应步长 隐式欧拉方法 非物理改变位置&#xff08;Position-Based / Verlet Integration&#xff09; 刚体模拟 流体模拟 单粒子模拟 先来研究粒子的运动&#xff0c;假设有一个速度矢量场&#xff0c;对…

Java:字符集、IO流 --黑马笔记

一、字符集 1.1 字符集的来历 我们知道计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一个字符进行了编码&#xff08;所谓编码&#xff0c;就是为一个…

(已解决)将overleaf上的文章paper上传到arxiv上遇到的问题。

文章目录 前言初级问题后续问题 前言 首先说一点&#xff0c;将paper的pdf文件直接上传arxiv是不行的&#xff0c;arxiv要求我们要上传源文件&#xff0c;所以才这么麻烦。 初级问题 首先上传文件之后有可能会在下面这个界面出现问题&#xff0c;这里一般都比较常见的问题&a…

Latex排版遇到的常见问题及解决方法

这里写目录标题 1. 图片/ PDF 裁剪1.1 PPT 画图转PDF1.2 PPT裁剪 2. 表格内的文本换行问题2.1 表格跨行显示2.2 表格内文本换行&#xff0c;使用 ‘makecell’ 包 换行2.2 表格内文本添加 圆点 1. 图片/ PDF 裁剪 1.1 PPT 画图转PDF 1.2 PPT裁剪 将输出的PDF文件裁剪成合适尺…

最新酒桌小游戏喝酒小程序源码,带流量主,附带搭建教程

喝酒神器&#xff0c;增加了广告位&#xff0c;根据文档直接替换即可&#xff0c;原版本没有广告位 直接上传源码到开发者端即可 通过后改广告代码&#xff0c;然后关闭广告展示提交&#xff0c;通过后打开即可 搜索adunit-848e5f13d1ff237a替换为你的Banner 搜索adunit-597…

【Spring学习】Spring Data Redis:RedisTemplate、Repository、Cache注解

1&#xff0c;spring-data-redis官网 1&#xff09;特点 提供了对不同Redis客户端的整合&#xff08;Lettuce和Jedis&#xff09;提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符…

MySQL之Windows下MySQL5.7x.与MySQL8.0.x版本共存安装

MySQL之Windows下多版本共存安装 文章目录 MySQL之Windows下多版本共存安装1. my.ini配置如下&#xff1a;2. 安装3. 修改注册表4. 登录5. 修改root用户密码 场景&#xff1a;老项目跑的MySQL5.7.x&#xff0c;而新项目中用到了MySQL8.0.x,为了开发或测试方便在同一台主机上同时…

2013-2022年上市公司迪博内部控制指数、内部控制分项指数数据

2013-2022年上市公司迪博内部控制指数、分项指数数据 1、时间&#xff1a;2013-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、战略层级指数、经营层级指数、报告可靠指数、合法合规指数、资产安全…

学习记录691@spring面试之bean的作用域

Spring为Bean定义了5种作用域&#xff0c;分别为Singleton&#xff08;单例&#xff09;、Prototype&#xff08;原型&#xff09;、Request&#xff08;请求级别&#xff09;、Session&#xff08;会话级别&#xff09;和Global Session&#xff08;全局会话&#xff09;。 S…

three.js 细一万倍教程 从入门到精通(二)

目录 三、全面认识three.js物体 3.1、掌握几何体顶点_UV_法向属性 3.2、BufferGeometry设置顶点创建矩形 3.3、生成酷炫三角形科技物体 四、详解材质与纹理 4.1、初识材质与纹理 4.2、详解纹理偏移_旋转_重复 偏移 旋转 重复 4.3、设置纹理显示算法与mipmap mapFil…

《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P9 访问 Steam&#xff08;Acessing Steam&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

Python语言例题集(003)

#!/usr/bin/python3 #猜数字 import random secretNumberrandom.randint(1,20) print(‘我想了一个1到20间的整数&#xff0c;你能猜出来吗&#xff1f;’) for guessesTaken in range(1,7): print(‘猜一下&#xff01;’) guessint(input()) if guess<secretNumber: pr…

《Linux 简易速速上手小册》第10章: 性能监控与优化(2024 最新版)

文章目录 10.1 理解系统负载10.1.1 重点基础知识10.1.2 重点案例&#xff1a;服务器响应变慢10.1.3 拓展案例 1&#xff1a;多核 CPU 系统的负载解读10.1.4 拓展案例 2&#xff1a;分析具体时间段的系统负载 10.2 优化性能10.2.1 重点基础知识10.2.2 重点案例&#xff1a;优化 …

没更新的日子也在努力呀,布局2024!

文章目录 ⭐ 没更新的日子也在努力呀⭐ 近期的一个状态 - 已圆满⭐ 又到了2024的许愿时间了⭐ 开发者要如何去 "创富" ⭐ 没更新的日子也在努力呀 感觉很久没有更新视频了&#xff0c;好吧&#xff0c;其实真的很久没有更新短视频了。最近的一两个月真的太忙了&#…

LLM大模型相关问题汇总

一、基础篇 1. 目前 主流的开源模型体系 有哪些&#xff1f; 2. prefix LM 和 causal LM 区别是什么&#xff1f; 3. 涌现能力是啥原因&#xff1f; 4. 大模型LLM的架构介绍&#xff1f; 5. 你比较关注那些主流的开源大模型&#xff1f; 6. 目前大模型模型结构都有那些&a…

CSP-202312-2-因子化简(质数筛法)

CSP-202312-2-因子化简 一、质数筛法 主流的质数筛法包括埃拉托斯特尼筛法&#xff08;Sieve of Eratosthenes&#xff09;、欧拉筛法&#xff08;Sieve of Euler&#xff09;、线性筛法&#xff08;Linear Sieve&#xff09;等。这些算法都用于高效地生成一定范围内的质数。 …

设计模式-观察者模式 Observer

观察者模式 一、概述二、使用场景三、发布订阅1) 观察者模式2) 发布-订阅模式 四、源码使用1) jdk中的观察者2) Guava中的消息总线 五、进阶1) 异步非阻塞模型 一、概述 观察者模式是一种行为设计模式&#xff0c;允许对象间存在一对多的依赖关系&#xff0c;当一个对象的状态…

二叉搜索树题目:二叉搜索树的最小绝对差

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树的最小绝对差 出处&#xff1a;530. 二叉搜索树的最小绝对差 难度 3 级 题目描述 要求 给定一个二叉…