mirror of
https://github.com/qurator-spk/eynollah.git
synced 2025-07-11 11:59:54 +02:00
fixed #40 and separators are also written in xml
This commit is contained in:
parent
fce7cdfd8b
commit
43c9302390
2 changed files with 58 additions and 29 deletions
|
@ -646,10 +646,13 @@ class Eynollah:
|
||||||
_, thresh = cv2.threshold(imgray, 0, 255, 0)
|
_, thresh = cv2.threshold(imgray, 0, 255, 0)
|
||||||
thresh = cv2.dilate(thresh, KERNEL, iterations=3)
|
thresh = cv2.dilate(thresh, KERNEL, iterations=3)
|
||||||
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
||||||
cnt_size = np.array([cv2.contourArea(contours[j]) for j in range(len(contours))])
|
if len(contours)>0:
|
||||||
cnt = contours[np.argmax(cnt_size)]
|
cnt_size = np.array([cv2.contourArea(contours[j]) for j in range(len(contours))])
|
||||||
x, y, w, h = cv2.boundingRect(cnt)
|
cnt = contours[np.argmax(cnt_size)]
|
||||||
box = [x, y, w, h]
|
x, y, w, h = cv2.boundingRect(cnt)
|
||||||
|
box = [x, y, w, h]
|
||||||
|
else:
|
||||||
|
box = [0, 0, img.shape[1], img.shape[0]]
|
||||||
croped_page, page_coord = crop_image_inside_box(box, img)
|
croped_page, page_coord = crop_image_inside_box(box, img)
|
||||||
session_page.close()
|
session_page.close()
|
||||||
del model_page
|
del model_page
|
||||||
|
@ -669,21 +672,25 @@ class Eynollah:
|
||||||
_, thresh = cv2.threshold(imgray, 0, 255, 0)
|
_, thresh = cv2.threshold(imgray, 0, 255, 0)
|
||||||
thresh = cv2.dilate(thresh, KERNEL, iterations=3)
|
thresh = cv2.dilate(thresh, KERNEL, iterations=3)
|
||||||
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
||||||
cnt_size = np.array([cv2.contourArea(contours[j]) for j in range(len(contours))])
|
|
||||||
cnt = contours[np.argmax(cnt_size)]
|
if len(contours)>0:
|
||||||
x, y, w, h = cv2.boundingRect(cnt)
|
cnt_size = np.array([cv2.contourArea(contours[j]) for j in range(len(contours))])
|
||||||
if x <= 30:
|
cnt = contours[np.argmax(cnt_size)]
|
||||||
w += x
|
x, y, w, h = cv2.boundingRect(cnt)
|
||||||
x = 0
|
if x <= 30:
|
||||||
if (self.image.shape[1] - (x + w)) <= 30:
|
w += x
|
||||||
w = w + (self.image.shape[1] - (x + w))
|
x = 0
|
||||||
if y <= 30:
|
if (self.image.shape[1] - (x + w)) <= 30:
|
||||||
h = h + y
|
w = w + (self.image.shape[1] - (x + w))
|
||||||
y = 0
|
if y <= 30:
|
||||||
if (self.image.shape[0] - (y + h)) <= 30:
|
h = h + y
|
||||||
h = h + (self.image.shape[0] - (y + h))
|
y = 0
|
||||||
|
if (self.image.shape[0] - (y + h)) <= 30:
|
||||||
|
h = h + (self.image.shape[0] - (y + h))
|
||||||
|
|
||||||
box = [x, y, w, h]
|
box = [x, y, w, h]
|
||||||
|
else:
|
||||||
|
box = [0, 0, img.shape[1], img.shape[0]]
|
||||||
croped_page, page_coord = crop_image_inside_box(box, self.image)
|
croped_page, page_coord = crop_image_inside_box(box, self.image)
|
||||||
cont_page.append(np.array([[page_coord[2], page_coord[0]], [page_coord[3], page_coord[0]], [page_coord[3], page_coord[1]], [page_coord[2], page_coord[1]]]))
|
cont_page.append(np.array([[page_coord[2], page_coord[0]], [page_coord[3], page_coord[0]], [page_coord[3], page_coord[1]], [page_coord[2], page_coord[1]]]))
|
||||||
session_page.close()
|
session_page.close()
|
||||||
|
@ -1253,6 +1260,11 @@ class Eynollah:
|
||||||
|
|
||||||
mask_texts_only=(prediction_regions_org[:,:]==1)*1
|
mask_texts_only=(prediction_regions_org[:,:]==1)*1
|
||||||
mask_images_only=(prediction_regions_org[:,:]==2)*1
|
mask_images_only=(prediction_regions_org[:,:]==2)*1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
polygons_lines_xml, hir_lines_xml = return_contours_of_image(mask_lines_only)
|
||||||
|
polygons_lines_xml = textline_con_fil = filter_contours_area_of_image(mask_lines_only, polygons_lines_xml, hir_lines_xml, max_area=1, min_area=0.00001)
|
||||||
|
|
||||||
polygons_of_only_texts = return_contours_of_interested_region(mask_texts_only, 1, 0.00001)
|
polygons_of_only_texts = return_contours_of_interested_region(mask_texts_only, 1, 0.00001)
|
||||||
polygons_of_only_lines = return_contours_of_interested_region(mask_lines_only, 1, 0.00001)
|
polygons_of_only_lines = return_contours_of_interested_region(mask_lines_only, 1, 0.00001)
|
||||||
|
@ -1266,7 +1278,7 @@ class Eynollah:
|
||||||
|
|
||||||
|
|
||||||
K.clear_session()
|
K.clear_session()
|
||||||
return text_regions_p_true, erosion_hurts
|
return text_regions_p_true, erosion_hurts, polygons_lines_xml
|
||||||
except:
|
except:
|
||||||
|
|
||||||
if self.input_binary:
|
if self.input_binary:
|
||||||
|
@ -1337,7 +1349,10 @@ class Eynollah:
|
||||||
|
|
||||||
mask_images_only=(prediction_regions_org[:,:] ==2)*1
|
mask_images_only=(prediction_regions_org[:,:] ==2)*1
|
||||||
|
|
||||||
|
polygons_lines_xml, hir_lines_xml = return_contours_of_image(mask_lines_only)
|
||||||
|
polygons_lines_xml = textline_con_fil = filter_contours_area_of_image(mask_lines_only, polygons_lines_xml, hir_lines_xml, max_area=1, min_area=0.00001)
|
||||||
|
|
||||||
|
|
||||||
polygons_of_only_texts = return_contours_of_interested_region(mask_texts_only,1,0.00001)
|
polygons_of_only_texts = return_contours_of_interested_region(mask_texts_only,1,0.00001)
|
||||||
|
|
||||||
polygons_of_only_lines = return_contours_of_interested_region(mask_lines_only,1,0.00001)
|
polygons_of_only_lines = return_contours_of_interested_region(mask_lines_only,1,0.00001)
|
||||||
|
@ -1353,7 +1368,7 @@ class Eynollah:
|
||||||
|
|
||||||
erosion_hurts = True
|
erosion_hurts = True
|
||||||
K.clear_session()
|
K.clear_session()
|
||||||
return text_regions_p_true, erosion_hurts
|
return text_regions_p_true, erosion_hurts, polygons_lines_xml
|
||||||
|
|
||||||
def do_order_of_regions_full_layout(self, contours_only_text_parent, contours_only_text_parent_h, boxes, textline_mask_tot):
|
def do_order_of_regions_full_layout(self, contours_only_text_parent, contours_only_text_parent_h, boxes, textline_mask_tot):
|
||||||
self.logger.debug("enter do_order_of_regions_full_layout")
|
self.logger.debug("enter do_order_of_regions_full_layout")
|
||||||
|
@ -1829,7 +1844,7 @@ class Eynollah:
|
||||||
self.logger.info("Enhancing took %ss ", str(time.time() - t0))
|
self.logger.info("Enhancing took %ss ", str(time.time() - t0))
|
||||||
|
|
||||||
t1 = time.time()
|
t1 = time.time()
|
||||||
text_regions_p_1 ,erosion_hurts = self.get_regions_from_xy_2models(img_res, is_image_enhanced, num_col_classifier)
|
text_regions_p_1 ,erosion_hurts, polygons_lines_xml = self.get_regions_from_xy_2models(img_res, is_image_enhanced, num_col_classifier)
|
||||||
self.logger.info("Textregion detection took %ss ", str(time.time() - t1))
|
self.logger.info("Textregion detection took %ss ", str(time.time() - t1))
|
||||||
|
|
||||||
t1 = time.time()
|
t1 = time.time()
|
||||||
|
@ -1840,7 +1855,7 @@ class Eynollah:
|
||||||
|
|
||||||
if not num_col:
|
if not num_col:
|
||||||
self.logger.info("No columns detected, outputting an empty PAGE-XML")
|
self.logger.info("No columns detected, outputting an empty PAGE-XML")
|
||||||
pcgts = self.writer.build_pagexml_no_full_layout([], page_coord, [], [], [], [], [], [], [], [], [], [], cont_page)
|
pcgts = self.writer.build_pagexml_no_full_layout([], page_coord, [], [], [], [], [], [], [], [], [], [], cont_page, [])
|
||||||
self.logger.info("Job done in %ss", str(time.time() - t1))
|
self.logger.info("Job done in %ss", str(time.time() - t1))
|
||||||
return pcgts
|
return pcgts
|
||||||
|
|
||||||
|
@ -2056,7 +2071,7 @@ class Eynollah:
|
||||||
else:
|
else:
|
||||||
order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered, boxes_d, textline_mask_tot_d)
|
order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered, boxes_d, textline_mask_tot_d)
|
||||||
|
|
||||||
pcgts = self.writer.build_pagexml_full_layout(contours_only_text_parent, contours_only_text_parent_h, page_coord, order_text_new, id_of_texts_tot, all_found_texline_polygons, all_found_texline_polygons_h, all_box_coord, all_box_coord_h, polygons_of_images, polygons_of_tabels, polygons_of_drop_capitals, polygons_of_marginals, all_found_texline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page)
|
pcgts = self.writer.build_pagexml_full_layout(contours_only_text_parent, contours_only_text_parent_h, page_coord, order_text_new, id_of_texts_tot, all_found_texline_polygons, all_found_texline_polygons_h, all_box_coord, all_box_coord_h, polygons_of_images, polygons_of_tabels, polygons_of_drop_capitals, polygons_of_marginals, all_found_texline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_xml)
|
||||||
self.logger.info("Job done in %ss", str(time.time() - t0))
|
self.logger.info("Job done in %ss", str(time.time() - t0))
|
||||||
return pcgts
|
return pcgts
|
||||||
else:
|
else:
|
||||||
|
@ -2066,6 +2081,6 @@ class Eynollah:
|
||||||
else:
|
else:
|
||||||
contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered)[index_by_text_par_con])
|
contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered)[index_by_text_par_con])
|
||||||
order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent_d_ordered, contours_only_text_parent_h, boxes_d, textline_mask_tot_d)
|
order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent_d_ordered, contours_only_text_parent_h, boxes_d, textline_mask_tot_d)
|
||||||
pcgts = self.writer.build_pagexml_no_full_layout(txt_con_org, page_coord, order_text_new, id_of_texts_tot, all_found_texline_polygons, all_box_coord, polygons_of_images, polygons_of_marginals, all_found_texline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page)
|
pcgts = self.writer.build_pagexml_no_full_layout(txt_con_org, page_coord, order_text_new, id_of_texts_tot, all_found_texline_polygons, all_box_coord, polygons_of_images, polygons_of_marginals, all_found_texline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_xml)
|
||||||
self.logger.info("Job done in %ss", str(time.time() - t0))
|
self.logger.info("Job done in %ss", str(time.time() - t0))
|
||||||
return pcgts
|
return pcgts
|
||||||
|
|
|
@ -16,7 +16,7 @@ from ocrd_models.ocrd_page import (
|
||||||
TextRegionType,
|
TextRegionType,
|
||||||
ImageRegionType,
|
ImageRegionType,
|
||||||
TableRegionType,
|
TableRegionType,
|
||||||
|
SeparatorRegionType,
|
||||||
to_xml
|
to_xml
|
||||||
)
|
)
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
@ -141,7 +141,7 @@ class EynollahXmlWriter():
|
||||||
with open(out_fname, 'w') as f:
|
with open(out_fname, 'w') as f:
|
||||||
f.write(to_xml(pcgts))
|
f.write(to_xml(pcgts))
|
||||||
|
|
||||||
def build_pagexml_no_full_layout(self, found_polygons_text_region, page_coord, order_of_texts, id_of_texts, all_found_texline_polygons, all_box_coord, found_polygons_text_region_img, found_polygons_marginals, all_found_texline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page):
|
def build_pagexml_no_full_layout(self, found_polygons_text_region, page_coord, order_of_texts, id_of_texts, all_found_texline_polygons, all_box_coord, found_polygons_text_region_img, found_polygons_marginals, all_found_texline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_to_be_written_in_xml):
|
||||||
self.logger.debug('enter build_pagexml_no_full_layout')
|
self.logger.debug('enter build_pagexml_no_full_layout')
|
||||||
|
|
||||||
# create the file structure
|
# create the file structure
|
||||||
|
@ -178,10 +178,21 @@ class EynollahXmlWriter():
|
||||||
points_co += str(int((found_polygons_text_region_img[mm][lmm,0,1] + page_coord[0]) / self.scale_y))
|
points_co += str(int((found_polygons_text_region_img[mm][lmm,0,1] + page_coord[0]) / self.scale_y))
|
||||||
points_co += ' '
|
points_co += ' '
|
||||||
img_region.get_Coords().set_points(points_co[:-1])
|
img_region.get_Coords().set_points(points_co[:-1])
|
||||||
|
|
||||||
|
for mm in range(len(polygons_lines_to_be_written_in_xml)):
|
||||||
|
sep_hor = SeparatorRegionType(id=counter.next_region_id, Coords=CoordsType())
|
||||||
|
page.add_SeparatorRegion(sep_hor)
|
||||||
|
points_co = ''
|
||||||
|
for lmm in range(len(polygons_lines_to_be_written_in_xml[mm])):
|
||||||
|
points_co += str(int((polygons_lines_to_be_written_in_xml[mm][lmm,0,0] ) / self.scale_x))
|
||||||
|
points_co += ','
|
||||||
|
points_co += str(int((polygons_lines_to_be_written_in_xml[mm][lmm,0,1] ) / self.scale_y))
|
||||||
|
points_co += ' '
|
||||||
|
sep_hor.get_Coords().set_points(points_co[:-1])
|
||||||
|
|
||||||
return pcgts
|
return pcgts
|
||||||
|
|
||||||
def build_pagexml_full_layout(self, found_polygons_text_region, found_polygons_text_region_h, page_coord, order_of_texts, id_of_texts, all_found_texline_polygons, all_found_texline_polygons_h, all_box_coord, all_box_coord_h, found_polygons_text_region_img, found_polygons_tables, found_polygons_drop_capitals, found_polygons_marginals, all_found_texline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page):
|
def build_pagexml_full_layout(self, found_polygons_text_region, found_polygons_text_region_h, page_coord, order_of_texts, id_of_texts, all_found_texline_polygons, all_found_texline_polygons_h, all_box_coord, all_box_coord_h, found_polygons_text_region_img, found_polygons_tables, found_polygons_drop_capitals, found_polygons_marginals, all_found_texline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_to_be_written_in_xml):
|
||||||
self.logger.debug('enter build_pagexml_full_layout')
|
self.logger.debug('enter build_pagexml_full_layout')
|
||||||
|
|
||||||
# create the file structure
|
# create the file structure
|
||||||
|
@ -223,7 +234,10 @@ class EynollahXmlWriter():
|
||||||
|
|
||||||
for mm in range(len(found_polygons_text_region_img)):
|
for mm in range(len(found_polygons_text_region_img)):
|
||||||
page.add_ImageRegion(ImageRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region_img[mm], page_coord))))
|
page.add_ImageRegion(ImageRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region_img[mm], page_coord))))
|
||||||
|
|
||||||
|
for mm in range(len(polygons_lines_to_be_written_in_xml)):
|
||||||
|
page.add_SeparatorRegion(ImageRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(polygons_lines_to_be_written_in_xml[mm], [0 , 0, 0, 0]))))
|
||||||
|
|
||||||
for mm in range(len(found_polygons_tables)):
|
for mm in range(len(found_polygons_tables)):
|
||||||
page.add_TableRegion(TableRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_tables[mm], page_coord))))
|
page.add_TableRegion(TableRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_tables[mm], page_coord))))
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue