精华内容
下载资源
问答
  • docx_python_process 从docx文件中批量提取图片表格内文字 pip安装: pip install python-docx
  • 提取图片上的表格方法

    万次阅读 2019-05-30 13:47:05
    链接:https://answers.opencv.org/question/63847/how-to-extract-tables-from-an-image/
    展开全文
  • python提取图片中的表格内容

    万次阅读 多人点赞 2019-06-14 16:30:17
    只提供思路,具体场景核...4、获取表格交点坐标 5、根据交点集获取单元格轮廓并进行过滤 二、使用案例 三、代码示例及效果 1、灰度化处理 def gray_img(img:'numpy.ndarray'): """ 对读取的图像进行灰度化处理 ...

    只提供思路,具体场景核图像有关,需做前期调整

    一、处理流程:

    1、图像灰度化处理

    2、图像二值化处理

    3、图像腐蚀处理(若得到的横纵交线不清楚,添加膨胀处理)

    4、获取表格交点坐标

    5、根据交点集获取单元格轮廓并进行过滤

    二、使用案例

    在这里插入图片描述

    三、代码示例及效果

    1、灰度化处理

    def gray_img(img:'numpy.ndarray'):
        """
        对读取的图像进行灰度化处理
        :param img: 通过cv2.imread(imgPath)读取的图像数组对象
        :return: 灰度化的图像
        """
        grayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        return grayImage
    

    2、二值化处理

    def bin_img(img:'numpy.ndarray'):
        """
        对图像进行二值化处理
        :param img: 传入的图像对象(numpy.ndarray类型)
        :return: 二值化后的图像
        """
        ret,binImage=cv2.threshold(img,180,255,cv2.THRESH_BINARY_INV)
        return binImage
    

    在这里插入图片描述

    3、图像腐蚀

    def erode_img(img,kernel_args=(2,2),iterations=1):
        """
        对图像进行腐蚀
        @param kernel_args 卷积核参数(2,2)
        @param interations erode的迭代次数
        """
    
        kernel = np.ones(kernel_args, np.uint8)
        return cv2.erode(img, kernel,iterations=iterations)
    

    (1)纵向腐蚀获取横向线条

        img_transverse = erode_img(img,(1,2),40)
    

    需要调节卷积核参数(kernel_args),迭代次数(iterations)
    在这里插入图片描述

    (2)横向腐蚀获取纵向线条

        img_vertical = erode_img(img, (2,1), 40)
    

    在这里插入图片描述

    4、图像膨胀处理

    膨胀处理相当于对线条进行加粗

        img_transverse = dilate_img(img_transverse,(2,2),1)
        img_vertical = dilate_img(img_vertical,(2,2),1)
    

    5、获取交点

    def get_points(img_transverse, img_vertical):
        """
        获取横纵线的交点
        :param img_transverse:
        :param img_vertical:
        :return:
        """
        img = cv2.bitwise_and(img_transverse, img_vertical)
        return img
    

    在这里插入图片描述

    6、获取单元格

    def split_rec(arr):
        """
        切分单元格
        :param arr:
        :return:
        """
        # 数组进行排序
        arr.sort(key=lambda x: x[0],reverse=True)
        # 数组反转
        arr.reverse()
        for i in range(len(arr) - 1):
            if arr[i+1][0] == arr[i][0]:
                arr[i+1][3] = arr[i][1]
                arr[i + 1][2] = arr[i][2]
            if arr[i+1][0] > arr[i][0]:
                arr[i + 1][2] = arr[i][0]
            print(arr[i])
        return arr
    
    def get_rec(img):
        """
        获取单元格
        :param img: 
        :return: 
        """
        contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
        contours_poly = [0] * len(contours)
        boundRect = [0] * len(contours)
        rois = []
        for i in range(len(contours) - 1):
            cnt = contours[i]
            contours_poly[i] = cv2.approxPolyDP(cnt, 1, True)
            boundRect[i] = cv2.boundingRect(contours_poly[i])
            rois.append(np.array(boundRect[i]))
            # img = cv2.rectangle(img_bak, (boundRect[i][0], boundRect[i][1]), (boundRect[i][2], boundRect[i][3]),
            #                     (255, 255, 255), 1, 8, 0)
        rois = split_rec(rois)
        return rois
    

    在这里插入图片描述

    四、完整代码

    from PIL import Image, ImageOps
    import cv2
    import numpy as np
    
    
    
    
    def split_rec(arr):
        """
        切分单元格
        :param arr:
        :return:
        """
        # 数组进行排序
        arr.sort(key=lambda x: x[0],reverse=True)
        # 数组反转
        arr.reverse()
        for i in range(len(arr) - 1):
            if arr[i+1][0] == arr[i][0]:
                arr[i+1][3] = arr[i][1]
                arr[i + 1][2] = arr[i][2]
            if arr[i+1][0] > arr[i][0]:
                arr[i + 1][2] = arr[i][0]
            print(arr[i])
    
        return arr
    
    
    
    def get_points(img_transverse, img_vertical):
        """
        获取横纵线的交点
        :param img_transverse:
        :param img_vertical:
        :return:
        """
        img = cv2.bitwise_and(img_transverse, img_vertical)
        return img
    
    
    
    
    def dilate_img(img, kernal_args:tuple, iterations:int):
        """
        dilate image
        @param kernel_args 卷积核参数(2,2)
        @param interations dilate的迭代次数
        """
    
        kernel = np.ones(kernal_args, np.uint8)
        return cv2.dilate(img, kernel,iterations=iterations)
    
        pass
    
    
    def erode_img(img,kernel_args=(2,2),iterations=1):
        """
        对图像进行腐蚀
        @param kernel_args 卷积核参数(2,2)
        @param interations erode的迭代次数
        """
    
        kernel = np.ones(kernel_args, np.uint8)
        return cv2.erode(img, kernel,iterations=iterations)
    
    
    
    
    def bin_img(img:'numpy.ndarray'):
        """
        对图像进行二值化处理
        :param img: 传入的图像对象(numpy.ndarray类型)
        :return: 二值化后的图像
        """
        ret,binImage=cv2.threshold(img,180,255,cv2.THRESH_BINARY_INV)
        return binImage
    
    def gray_img(img:'numpy.ndarray'):
        """
        对读取的图像进行灰度化处理
        :param img: 通过cv2.imread(imgPath)读取的图像数组对象
        :return: 灰度化的图像
        """
        grayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        return grayImage
        pass
    
    def get_rec(img):
        """
        获取单元格
        :param img:
        :return:
        """
        contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
        contours_poly = [0] * len(contours)
        boundRect = [0] * len(contours)
        rois = []
        for i in range(len(contours) - 1):
            cnt = contours[i]
            contours_poly[i] = cv2.approxPolyDP(cnt, 1, True)
            boundRect[i] = cv2.boundingRect(contours_poly[i])
            rois.append(np.array(boundRect[i]))
            # img = cv2.rectangle(img_bak, (boundRect[i][0], boundRect[i][1]), (boundRect[i][2], boundRect[i][3]),
            #                     (255, 255, 255), 1, 8, 0)
        rois = split_rec(rois)
        return rois
    
    if __name__ == "__main__":
        image  = "D:/cs/ocr/c.png"
        img_bak = cv2.imread(image)
        img = gray_img(img_bak)
        img = bin_img(img)
        img_transverse = erode_img(img,(1,2),40)
        img_vertical = erode_img(img, (2,1), 40)
        # img = img_transverse + img_vertical
        img_transverse = dilate_img(img_transverse,(2,2),1)
        img_vertical = dilate_img(img_vertical,(2,2),1)
        img = get_points(img_transverse,img_vertical)
    
        rois = get_rec(img)
        for i, r in enumerate(rois):
            cv2.imshow("src" + str(i), img_bak[r[3]:r[1], r[2]:r[0]])
        cv2.waitKey(0)
    
        cv2.destroyAllWindows()
        pass
    
    

    五、未解决

    1、图像不清楚或倾斜,无法操作

    2、若最右侧没有竖线会丢失最后一列

    展开全文
  • 图片进行水印处理,利用TESS4J识别图片提取信息生成excel表格。里面有字库文件所以占用空间较大。 说明:https://blog.csdn.net/xlantian/article/details/80789115
  • 1.提取图片 安装环境: python3.7 pip3 install pymupdf==1.16.8(最新版本会报错) import fitz #pip3 install pymupdf==1.16.8 import time import re import os def get_image(path, pic_path): '''从pdf中提取...

    1.提取图片

    安装环境:
    python3.7
    pip3 install pymupdf==1.16.8(最新版本会报错)

    import fitz  #pip3 install pymupdf==1.16.8
    import time
    import re
    import os
    
    
    def get_image(path, pic_path):
        '''从pdf中提取图片
        :param path: pdf的路径
        :param pic_path: 图片保存的路径
        :return: 无return
        '''
        t0 = time.clock()
        # 00、使用正则表达式查找PDF中的图片
        checkXO = r"/Type(?= */XObject)"
        checkIM = r"/Subtype(?= */Image)"
    
        # 一、打开pdf,打印PDF的相关信息
        doc = fitz.open(path)
        # 图片计数
        imgcount = 0
        lenXREF = doc._getXrefLength()
    
        # 打印PDF的信息
        print("文件名:{}, 页数: {}, 对象: {}".format(path, len(doc), lenXREF - 1))
    
        # 二、遍历PDF中的对象,遇到是图像才进行下一步,不然就continue
        for i in range(1, lenXREF):
            # 定义对象字符串
            # text = doc._getObjectString(i)
            text = doc._getXrefString(i)
            # print(text)
            # continue
            isXObject = re.search(checkXO, text)
            # 使用正则表达式查看是否是图片
            isImage = re.search(checkIM, text)
            # 如果不是对象也不是图片,则continue
            if not isXObject or not isImage:
                print("不是图片")
                continue
            imgcount += 1
            # 根据索引生成图像
            pix = fitz.Pixmap(doc, i)
            # 根据pdf的路径生成图片的名称
            new_name = path.replace('\\', '_') + "_img{}.png".format(imgcount)
            new_name = new_name.replace(':', '')
    
            # 三、将图像存为png格式
            # 如果pix.n<5,可以直接存为PNG
            if pix.n < 5:
                pix.writePNG(os.path.join(pic_path, new_name))
            # 否则先转换CMYK
            else:
                pix0 = fitz.Pixmap(fitz.csRGB, pix)
                pix0.writePNG(os.path.join(pic_path, new_name))
                pix0 = None
            # 释放资源
            pix = None
        t1 = time.clock()
        print("运行时间:{}s".format(t1 - t0))
        print("提取了{}张图片".format(imgcount))
    
    
    # 运行
    if __name__=='__main__':
        # pdf路径
        path = r"delete.pdf"  # 测试提取图片专用  Selenium 自动化爬虫
        pic_path = r"image"
        # 创建保存图片的文件夹
        if os.path.exists(pic_path):
            print("文件夹已存在,请重新创建新文件夹!")
            raise SystemExit
        else:
            os.mkdir(pic_path)
        get_image(path, pic_path)
    
    

    参考链接:

    https://blog.csdn.net/weixin_41173374/article/details/99213613?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.not_use_machine_learn_pai
    

    2.提取表格

    从pdf中提取表格数据,生成.xls文件,下面的代码只提取首页:
    (摘自:https://blog.csdn.net/Abecedarian_CLF/article/details/102299916

    import pdfplumber
    import xlwt
    
    # 定义保存Excel的位置
    workbook = xlwt.Workbook()  #定义workbook
    sheet = workbook.add_sheet('Sheet1')  #添加sheet
    i = 0 # Excel起始位置
    
    path = input("请输入PDF文件位置:")    
    #path = "aaaaaa.PDF"  # 导入PDF路径
    pdf = pdfplumber.open(path)
    print('\n')
    print('开始读取数据')
    print('\n')
    for page in pdf.pages:
        # 获取当前页面的全部文本信息,包括表格中的文字
        # print(page.extract_text())                     
        for table in page.extract_tables():
            # print(table)
            for row in table:            
                print(row)
                for j in range(len(row)):
                    sheet.write(i, j, row[j])
                i += 1
            print('---------- 分割线 ----------')
    
    pdf.close()
    
    # 保存Excel表
    workbook.save('PDFresult.xls')
    print('\n')
    print('写入excel成功')
    print('保存位置:')
    print('C:/Users/Administrator/Desktop/PDFresult.xls')
    print('\n')
    input('PDF取读完毕,按任意键退出')
    
    

    3.牛逼的软件

    可以下载Mathpix Snip:https://mathpix.com/
    可以提取公式(见下图)、提取表格。
    软件生成latex格式,然后我们可以借助aurora插入到word,是真的牛逼。
    在这里插入图片描述
    (图片摘自:https://www.moonpapers.com/manual/latex/senior/math/formula/tool.html)

    展开全文
  • 后台管理系统中用到了非常多的表格,一般为了方便都会讲表格进行提取,形成公共组件。 提取表格时会遇到返回的json数据中要对单个字段进行处理,如时间戳转换,状态转换等 封装的表格组件代码 <template> <...

    后台管理系统中用到了非常多的表格,一般为了方便都会讲表格进行提取,形成公共组件。
    提取表格时会遇到返回的json数据中要对单个字段进行处理,如时间戳转换,状态转换等
    以及elementUI表格提取后每个页面都展示或者不展示当列按钮的方法

    封装的表格组件代码

    <template>
      <div>
        <!-- 中部列表表格 -->
        <el-table
          :data="tableData"
          highlight-current-row
          border
          @selection-change="handleSelectionChange"
          @current-change="handtable"
        >
          <el-table-column type="selection" width="50" align="center" v-if="gg?true:false"></el-table-column>
          <el-table-column label="序号" type="index" width="50" align="center" :index="indexMethod"></el-table-column>
          <el-table-column
            v-for="(itemtest, index) in title"
            :key="index"
            v-if="!itemtest.operate"
            :prop="itemtest.prop"
            align="center"
            :label="itemtest.label"
            :formatter="itemtest.formatter"
          ></el-table-column>
          <el-table-column v-else :label="itemtest.label" :prop="itemtest.prop" align="center">
            <template slot-scope="scope">
              <slot :name="itemtest.prop" :$index="scope.$index" :row="scope.row"></slot>
              <!-- 对应slot name -->
            </template>
          </el-table-column>
        </el-table>
      </div>
    </template>
    <script>
    export default {
      name: "tabletable",
      props: {
        title: {
          type: Array,
          default: []
        },
        tableData: {
          type: Array,
          default: []
        },
        gg:Boolean,
        formatter: { default: {} },  //此处写上formatter函数
        handleSelectionChange: { default: {} },
        handtable: { default: {} },
        indexMethod: { default: {} },
       
      },
      methods: {
      }
    };
    </script>
    

    调用封装的表格代码

    <template>
      <div>
    
        <!-- 中部列表表格 -->
        <v-Table
          :tableData="tableData"
          :title="title"
          :gg="false"
          :indexMethod="indexMethod"
          :handleClick="handleClick"
          :handtable="handtable"
        >
              <template slot="dealScreenshot" slot-scope="scope">  // slot="dealScreenshot" 要与下列的表格一致
            <el-button size="small" type="text" @click="handleRowEdit(scope.$index,scope.row)">查看</el-button>
          </template>
        </v-Table>
      </div>
    </template>
    <script>
    import vTable from "@/components/comiview/table.vue";
    import { formDatetime } from "@/utils/formdata.js";  //封装的js方法
    import { orderState } from "@/utils/orderState.js";//封装的js方法
    export default {
      components: {
        vTable
      },
      name: "account",
      data() {
        return {
          tableData: [
            {
              orderCode: "1",
              payStatus: "1",
              createTime: "",
            }
          ],
          title: [
            { label: "用户名", prop: "orderCode",  operate: false },
            {
              label: "账户状态",
              prop: "payStatus",
                operate: false,
              //状态格式转换
              formatter: (value, column) => {     //写上formatter函数
                let payStatus = orderState(value, column);  //这里可以调用写好的函数也可以直接处理数据
                return payStatus;
              }
            },
            {
              label: "注册时间",
              prop: "createTime",
                operate: false,
              //时间格式转换
              formatter: (value, column) => {
                let time = formDatetime(value, column);
                return time;
              },
            },
             {
              prop: "dealScreenshot",   //要与上面预留的slot位置一致
              label: "收款凭证",
              operate: true,
            }
          ]
        };
      },
      watch: {},
      created() {
       
      },
      methods: {
        indexMethod(index) {
          //设置序列号
          return (
            (Number(this.formInline.startNo) - 1) *
              Number(this.formInline.pageSize) +
            index +
            1
          );
        },
        handleClick(val) {},
    
    
      }
    };
    </script>
    

    封装的js方法

    // 13位时间戳转字符串
    
    import moment from "moment";
    
    function formDatetime(row, column) {
      let date = row[column.property];
      if (date == undefined) {
        return "";
      }
      return moment(date).format("YYYY-MM-DD HH:mm:ss");
    }
    
    function formDa(row, column) {
      let date = row[column.property];
      if (date == undefined) {
        return "";
      }
      return moment(date).format("YYYY-MM-DD");
    }
    
    
    
    export {
      formDatetime,
      formDa
      
    }
    

    elementui提取table表格使用formatter方法,并增加单列展示按钮的展示效果,展示和不展示按钮的页面展示方法
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 实现了word中表格的内容(包括图片),批量导出至文本文件中
  • 图片中的表格保存到excel。 代码 with open(picture, "rb") as f: img_data = f.read() img_base64 = b64encode(img_data) cred = credential.Credential(SecretId, SecretKey) # ID和Secret从腾讯云申请 ...
  • 提取PDF表格数据

    2020-05-06 16:18:06
    利用python 中的camelot库可以提取基于文本的PDF表格数据,(注意扫描版的则不能,基于文本的是指可以在该PDF文档上选取文本,而扫描版的PDF为图像格式) 关键词read_pdf 可以读取PDF文件 plot(tables[0],kind=...
  • OpenCV-检测并提取表格

    万次阅读 多人点赞 2016-07-27 16:30:19
    检测并提取表格的方法:运用腐蚀膨胀提取横纵表格线,判断表格位置,并显示。
  • 比如图片表格提取。 总结 一开始我用传统的第一个方法,python代码实现后发现canny后是轮廓,一条横线和一条垂线有交点,交点处就变成镂空的十字架,导致线不连续。后来了解到膨胀腐蚀即可解决问题,效果更...
  • 使用神经网络提取PDF表格工具来了,支持图片,关键是能白嫖谷歌GPU资源.pdf
  • 本文主要介绍了利用腾讯云表格文字识别API提取图片表格数据并生成Excel文件。主要涉及的知识点有:腾讯云API的调用、json文件的处理以及Excel文件的生成。 背景 在工作中,各种电子文件和纸质文件满天飞,穿梭于...
  • Python使用Tabula提取PDF表格数据

    千次阅读 2019-06-05 20:25:31
    今天遇到一个批量读取pdf文件中表格数据的需求,样式大体是以下这样:...该方式从网上搜索的结果是,可以提取pdf文本数据,但是提取表格信息就乱了。所以本人没有亲自实验,就果断放弃了实验该方法。如果只是提取p...
  • python识别提取pdf表格数据

    千次阅读 2020-04-14 08:12:18
    #在第二页提取表格 table = second_page.extract_tables() for t in table: df = pd.DataFrame(t[1:],columns=t[0]) #打印 print(df) ![待识别的pdf中表格]...
  • 提取图片文字信息.zip

    2021-06-11 15:03:56
    个人开发的小工具(项目源码),主要用来提取QQ或微信聊天时发送的Excel粘贴图片,也能提取表格形式的截图(前提是每行每列都有值,不能有空,否则会有对应错乱的情况,可以自行调整),方便平时工作中使用。
  • 提取docx中图片,文字,表格元素

    千次阅读 2017-10-31 09:12:58
    话不多说,先介绍下思路,我是将word中文字,表格图片按照顺序提取出来,然后返回为一个XML的Document元素,基本上重新定义了word中xml格式,原因是xml中格式虽然采用xml元素,但是太过于复杂,对于此项目后续拓展...
  • OpenCV—Python 表格提取

    千次阅读 2019-06-17 21:03:37
    表格提取的OpenCV-python实现,思路参考https://blog.csdn.net/asiwxy/article/details/83063432 import cv2 import os import numpy as np from imutils.perspective import four_point_transform def get_img...
  • 不久前,一位开发者提供了一个名为 Camelot 的工具,使用三行代码就能从 PDF 文件中提取表格数据。 PDF 文件是一种非常常用的文件格式,通常用于正式的电子版文件。它能够很好的将不同的排版格式固定下来,形成版面...
  • 第一天实习,交给了我55个表格,要求把身份证号和序号全部粘贴到新的表格里。做了2个小时,接下来又是55个表格…于是燃起了编程的欲望。 学过一些些基础的python,于是决定用python试试。 绝对保姆级教程。适合...
  • opencv 表格识别之表格提取(一)

    万次阅读 2018-10-15 21:17:50
    我们在对表格进行提取之前,要先对扫描进来的表格进行矫正,由于我做的项目的原因,所需要的处理的表格全都是扫描版的,所以不会出现前文表格线是弯曲的情况,所以表格矫正的方法比较简单。 请参考:...
  • 实现功能:从word文档中提取图片表格,并用html代码替换,将处理后的word 文档存放到一个html文档中  /*  * 实现步骤:1、源word另存为html。可以得到图片和html文件。  * 2、从html文件中提取出table,...
  • python camelot pdf表格提取

    千次阅读 2020-03-02 14:48:45
    camelot 是一个通过图像分割提取表格的函数库,有强大的pdf表格提取功能,擅长于提取不规则表格,非结构性表格(例如通过颜色进行表格分割)有着显著的效果 正文 解决安装问题 安装camelot 后,camelot.read_pdf...
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料、代码以及交流解答点击...
  • 最近开发了一个windows桌面应用程序,主要实现的功能包括:发票查验(电子发票、扫描发票、扫码枪读取、专票、图片识别),PDF表格提取、财报数据整理等,软件界面如下: 软件下载地址:办公助手 软件使用说明:...
  • 如下小程序为使用python+opencv将表格图片,按照表格进行分割,并识别分割后的子图片中的文字,希望对需要的小伙伴有一些些帮助。具体的实现见如下代码。 # -*- coding: utf-8 -*- Created on Tue May 28 19:23:19...
  • 有时为了方便我们一般会通过截图快速进行信息传送,但查看虽然方便但修改起来就比较复杂,比如有些图片中的内容是表格数据,如果用Excel汇总计算就比较快,那么如何将手机图片中的表格导出来呢? 目前有一些工具可以...
  • pdfplumber 提取 PDF 文本及表格

    千次阅读 2019-05-05 16:49:43
    pdfplumber-0.5.12,适用于python 2.7、3.5、3.6. ...一、安装 pip install pdfplumber 二、使用 提取文本:pdf.page[0].extract_text() 提取表格:pdf.page[0].extract_tables() 提取文字与表格(去除空格),分...
  • 以NBA 2020-2021 常规赛数据作为范例,pdf表格如下: 第一步:使用pdfplumber提取表格文本 # 导入pdfplumber import pdfplumber # 读取pdf文件,保存为pdf实例 pdf = pdfplumber.open("E:\\nba.pdf") # 访问...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,133
精华内容 10,053
关键字:

如何提取图片表格