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

文章目录

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

数据简介

各找一篇中文,日文,韩文,英文,俄文较长的学术论文。将论文转化为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://xiahunao.cn/news/3250217.html

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

相关文章

Python基础语法篇(下)+ 数据可视化

Python基础语法&#xff08;下&#xff09; 数据可视化 一、函数&#xff08;一&#xff09;函数的定义&#xff08;二&#xff09;函数的调用和传参 二、文件操作&#xff08;一&#xff09;文件读取和写入&#xff08;二&#xff09;文件对象及方法&#xff08;三&#xff09…

[003-02-10].第10节:Docker环境下搭建Redis主从复制架构

我的博客大纲 我的后端学习大纲 我的Redis学习大纲 1.cluster&#xff08;集群&#xff09;模式-docker版 哈希槽分区进行亿级数据存储 1.1.面试题&#xff1a;1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例 1.回答&#xff1a;单机单台100%不可能&#xff0c;肯…

Adobe国际认证详解-影视后期

在当今的数字媒体时代&#xff0c;影视后期制作作为创意产业的核心环节&#xff0c;对于专业技能的要求日益提高。Adobe国际认证&#xff0c;作为全球创意设计领域的重要标杆&#xff0c;为影视后期制作人员提供了一个展示自我、提升技能的国际舞台。 何为影视后期&#xff1f;…

matlab 异常值检测与处理——Robust Z-score法

目录 一、算法原理1、概述2、主要函数3、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠翻译,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、概述 Robust Z-score法也被称为中位数绝对偏差法。它类似于Z-sc…

10. Hibernate LazyFetch

1. 前言 本节和大家一起聊聊 Hibernate 中的 Lazy 和 Fetch 的区别&#xff0c;及两者适合的开发场景。通过本节课程的学习&#xff0c;你将了解到&#xff1a; 什么是延迟加载&#xff1b;延迟加载的意义。 2. 又见 get() 和 load() Session 对象提供了 2 个方法用来查询 &…

基于深度残差网络迁移学习的浸润性导管癌检测

1. 引言 癌症是一种异常细胞不受控制地分裂损害健康组织的疾病。皮肤或覆盖我们内脏的组织中的癌细胞被称为癌。乳房中的大多数癌是导管癌。侵袭性导管癌(Invasive Ductal Carcinoma, IDC)始于乳管&#xff0c;侵犯乳房周围纤维组织&#xff0c;晚期可通过血液扩散至淋巴结或身…

【鸿蒙学习笔记】位置设置・position・绝对定位・子组件相对父组件

官方文档&#xff1a;位置设置 目录标题 position・绝对定位・子组件相对父组件Row Text position position・绝对定位・子组件相对父组件 正→ ↓ Row Text position Entry Component struct Loc_position {State message: string Hello World;build() {Column() {Co…

二叉树的前、中、后序遍历(递归法、迭代法)leetcode144/94/145

leetcode144、二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a;…

求职学习day5

安排明天hr面 投一下平安可能。 hr面准备&#xff0c;复习java核心技术&#xff0c;复习java项目。 正视自己&#xff0c;调整心态。 也是很早接触了javaguide但是没有持续学习&#xff0c;项目介绍 | JavaGuide&#xff0c;面试前复习一下感觉还是很有收获的。 还有一些…

【QT】label中添加QImage图片并旋转(水平翻转、垂直翻转、顺时针旋转、逆时针旋转)

目录 0.简介 1.详细代码及解释 1&#xff09;原label显示在界面上 2&#xff09;水平翻转 3&#xff09;垂直翻转 4&#xff09;顺时针旋转45度 5&#xff09;逆时针旋转 0.简介 环境&#xff1a;windows11 QtCreator 背景&#xff1a;demo&#xff0c;父类为QWidget&a…

Go语言并发编程-Channel通信_2

Channel通信 Channel概述 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存 这是Go语言最核心的设计模式之一。 在很多主流的编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存&#xff0c;而Go语言中多Goroutine通信的主要方案是Cha…

笔记 7 :linux 011 注释,函 bread () , get_hash_table () , find_buffer ()

&#xff08;57&#xff09;接着介绍另一个读盘块的函数 bread&#xff08;&#xff09;&#xff1a; &#xff08;58&#xff09;因为 函数 get_blk&#xff08;&#xff09;大量调用了其它函数&#xff0c;一版面列举不完&#xff0c;故对其调用的函数先行注释&#xff1a;ge…

【驱动程序】霍尔编码器电机_CubeMX_HAL库

【驱动程序】霍尔编码器电机_CubeMX_HAL库 电机型号&#xff1a;MG310 霍尔编码器电机 驱动模块&#xff1a;L298N 接线 注&#xff1a; L298N 12V接线柱位置可以接50V~5V当跳线帽接入时&#xff0c;5V接线柱为5V输出&#xff0c;可以给驱动板供电当跳线帽拔出时&#xff0…

单片机主控的基本电路

论文 1.复位电路 2.启动模式设置接口 3.VBAT供电接口 4.MCU 基本电路

昇思25天学习打卡营第30天 | MindNLP ChatGLM-6B StreamChat

今天是第30天&#xff0c;学习了MindNLP ChatGLM-6B StreamChat。 今天是参加打卡活动的最后一天&#xff0c;经过这些日子的测试&#xff0c;昇思MindSpore效果还是不错的。 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;具有62亿参数&#xff0c;基于 …

Blender4.2版本正式上线,新版本的5个主要功能!

​Blender刚刚推出了备受瞩目的 Blender 4.2 版本&#xff0c;这款软件专为那些在视觉特效、动画制作、游戏开发和可视化设计领域工作的艺术家们量身打造。作为最新的长期稳定更新&#xff0c;Blender 4.2 不仅稳定可靠&#xff0c;还引入了备受期待的“Eevee Next”实时渲染引…

unity渲染人物模型透明度问题

问题1&#xff1a;有独立的手和衣服的模型&#xff0c;但最终只渲染出来半透明衣服 问题2&#xff1a;透明度贴图是正确的但显示却不正确 这上面两个模型的问题都是因为人物模型是一个完整的&#xff0c;为啥有些地方可以正常显示&#xff0c;有些地方透明度却有问题。 其中…

嵌入式香橙派人工智能AI开发板详细操作与远程聊天实现

大家好&#xff0c;今天给大分享一个OrangePi AIpro&#xff08;20T&#xff09;采用昇腾作为主控芯片的开发板&#xff0c;开箱以及对应功能的详细实现。 第一&#xff1a;板子基本介绍 接通电源给对应的开发板上电&#xff0c;观察其中的现象&#xff0c;如下&#xff1a; 注…

Vue 组件插槽 slot 简单例子

https://andi.cn/page/621582.html

GZ032 信息安全管理与评估赛项参考答案-模块1任务二11-20

GZ032 信息安全管理与评估赛项参考答案-模块1任务二 后面的题可能有的地方没有验证但是步骤都对&#xff0c;第13个小题没有做跳过去了等下一期或者最后在做 文章目录 GZ032 信息安全管理与评估赛项参考答案-模块1任务二11.总公司和分公司今年进行IPv6试点&#xff0c;要求总公…