json解析练习,python图像处理练习,表格包围框毛刺问题待解决。

 # -*- coding: utf-8 -*-
# coding: utf-8
from PIL import Image, ImageDraw
import cv2
import os
import csv
import json
color = {
0: [255, 0, 0],
1: [0, 255, 0],
2: [0, 0, 255]
}
from PIL import Image
import numpy as np # 取批量点取RGB众数,来推算背景色值
def publicnum(num, d=0):
dictnum = {}
for i in range(len(num)):
if str(num[i]) in dictnum.keys():
dictnum[str(num[i])] += 1
else:
dictnum.setdefault(str(num[i]), 1)
maxnum = 0
maxkey = '[255 255 255]'
for k, v in dictnum.items():
if v >= maxnum:
maxnum = v
maxkey = k
return maxkey page_img_dir = "JPG"
output_dir = "年报_PDF_TABLE_JPG_eliminate_lines-5-15-final" isExists = os.path.exists(output_dir)
if not isExists:
os.makedirs(output_dir)
csv_file = csv.reader(open('表格结构标注-带线年报_UTF-8.csv', 'r', encoding="gbk"))
data_list = []
for data in csv_file:
data_list.append(data) print("page number: ", len(data_list) - 1) for data in data_list[1:]: # 跳过第一行
img_path = data[0]
img_name = img_path.split('/')[-1] # /分割后最后一个为名字
pdf_name = img_name.split('_')[0] # -分割后 第一个是名字
local_img_path = os.path.join(page_img_dir, img_name) # 拼接路径
print(local_img_path)
annotation = json.loads(data[2]) # json单元格读取
objects = annotation['objects'] # object是一个列表,读取该列表
cnt = 0
tu = Image.open(local_img_path)
page_img = np.array(tu)
for page_object in objects:
if 'cur' in page_object.keys():
cur = page_object['cur']
else:
cur = cnt
polygon = page_object['polygon']['ptList']
x_list = [p['x'] for p in polygon]
y_list = [p['y'] for p in polygon]
x_min = min(x_list)
x_max = max(x_list)
y_min = min(y_list)
y_max = max(y_list)
if abs(x_max - x_min) < 20: # 纵向线条
xx = int((x_min + x_max) / 2)
inline_y_list = [y_max+20, y_min]
#寻找相交横线分割点
for in_page_object in objects:
in_polygon = in_page_object['polygon']['ptList']
in_x_list = [in_p['x'] for in_p in in_polygon]
in_y_list = [in_p['y'] for in_p in in_polygon]
in_x_min = min(in_x_list)
in_x_max = max(in_x_list)
in_y_min = min(in_y_list)
in_y_max = max(in_y_list)
if in_y_max - in_y_min < 20: # 判断为横线
if in_x_max+5 >= xx and in_x_min-5 <= xx: # 判断相交
point_y = in_y_min
inline_y_list.append(point_y)
if 0<abs(y_max-point_y)< 10:
try:
inline_y_list.remove(max(y_max+20, point_y))
inline_y_list.append(min(y_max+20, point_y))
except:
pass
elif 0 < abs(y_min-point_y) < 10:
try:
inline_y_list.remove(min(y_min, point_y))
inline_y_list.append(max(y_min, point_y))
except:
pass
inline_y_list = list({}.fromkeys(inline_y_list).keys())
inline_y_list.sort()
inline_y_list[-1]+=5
if inline_y_list[-1]>2339:
inline_y_list[-1]=2339
# 线条分割结束
for i in range(0, inline_y_list.__len__()):
if i < inline_y_list.__len__() - 1:
# 开始取样
back_colors = []
for yy in range(inline_y_list[i], inline_y_list[i + 1]):
if xx + 8 < 1654:
back_colors.append(page_img[yy, xx + 8])
else:
back_colors.append(page_img[yy, xx - 8])
back_color = publicnum(back_colors)
back_color = back_color[1:-1]
try:
back_color = back_color.split(' ')
except:
back_color = back_color.split(' ')
print(type(back_color))
if len(back_color) > 3:
back_color = list(filter(None, back_color))
# 取样结束
# 纵向填色 for yy in range(inline_y_list[i]-4, inline_y_list[i + 1]-4):
if y_min-20<inline_y_list[i]<y_max+20 :
for ranging in range(-4, x_max-x_min+5):
if x_min+ranging < 1654 and x_min+ranging >= 0:
page_img[yy, x_min + ranging] = back_color
else:
pass
else:
pass
elif abs(y_max - y_min) < 20: # 横向线条
yy = int((y_min + y_max) / 2)
inline_x_list = [x_max+20, x_min]
# 寻找相交横线分割点
for in_page_object2 in objects:
polygon2 = in_page_object2['polygon']['ptList']
in_x_list2 = [p['x'] for p in polygon2]
in_y_list2 = [p['y'] for p in polygon2]
in_x_min = min(in_x_list2)
in_x_max = max(in_x_list2)
in_y_min = min(in_y_list2)
in_y_max = max(in_y_list2)
if abs(in_x_max - in_x_min) < 20: # 判断为纵线
if in_y_max+5 >= y_min and in_y_min-5 <= y_max: # 判断相交
point_x = in_x_min
inline_x_list.append(point_x)
if 0<abs(x_max-point_x)<10:
try:
inline_x_list.remove(max(x_max+20, point_x))
inline_x_list.append(min(x_max+20, point_x))
except:
pass
elif 0<abs(x_min-point_x)<10:
try:
inline_x_list.remove(min(x_min, point_x))
inline_x_list.append(max(x_min, point_x))
except:
pass
else:
pass
inline_x_list = list({}.fromkeys(inline_x_list).keys())
inline_x_list.sort()
#inline_x_list[-1]+=5
# 线条分割结束
for i in range(0, inline_x_list.__len__()):
if i < inline_x_list.__len__() - 1:
# 开始取样
back_colors = []
for xx in range(inline_x_list[i], inline_x_list[i + 1]):
if yy+8 < 2339:
back_colors.append(page_img[yy + 8, xx])
else:
back_colors.append(page_img[yy - 8, xx])
back_color = publicnum(back_colors)
back_color = back_color[1:-1]
try:
back_color = back_color.split(' ')
except:
back_color = back_color.split(' ') if len(back_color) > 3:
back_color = list(filter(None, back_color))
# 取样结束
# 横线填色
for xx in range(inline_x_list[i]-4, inline_x_list[i + 1]-4):
if x_min-20<inline_x_list[i]<x_max+20:
for ranging in range(-4, y_max-y_min+5):
if y_min+ranging < 2339 and y_min+ranging >= 0:
page_img[y_min+ranging, xx] = back_color
elif y_min+ranging>=2339:
page_img[2338, xx] = back_color
else:
page_img[0, xx] = back_color
else:
pass
else:
print("no such line", 'x_min:', x_min,'x_max:', x_max, 'y_max:', y_max, 'y_min:', y_min)
tu = Image.fromarray(page_img.astype('uint8'))
output_path = os.path.join(output_dir, img_name.split('.')[0] + '_' + str(cur) + ".jpg")
tu.save(output_path)
cv2.imwrite(output_path, page_img)
cnt += 1

带线表格据gt生成无线表格的更多相关文章

  1. 使用Aspose插件将程序中的表格,导出生成excel表格

    http://www.cnblogs.com/lanyue52011/p/3372452.html这个是原文地址 /// <summary> /// 点击按钮,将内存表导出excel表格! ...

  2. MVC 生成PDf表格并插入图片

    最近做的项目中有一个功能,将最终的个人信息生成PDF表格,并插入图片.对于没接触过的程序员来说回一片茫然,网上有多种生成PDf的方法,我给大家介绍一下我认为比较简单,好操作的一种. iTextShar ...

  3. 通过javascript实现1~100内能同时被2和3整除的数并生成如下表格

    请通过javascript实现1~100内能同时被2和3整除的数并生成如下表格: <!DOCTYPE html><html lang="en"><he ...

  4. 将Highcharts图表数据生成Table表格

    有的时候,我们不仅仅需要漂亮的统计图来显示统计结果,还需要在统计图下方一个表格可以更加直观的展现各类数据.既然统计图都显示出来了,那我们可以根据统计图的各元素生成表格了. 首先,先显示统计图. Htm ...

  5. 生成带有表格的word附件和动态赋值

    生成带有表格的word附件和动态赋值, 表格前后需要添加一个特殊的开始和结束的域,表格第一列 TableStart:AuditJdcttbzInfo 和表格的最后一列 TableEnd:AuditJd ...

  6. jQuery动态生成Bootstrap表格

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  7. python生成html表格

    最近做一个小工具,需要将统计数据生成html表格.在网上搜罗一圈后发现用pandas生成表格非常好用.代码如下: import pandas as pd def convertToHtml(resul ...

  8. H5纯前端生成Excel表格

    H5纯前端生成Excel表格方法如下: <!DOCTYPE html> <html> <head> <title></title> < ...

  9. 编辑表格输入内容、根据input输入框输入数字动态生成表格行数、编辑表格内容提交传给后台数据处理

    编辑表格输入内容.根据input输入框输入数字动态生成表格行数.编辑表格内容提交传给后台数据处理 记录自己学习做的东西,写的小demo,希望对大家也有帮助! 代码如下: <!DOCTYPE ht ...

随机推荐

  1. HDU1664 BFS + 数论 + 剪枝

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1664 , 一道比较蛋疼的搜索题. 这道题有很多坑点,一点处理不好就要TLE. 题意很简单,就是找到一个 ...

  2. Tarjan在图论中的应用(二)——用Tarjan来求割点与割边

    前言:\(Tarjan\) 求割点和割边建立在 \(Tarjan\)算法的基础之上,因此建议在看这篇博客之前先去学一学\(Tarjan\). 回顾\(Tarjan\)中各个数组的定义 首先,我们来回顾 ...

  3. Windows环境下在Oracle VM VirtualBOX下克隆虚拟机镜像(克隆和导入)

    Windows环境下在Oracle VM VirtualBOX下克隆虚拟机镜像: 注:直接复制一个.vdi 虚拟硬盘再挂上去就可以,但Virtualbox居然提示UUID重复,无法使用. 则,可以通过 ...

  4. js数据结构处理--------扁平化数组处理为树结构数据

    将扁平化的数组处理为树结构数据,我们可以利用对象来处理,对象的复制是浅拷贝,指向相同的内存地址: var arr = [ { id: 0, pid: -1, name: 'sadas' }, { id ...

  5. android设备局域网中快速搜索之cling方式

    cling方式就像pc端windows局域网工作组刷新显示一样,原来用过扫描ip地址的方式,可以使用就是有点慢,还有一种自己加入组广播,通过发送组广播的方式.   android设备局域网中快速搜索之 ...

  6. Bootstrap历练实例:响应式标签页

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. display:inline-block解决文字有间隙问题

    定义:display:inline-block是使元素以块级元素的形式呈现在行内.意思就是说,让这个元素显示在同一行不换行,但是又可以控制高度和宽度,这相当于内联元素的增强. 但是display:in ...

  8. HH的项链题解(离线思想+链表+树状数组)

    本人第一篇博客重磅推出!!! 希望各位朋友以后多多捧场也多给写意见(我个人喜欢把题解写得啰嗦一点,因为这样方便理解,各位巨佬勿喷) 来讲一道提高+/省选-的骚题:HH的项链(这个HH你理解成皇后呵呵哈 ...

  9. 1061: [Noi2008]志愿者招募

    Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 5742  Solved: 3449[Submit][Status][Discuss] Descript ...

  10. Java代码随机生成图片验证码

    package com.rchm.util.images; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2 ...