基于视觉识别的民主测评表统计(图片转表格)

图1 测评表图片

图2 测评表图片识别效果

问题背景:

        党务工作中进行民主测评时,往往需要在正式的场合分发纸质的民主测评表,让单位人员在相应的位置打√,表格的样式往往与如下图例相似(图片来源于互联网,数据纯属虚构,用“√”模拟手写的对钩)。由于民主测评程序的敏感性,单位往往要求用纸质版表格统计,当测评人数较多时,会给统计带来很大的难度,相应的繁琐重复的工作和公差就不可避免。

目的:

        为了让单位人员不为繁务所累,以更多精力投入主责主业,本文旨在通过视觉识别技术提取纸质表格的数据,得到可编辑的excel表格数据,从而方便统计。

方案及取舍:

        要从表格图像中提取可编辑的表格数据,可以考虑以下方案:

1. 专用工具和软件:

       使用WPS等工具将PDF或图像转换为可编辑的格式。优点:大多数用户来说较易获取,且识别效果非常好,甚至可以识别出合并单元格;缺点:需要开通会员。

2. 在线服务:

        使用在线转换工具,如白描docsmall将表格图像转换为Excel格式。优点:方便快捷;缺点:1.有的需要开通会员,2.不能批量处理表格图像,3.不是本地处理图片,涉及图片信息安全。

3. 定制脚本和工具:

        编写Python脚本结合OpenCV和Pandas库,自定义处理和解析表格图像。优点:可根据需要自定义算法,自动化得到想要的统计数据,2.可以实现本地处理图片;缺点:1.实现表格识别的过程很难,对编程要求高;2.识别效果不理想;3.如果去github上找,有翻墙风险且对汉语用户不友好。

4. 商业API:

        使用如“百度智能云”或“腾讯云”或者“阿里云”等商业服务提供的API。优点:1.识别模型成熟,识别效果好,2.可以结合python实现自动化统计和表格批量处理;缺点:1.需要个人信息注册,从而领取免费额度。2.图片不是在本地处理,涉及信息安全,但是如果是选择百度、腾讯、阿里这些国内知名公司,隐私一般能得到保护。

        综合以上方案,本文选择第四个方案,选取“百度智能云”的表格文字识别V2,如图所示,免费额度为500次/月,对于民主测评的周期来说完全足够了。

实现步骤:

1.登录“百度智能云icon-default.png?t=O83Ahttps://console.bce.baidu.com/ai/#/ai/ocr/overview/resource/list

2.创建应用

3.全选文字识别接口

4.获取API_KEY 和SECRET_KEY

5.将自己的API_KEY 和SECRET_KEY、图片和表格的地址,填入以下python代码相应位置后运行

代码:

import base64
import urllib
import requests
import pandas as pd

API_KEY = "你的api key"
SECRET_KEY = "你的secret key"

def main():
    access_token = get_access_token()
    url = "https://aip.baidubce.com/rest/2.0/ocr/v1/table?access_token=" + access_token

    # 使用 get_file_content_as_base64 方法获取图像的 base64 编码
    encoded_image = get_file_content_as_base64("你的图片地址", True)
    payload = f'image={encoded_image}&cell_contents=false&return_excel=false'
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    
    if response.ok:
        response_data = response.json()
        extract_table_data(response_data)
    else:
        print("请求失败:", response.text)

def get_file_content_as_base64(path, urlencoded=False):
    """
    获取文件 base64 编码
    :param path: 文件路径
    :param urlencoded: 是否对结果进行 URL 编码
    :return: base64 编码信息
    """
    with open(path, "rb") as f:
        content = base64.b64encode(f.read()).decode("utf8")
        if urlencoded:
            content = urllib.parse.quote_plus(content)
    return content

def get_access_token():
    """
    使用 AK,SK 生成鉴权签名(Access Token)
    :return: access_token,或是 None (如果错误)
    """
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
    return str(requests.post(url, params=params).json().get("access_token"))

def extract_table_data(response):
    tables = response.get('tables_result', [])
    if not tables:
        print("没有找到表格数据")
        return

    for index, table in enumerate(tables):
        body = table.get('body', [])
        max_col = max(cell['col_end'] for cell in body) + 1
        max_row = max(cell['row_end'] for cell in body) + 1
        
        # 创建一个空的 DataFrame
        df = pd.DataFrame(index=range(max_row), columns=range(max_col))
        
        # 填充 DataFrame
        for cell in body:
            word = cell.get('words', '')
            row_start = cell['row_start']
            col_start = cell['col_start']
            df.iloc[row_start, col_start] = word

        # 将 DataFrame 保存到 Excel 文件
        output_filename = f'D:/桌面/输出表格1_{index+1}.xlsx'
        df.to_excel(output_filename, index=False)
        print(f"表格数据已保存到 {output_filename}")

if __name__ == '__main__':
    main()

以上代码目前仅实现了将图片信息转换成可编辑的表格信息,读者可以自己通过添加python代码自动化获取需要统计的信息。博主后续也会更新添加统计功能后的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值