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

07-21 1539阅读

文章目录

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

      数据简介

      各找一篇中文,日文,韩文,英文,俄文较长的学术论文。将论文转化为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:':'1次分解-DPMW:':'1次分解-DEMWV:':'1次分解-DPMWV:':'2次分解-DEMW:':'2次分解-DPMW:':'2次分解-DEMWV:':'2次分解-DPMWV:':
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]