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

news2024/11/13 15:43:59

文章目录

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

数据简介

各找一篇中文,日文,韩文,英文,俄文较长的学术论文。将论文转化为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.size
                left=(width-400)/2
                top=(height-800)/2
                right=(width+400)/2
                bottom=(height+800)/2
                copped_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]]=LL
    image[LL.shape[0]:,:LL.shape[1]]=LH
    image[:LL.shape[0],LL.shape[1]:]=HL
    image[LL.shape[0]:,LL.shape[1]:]=HH
    return 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)=coeffs1
                coeffs2=pywt.dwt2(LL1,'db4')
                LL2,(LH2,HL2,HH2)=coeffs2
                image=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=0
    for i in matrix:
        for j in i:
            count+=j**2
    return 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+c
    return [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)=coeffs1
                coeffs2=pywt.dwt2(LL1,'db4')
                LL2,(LH2,HL2,HH2)=coeffs2
                lt1[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=0
    for j in metrics11[i]:
        d=[sum((np.array(j)-_)**2) for _ in mean11]
        if np.argmin(d)==i:
            count+=1
    print(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=0
    for j in metrics12[i]:
        d=[sum((np.array(j)-_)**2) for _ in mean12]
        if np.argmin(d)==i:
            count+=1
    print(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=0
    for 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+=1
    print(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=0
    for 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+=1
    print(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=0
    for j in metrics21[i]:
        d=[sum((np.array(j)-_)**2) for _ in mean21]
        if np.argmin(d)==i:
            count+=1
    print(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=0
    for j in metrics22[i]:
        d=[sum((np.array(j)-_)**2) for _ in mean22]
        if np.argmin(d)==i:
            count+=1
    print(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=0
    for 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+=1
    print(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=0
    for 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+=1
    print(zd[i+1],end="")
    print(" :{:06.2f}%".format(int(count/len(metrics22[i])*10000)/100),end=" ")
print()

在这里插入图片描述

结果分析

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

误差分析

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

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

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

相关文章

网安速查引擎(厂商设备大全)

速查引擎 斯元的速查引擎以其全面、精准的信息整合和便捷的搜索功能&#xff0c;大大缩短了用户查找相关厂商和产品信息的时间&#xff0c;从而提高了工作效率和决策质量。用户可以轻松查阅到各个赛道中的领先厂商和最新技术&#xff0c;帮助企业快速找到适合的合作伙伴和解决方…

逆向案例二十五——webpack所需模块函数很多,某翼云登录参数逆向。

解决步骤&#xff1a; 网址&#xff1a;aHR0cHM6Ly9tLmN0eXVuLmNuL3dhcC9tYWluL2F1dGgvbG9naW4 不说废话&#xff0c;密码有加密&#xff0c;直接搜索找到疑似加密位置打上断点。 再控制台打印&#xff0c;分析加密函数 有三个处理过程&#xff0c;b[g]得到的是用户名,b[f] 对…

HiFi-GAN——基于 GAN 的声码器,能在单 GPU 上生成 22 KHz 音频

拟议的 HiFiGAN 可从中间表征生成原始波形 源码地址&#xff1a;https://github.com/NVIDIA/DeepLearningExamples 论文地址&#xff1a;https://arxiv.org/pdf/2010.05646.pdf 研究要点包括 **挑战&#xff1a;**基于 GAN 的语音波形生成方法在质量上不及自回归模型和基于流…

Linux部署Prometheus+Grafana

【Linux】PrometheusGrafana 一、Prometheus&#xff08;普罗米修斯&#xff09;1、Prometheus简述2、Prometheus特点3、Prometheus生态组件4、Prometheus工作原理 二、部署Prometheus1、系统架构2、部署Prometheus3、修改配置文件4、配置系统启动文件 三、部署 Node Exporter …

Spring MVC-什么是Spring MVC?

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 文章目录 1.MVC定义2. Spring MVC 官方对于Spring Web MVC的描述这样的: Spring Web MVC is the original web framework built on the Servlet APl and has been includedin the Spring Frame…

P1-AI产品经理--九五小庞

产品经理的定位 AI基于现有业务挖掘AI应用场景&#xff0c;服务提供商选择及算法定制等&#xff0c;配合已有产品完成整体产品工工资基于从事医疗行业的考虑&#xff0c;我们走的应该是AI产品经理&#xff08;软件型&#xff09; AI产品经理&#xff08;行业型&#xff09; AI…

JavaEE:Lombok工具包的使用以及EditStarter插件的安装

Lombok是一个Java工具库&#xff0c;通过添加注解的方式&#xff0c;简化Java的开发。 目录 1、引入依赖 2、使用 3、原理解释 4、更多使用 5、更快捷的引入依赖 1、引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lomb…

STM32全栈嵌入式人脸识别考勤系统:融合OpenCV、Qt和SQLite的解决方案

1. 项目概述 本项目旨在设计并实现一个基于STM32的全栈人脸识别考勤系统。该系统结合了嵌入式开发、计算机视觉和数据库技术&#xff0c;实现了自动人脸检测、识别和考勤记录功能。 主要特点: 使用STM32F4系列微控制器作为主控制器采用OpenCV进行人脸检测和识别Qt开发跨平台…

高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0

桌面虚拟化作为云时代的主流和热门技术&#xff0c;已经取得了广泛应用。随着生成式 AI 爆炸式发展&#xff0c;CSDN 看到&#xff0c;人工智能正在引发计算、开发、交互三大范式的全面升级&#xff0c;技术开发或将迎来一次全新的科技变革周期&#xff0c;因此 VDI 云桌面随之…

亚马逊自发货erp,虚拟自动化发货功能以及1688订单采购

亚马逊自发货erp自动化功能&#xff0c;自动同步订单&#xff0c;1688订单同步。 大家好&#xff0c;今天分享一个非常实用并且节省时间的功能&#xff1a;自动化发货以及1688同步订单。 首先来看下自动化发货功能怎么操作。 →要在商品信息里面添加商品信息&#xff0c;上传…

C#语法基础详解(万字总结)

文章目录 **参考书籍&#xff1a;C#7.0 核心技术指南**类型类字段解构器对象初始化器属性表达式属性(只读属性才可以)自动属性属性初始化器 索引器静态构造器nameof运算符 继承类型转换和引用转换as运算符is运算符is与模式变量 虚函数成员抽象类和抽象成员new和重写base关键字构…

JavaDS —— 二叉树

树的基本概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 树形结构中&#xff0c;子树之间不能有…

网易滑块逆向

版本 2.27.2 混淆难度挺大 没反混淆 直接硬着直接干 参数还是那些 滑块&#xff08;其他类型也一样&#xff09;成功率 100%

= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑

一、概述 1、NULL参与的所有的比较和算术运算符(>,,<,<>,<,>,,-,*,/) 结果为unknown&#xff1b; 2、unknown的逻辑运算(AND、OR、NOT&#xff09;遵循三值运算的真值表&#xff1b; 3、如果运算结果直接返回用户&#xff0c;使用NULL来标识unknown 4、如…

CSS技巧专栏:一日一例 8 - 纯CSS利用mask属性实现按钮边框对称包围特效

CSS技巧专栏:一日一例 8 - 纯CSS利用mask属性实现按钮边框对称包围特效 上篇作业解题 在前一篇文章的最后,给各位看官留了一个作业,如上图所示。本篇文章,我们来公布一下它的源码。 主要实现的思路 四个渐变色的线段,沿着四个方向的依次运动,(运动在加载前执行)使用 …

物联网实训室的核心功能有哪些?

随着物联网技术的迅猛发展和广泛应用&#xff0c;唯众凭借其深厚的技术积累和丰富的行业经验&#xff0c;为职业院校提供了全面的物联网实训室解决方案。这些实训室不仅为学生提供了真实、实用、创新的实践环境&#xff0c;还促进了产学研用的深度融合&#xff0c;推动了物联网…

深度学习根据代码可视化模型结构图的方法

方法1. Netron Netron 是一个支持多种深度学习模型格式的可视化工具&#xff0c;可以将 PyTorch 模型转换为 ONNX 格式&#xff0c;然后使用 Netron 进行可视化。 安装 Netron&#xff1a; pip install netron使用示例&#xff1a; import torch.onnx# 定义模型 model EMA…

上海理工大学24计算机考研考情分析!初复试分值比55:45,复试逆袭人数不算多!

上海理工大学&#xff08;University of Shanghai for Science and Technology&#xff09;&#xff0c;位于上海市&#xff0c;是一所以工学为主&#xff0c;工学、理学、经济学、管理学、文学、法学、艺术学等多学科协调发展的应用研究型大学&#xff1b;是上海市属重点建设大…

秒懂C++之类与对象(中)

目录 一.流插入&#xff0c;流提取运算符 二.const成员函数 三.取地址重载 四.构造函数&#xff08;列表初始化&#xff09; 小测试&#xff1a; 五.全部代码 前排提醒&#xff1a;本文所参考代码仍是取用上篇文章关于日期类相关功能的实现~末尾有全部代码~ 一.流插入&a…

使用Redis的SETNX命令实现分布式锁

什么是分布式锁 分布式锁是一种用于在分布式系统中控制多个节点对共享资源进行访问的机制。在分布式系统中&#xff0c;由于多个节点可能同时访问和修改同一个资源&#xff0c;因此需要一种方法来确保在任意时刻只有一个节点能够对资源进行操作&#xff0c;以避免数据不一致或…