使用小波分析实现文字种类自动识别

文章目录

  • 数据简介
  • 开始实验
    • 小波分解
    • 得出结果
    • 结果分析
    • 误差分析

数据简介

各找一篇中文,日文,韩文,英文,俄文较长的学术论文。将论文转化为JPG格式。拆分每张JPG生成更多小的JPG。最终获得很多5个不同语言的JPG并且自带标签。数据链接:提取码8848。

将PDF转化为JPG。

import aspose.words as aw
for i in range(1,6):doc=aw.Document(f"data/{i}/{i}.pdf")for page in range(0,doc.page_count):extractedPage=doc.extract_pages(page,1)extractedPage.save(f"dataset/{i}/{page+1}.jpg")

确认所有JPG大小是否一样。结果为假。

from PIL import Image
import os
sizes=[]
for i in range(1,6):for filename in os.listdir(f"dataset/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset/{i}",filename)) as img:sizes.append(img.size)
flag=True
for i in sizes:if i!=sizes[0]:flag=False;break
print(flag)

初步裁切JPG取正中间的400*800个像素点(因为所有JPG的大小都大于400*800)。

from PIL import Image
import os
sizes=[]
for i in range(1,6):for filename in os.listdir(f"dataset/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset/{i}",filename)) as img:width,height=img.sizeleft=(width-400)/2top=(height-800)/2right=(width+400)/2bottom=(height+800)/2copped_img=img.crop((left,top,right,bottom))copped_img.save(f"dataset_new/{i}/{filename}")

拆分大小为400*800的JPG为32张100*100的JPG。

from PIL import Image
import os
sizes=[]
for i in range(1,6):for filename in os.listdir(f"dataset_new/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset_new/{i}",filename)) as img:for x in range(0,400,100):for y in range(0,800,100):box=(x,y,x+100,y+100)tile=img.crop(box)tile.save(f"dataset_last_temp/{i}/{filename[:-4]}"+f"_{x//100}{y//100}"+".jpg")

人为地手动删除一些没有文字地的JPG,保存在dataset_last中。

展示其中一些数据:从上往下依次是中、日、韩、英、俄。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

开始实验

小波分解

为了方便展示结果,对LL2,LH2,HL2,HH2,LH1,HL1,HH1进行了裁剪。实际实验中没有进行裁剪。

from PIL import Image
import os
import numpy as np
import pywt
import matplotlib.pyplot as plt
def fc(LL,LH,HL,HH,x):LL=LL[:x,:x]LH=LH[:x,:x]HL=HL[:x,:x]HH=HH[:x,:x]image=np.zeros((LL.shape[0]+LH.shape[0],LL.shape[1]+HL.shape[1]))image[:LL.shape[0],:LL.shape[1]]=LLimage[LL.shape[0]:,:LL.shape[1]]=LHimage[:LL.shape[0],LL.shape[1]:]=HLimage[LL.shape[0]:,LL.shape[1]:]=HHreturn image
for i in range(1,6):for filename in os.listdir(f"dataset_last/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset_last/{i}",filename)) as img:img=img.convert('L')coeffs1=pywt.dwt2(img,'db4')LL1,(LH1,HL1,HH1)=coeffs1coeffs2=pywt.dwt2(LL1,'db4')LL2,(LH2,HL2,HH2)=coeffs2image=fc(fc(LL2,LH2,HL2,HH2,25),LH1,HL1,HH1,50)image=Image.fromarray(image.astype('uint8'))image.save(f"temp/{i}/{filename}")

展示其中一些结果:从上往下依次是中、日、韩、英、俄。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

得出结果

标准流程。

from PIL import Image
import os
import numpy as np
import pywt
def fc(matrix):count=0for i in matrix:for j in i:count+=j**2return count/(matrix.shape[0]*matrix.shape[1])
def metric1(LH,HL,HH):return [fc(LH),fc(HL),fc(HH)]
def metric2(LH,HL,HH):x=metric1(LH,HL,HH)a,b,c=x[0],x[1],x[2]d=a+b+creturn [a/d,b/d,c/d]
lt1=[[] for _ in range(5)]
lt2=[[] for _ in range(5)]
for i in range(1,6):for filename in os.listdir(f"dataset_last/{i}"):if filename.endswith(".jpg"):with Image.open(os.path.join(f"dataset_last/{i}",filename)) as img:img=img.convert('L')coeffs1=pywt.dwt2(img,'db4')LL1,(LH1,HL1,HH1)=coeffs1coeffs2=pywt.dwt2(LL1,'db4')LL2,(LH2,HL2,HH2)=coeffs2lt1[i-1].append([LH1,HL1,HH1])lt2[i-1].append([LH2,HL2,HH2])
metrics11=[[metric1(_[0],_[1],_[2]) for _ in lt1[i]] for i in range(5)]
metrics12=[[metric2(_[0],_[1],_[2]) for _ in lt1[i]] for i in range(5)]
mean11=[np.mean(metrics11[i],axis=0) for i in range(5)]
mean12=[np.mean(metrics12[i],axis=0) for i in range(5)]
var11=[np.var(metrics11[i],axis=0) for i in range(5)]
var12=[np.var(metrics12[i],axis=0) for i in range(5)]
metrics21=[[metric1(_[0],_[1],_[2]) for _ in lt2[i]] for i in range(5)]
metrics22=[[metric2(_[0],_[1],_[2]) for _ in lt2[i]] for i in range(5)]
mean21=[np.mean(metrics21[i],axis=0) for i in range(5)]
mean22=[np.mean(metrics22[i],axis=0) for i in range(5)]
var21=[np.var(metrics21[i],axis=0) for i in range(5)]
var22=[np.var(metrics22[i],axis=0) for i in range(5)]
zd={1:"中文",2:"日文",3:"韩文",4:"英文",5:"俄文"}
print(f"{'1次分解-DEMW:':<14}",end=" ")
for i in range(5):count=0for j in metrics11[i]:d=[sum((np.array(j)-_)**2) for _ in mean11]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics11[i])*10000)/100),end=" ")
print()
print(f"{'1次分解-DPMW:':<14}",end=" ")
for i in range(5):count=0for j in metrics12[i]:d=[sum((np.array(j)-_)**2) for _ in mean12]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics12[i])*10000)/100),end=" ")
print()
print(f"{'1次分解-DEMWV:':<14}",end=" ")
for i in range(5):count=0for j in metrics11[i]:d=[sum(((np.array(j)-mean11[k])**2)/(var11[k]**2)) for k in range(5)]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics11[i])*10000)/100),end=" ")
print()
print(f"{'1次分解-DPMWV:':<14}",end=" ")
for i in range(5):count=0for j in metrics12[i]:d=[sum(((np.array(j)-mean12[k])**2)/(var12[k]**2)) for k in range(5)]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics12[i])*10000)/100),end=" ")
print()
print(f"{'2次分解-DEMW:':<14}",end=" ")
for i in range(5):count=0for j in metrics21[i]:d=[sum((np.array(j)-_)**2) for _ in mean21]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics21[i])*10000)/100),end=" ")
print()
print(f"{'2次分解-DPMW:':<14}",end=" ")
for i in range(5):count=0for j in metrics22[i]:d=[sum((np.array(j)-_)**2) for _ in mean22]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics22[i])*10000)/100),end=" ")
print()
print(f"{'2次分解-DEMWV:':<14}",end=" ")
for i in range(5):count=0for j in metrics21[i]:d=[sum(((np.array(j)-mean21[k])**2)/(var21[k]**2)) for k in range(5)]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics21[i])*10000)/100),end=" ")
print()
print(f"{'2次分解-DPMWV:':<14}",end=" ")
for i in range(5):count=0for j in metrics22[i]:d=[sum(((np.array(j)-mean22[k])**2)/(var22[k]**2)) for k in range(5)]if np.argmin(d)==i:count+=1print(zd[i+1],end="")print(" :{:06.2f}%".format(int(count/len(metrics22[i])*10000)/100),end=" ")
print()

在这里插入图片描述

结果分析

这是一个5分类任务,乱猜猜中的概率为20%。根据上述实验结果,我们能够保证至少有一种判断方法判断一种语言正确的概率大于80%(除了英语)。大胆猜测英语判断效果不好的原因是我找的不同语言的论文中或多或少都包括了英文,毕竟英语是国际通用语言。

误差分析

由于每种语言我只找了一篇论文来做实验,显然实验数据并不够多。并不满足格列文科定理,结果不准也很正常。还有就是图片质量本身也不够好,例如:各种各样的水印,奇奇怪怪的与文字没有关系的论文插图。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

VPN以及GRE和MGRE

VPN VPN — 是虚拟专用网络 通俗地说&#xff0c;就是通过虚拟的手段&#xff0c;将两个独立的网络&#xff0c;穿越一个公共网络进行连接&#xff0c;实现点到点专线的效果&#xff08;可以理解为&#xff1a;一个分公司通过公网和总公司建立点到点的专线连接&#xff09; 现…

Jupyter notebook如何快速的插入一张图片?如何控制插入图片的缩放、靠左展示(ChatGPT)

在Jupyter Notebook中&#xff0c;你可以使用Markdown语法快速插入图片&#xff0c;并且可以通过HTML标签来控制图片的展示方式和缩放。 注意&#xff1a;以下所有操作都有一个前提&#xff0c;即选择Cell-CellType-Markdown 1. 快速插入图片 要在Jupyter Notebook中插入图…

docker安装好了,但是启动失败

新项目要用docker部署,但是docker安装完后,启动失败,服务器用的是国产化的(之前的服务器非国产化,之前也没任何问题),国产化的使用起来问题一大堆,还是bclinux 安装好后重启一直显示 使用journalctl -xe也没任何报错 使用systemctl status docker查看docker状态是灰…

白话大模型微调(Fine-tune)

吾名爱妃&#xff0c;性好静亦好动。好编程&#xff0c;常沉浸于代码之世界&#xff0c;思维纵横&#xff0c;力求逻辑之严密&#xff0c;算法之精妙。亦爱篮球&#xff0c;驰骋球场&#xff0c;尽享挥洒汗水之乐。且喜跑步&#xff0c;尤钟马拉松&#xff0c;长途奔袭&#xf…

专业学习|系统建模与仿真的基础概念知识合集

学习笔记来源&#xff1a;http://tup.tsinghua.edu.cn/upload/books/yz/086457-01.pdf 一、系统 系统按照事物发展的连续性又可分为连续系统和离散系统。连续系统是指状态变量随 时间连续变化的系统,如图1-1所示;离散系统则是指状态变量只是在某个离散的时间点集合上发生变化…

Problems retrieving the embeddings data form OpenAI API Batch embedding job

题意&#xff1a;从OpenAI API批量嵌入作业中检索嵌入数据时遇到问题 问题背景&#xff1a; I have to embed over 300,000 products description for a multi-classification project. I split the descriptions onto chunks of 34,337 descriptions to be under the Batch e…

Linux--线程互斥(加锁)

目录 0.对原生线程封装的代码 1.为什么需要线程互斥 2.加锁 2.1.认识加锁和它的接口 2.2用一下接口 2.2.1 解决抢票问题 2.2.2设置局部锁 2.3从原理角度理解锁 2.4锁是如何实现的**** 0.对原生线程封装的代码 方便后续对锁的理解&#xff1a;Thread.hpp 详情请看&#…

mybatis-plus LambdaQueryWrapper条件构造器使用apply查询含有逗号‘,‘分隔的字段

mybatis-plus LambdaQueryWrapper apply自定义SQL条件使用 真实业务开发使用场景 数据库:postgreSQL 开发场景:SpringBoot2.5.7 数据库中数据如下 需求 查找, bingBdNumber字段为422875,要求数据库中bind_bd_number这一栏中只要有422875的就返回. 根据上图查422875需要返回…

【python】导入serial模块,读写串口数据(嵌入式软件自动化测试)

目录 环境准备安装pyserial硬件连接 基本函数使用获取串口设备列表初始化串口对象发送数据读取数据 环境准备 安装pyserial 1、python 3.6.7 2、pyserial模块封装了python对串口的访问 pip install serialpip install pyserial如果代码报错卸载掉serial 硬件连接 1、将串口…

Android 10.0 SystemUI下拉状态栏固定展开QsPanel不收缩功能实现

1. 前言 在10.0的系统ROM产品定制化开发中,在systemUi的原生下拉状态栏中,首次下拉展开quickQsPanel,第二次展开就显示 QsPanel,在产品开发中,需要下拉状态栏固定展开QsPanel,不需要二次展开,接下来分析下相关功能的实现,如图: 2.SystemUI下拉状态栏固定展开QsPanel不收…

Python和C++行人轨迹预推算和空间机器人多传感融合双图算法模型

&#x1f3af;要点 &#x1f3af;双图神经网络模型&#xff1a;最大后验推理和线性纠错码解码器 | &#x1f3af;重复结构和过约束问题超图推理模型 | &#x1f3af;无向图模型变量概率计算、和积消息传播图结构计算、隐马尔可夫模型图结构计算、矩阵图结构计算、图结构学习 |…

基于Java技术的致远汽车租赁系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;B/S模式、Java技术 工具&#xff1a;Visual Studio、MySQL数据库开发工具 系统展示 首页 用户注册…

现场可重构CPLD芯片应用案例—蓝牙音箱

我司英尚微提供的高性能数模混合现场可重构IC、通用可配置的模数混合芯片内部集成丰富的模拟资源和数字资源&#xff0c;可轻松替代电路中的各种标准器件&#xff0c;并按照客户要求组合成最优小型ASIC&#xff0c;缩短开发周期&#xff0c;降低成本。下面介绍LS98002现场可重构…

object-C 解答算法:移动零(leetCode-283)

移动零(leetCode-283) 题目如下图:(也可以到leetCode上看完整题目,题号283) 解题思路: 本质就是把非0的元素往前移动,接下来要考虑的是怎么移动,每次移动多少? 这里需要用到双指针,i 记录每次遍历的元素值, j 记录“非0元素值”需要移动到的位置; 当所有“非0元素值”都移…

链表面试练习习题(Java)

1. 思路&#xff1a; 创建两个链表&#xff0c;一个用来记录小于x的结点&#xff0c;一个用来记录大于等于x的结点&#xff0c;然后遍历完原链表后&#xff0c;将小于x的链表和大于等于x的链表进行拼接即可 public class Partition { public ListNode partition(ListNode pH…

如何将PDF转换成可以直接编辑的CAD图纸?

PDF图纸是为了让用户更好的阅览CAD文件&#xff0c;但是&#xff0c;当我们想要对其进行编辑的时候&#xff0c;PDF图纸就是一个麻烦了。那么PDF转换成CAD后可以编辑吗&#xff1f;如何将PDF转换成可以直接编辑的CAD图纸呢&#xff1f;本篇给你答案。 1、启动迅捷CAD编辑器&…

linux进行redis的安装并使用RDB进行数据迁移

现在有两台电脑&#xff0c;分别是A&#xff0c;B&#xff0c;现在我要把A电脑上的redis的数据迁移到B电脑上&#xff0c;B电脑上是没有安装redis的 1.找到A电脑的redis的版本 1.先启动A电脑的redis&#xff0c;一般来说&#xff0c;都是直接在linux的控制台输入&#xff1a;re…

Spring Cloud Loadbalancer 的使用

一、默认负载均衡策略 Spring Cloud LoadBalancer 默认的负载均衡策略是轮询。 轮询效果示例 我们需要示例一个请求分发到不同的模块上&#xff0c;所以我们需要创建多模块项目。 新建 Spring Boot &#xff08;3.0.2&#xff09;的 Maven 项目&#xff08;JDK 17&#xff09…

万界星空科技MES系统生产计划管理的功能

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;的生产计划管理功能是其核心功能之一&#xff0c;旨在将企业的生产计划转化为实际的生产操作&#xff0c;并通过实时监控和调整来确保生产活动的顺利进行。以下是MES系统生产计划管理功…

STM32智能环境监测系统教程

目录 引言环境准备智能环境监测系统基础代码实现&#xff1a;实现智能环境监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;环境监测与管理问题解决方案与优化收尾与总结 1. 引言 智能环境监测系统通…