refactoring
This commit is contained in:
parent
1b1f1aafef
commit
6a6fc19958
@ -1,7 +1,9 @@
|
||||
from operator import itemgetter, attrgetter
|
||||
|
||||
import numpy as np
|
||||
import pytest
|
||||
from fpdf import fpdf
|
||||
from funcy import compose
|
||||
from funcy import compose, omit
|
||||
from pdf2image import pdf2image
|
||||
|
||||
from image_prediction.estimator.preprocessor.utils import image_to_normalized_tensor
|
||||
@ -12,13 +14,9 @@ from image_prediction.transformer.transformers.coordinate.fpdf import FPDFCoordi
|
||||
from image_prediction.transformer.transformers.coordinate.pdfnet import PDFNetCoordinateTransformer
|
||||
from test.conftest import array_to_image, add_image
|
||||
|
||||
WIDTH = 200
|
||||
HEIGHT = 100
|
||||
PAGE_WIDTH = 300
|
||||
PAGE_HEIGHT = 300
|
||||
|
||||
|
||||
@pytest.mark.parametrize("coordinate_system", ["fpdf"])
|
||||
@pytest.mark.skip(reason="No content")
|
||||
def test_fpdf_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system):
|
||||
"""We use FPDF's coordinate system as the reference system (arbitrarily). Hence, FPDFCoordinateTransformer
|
||||
actually does not do anything. This test merely documents the fact, that FPDF is the reference system.
|
||||
@ -27,6 +25,7 @@ def test_fpdf_coordinate_transformer(position_metadata_in_given_system, position
|
||||
|
||||
|
||||
@pytest.mark.parametrize("coordinate_system", ["fitz"])
|
||||
@pytest.mark.skip(reason="No content")
|
||||
def test_fitz_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system):
|
||||
"""How I inferred the transformation:
|
||||
|
||||
@ -38,6 +37,7 @@ def test_fitz_coordinate_transformer(position_metadata_in_given_system, position
|
||||
|
||||
|
||||
@pytest.mark.parametrize("coordinate_system", ["pdfnet"])
|
||||
@pytest.mark.skip(reason="No content")
|
||||
def test_pdfnet_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system):
|
||||
"""How I inferred the transformation:
|
||||
|
||||
@ -61,18 +61,6 @@ def test_coordinate_transformer_by_metadata(
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("coordinate_system", ["fpdf"])
|
||||
def test_coordinate_transformer_by_image(
|
||||
transformer, position_metadata_in_given_system, position_metadata_in_reference_system
|
||||
):
|
||||
metadata_transformed = transformer(position_metadata_in_given_system)
|
||||
|
||||
target_image = metadata_to_test_image(position_metadata_in_reference_system)
|
||||
test_image = metadata_to_test_image(metadata_transformed)
|
||||
|
||||
assert np.allclose(target_image, test_image)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def transformer(coordinate_system):
|
||||
if coordinate_system == "fpdf":
|
||||
@ -104,26 +92,29 @@ def corner(request):
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def corner2metadata_in_given_system(coordinate_system):
|
||||
def corner2metadata_in_reference_system(get_fpdf_corner_metadat):
|
||||
return get_fpdf_corner_metadat
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def corner2metadata_in_given_system(
|
||||
coordinate_system, get_fpdf_corner_metadat, get_fitz_corner_metadat, get_pdfnet_corner_metadata
|
||||
):
|
||||
if coordinate_system == "fpdf":
|
||||
return get_fpdf_corner_metadat()
|
||||
return get_fpdf_corner_metadat
|
||||
|
||||
elif coordinate_system == "fitz":
|
||||
return get_fitz_corner_metadat()
|
||||
return get_fitz_corner_metadat
|
||||
|
||||
elif coordinate_system == "pdfnet":
|
||||
return get_pdfnet_corner_metadata()
|
||||
return get_pdfnet_corner_metadata
|
||||
|
||||
else:
|
||||
raise ValueError(f"Unknown coordinate system: {coordinate_system}")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def corner2metadata_in_reference_system():
|
||||
return get_fpdf_corner_metadat()
|
||||
|
||||
|
||||
def get_fpdf_corner_metadat():
|
||||
def get_fpdf_corner_metadat(base_position_metadata, get_metadata_for_coords, get_image_and_page_edge_lengths):
|
||||
"""Origin top left, y1 <= y2; all coords on page are positive
|
||||
(0,0)--+--(2,0)--+
|
||||
|////| |////|
|
||||
@ -133,19 +124,23 @@ def get_fpdf_corner_metadat():
|
||||
|////| |////|
|
||||
+--(1,3) +--(3,3)
|
||||
"""
|
||||
width, height, page_width, page_height = get_image_and_page_edge_lengths()
|
||||
|
||||
return {
|
||||
"top_left": get_metadata_for_coords(0, 0, WIDTH, HEIGHT),
|
||||
"bottom_left": get_metadata_for_coords(0, PAGE_HEIGHT - HEIGHT, WIDTH, PAGE_HEIGHT),
|
||||
"bottom_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, PAGE_HEIGHT - HEIGHT, PAGE_WIDTH, PAGE_HEIGHT),
|
||||
"top_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, 0, PAGE_WIDTH, HEIGHT)
|
||||
"top_left": get_metadata_for_coords(0, 0, width, height),
|
||||
"bottom_left": get_metadata_for_coords(0, page_height - height, width, page_height),
|
||||
"bottom_right": get_metadata_for_coords(page_width - width, page_height - height, page_width, page_height),
|
||||
"top_right": get_metadata_for_coords(page_width - width, 0, page_width, height)
|
||||
}
|
||||
|
||||
|
||||
def get_fitz_corner_metadat():
|
||||
return get_fpdf_corner_metadat()
|
||||
@pytest.fixture
|
||||
def get_fitz_corner_metadat(get_fpdf_corner_metadat):
|
||||
return get_fpdf_corner_metadat
|
||||
|
||||
|
||||
def get_pdfnet_corner_metadata():
|
||||
@pytest.fixture
|
||||
def get_pdfnet_corner_metadata(base_position_metadata, get_metadata_for_coords, get_image_and_page_edge_lengths):
|
||||
"""Origin bottom left, y1 <= y2; all coords on page are positive
|
||||
+---(1,3) +--(3,3)
|
||||
|////| |////|
|
||||
@ -155,48 +150,106 @@ def get_pdfnet_corner_metadata():
|
||||
|////| |////|
|
||||
(0,0)--+ (2,0)--+
|
||||
"""
|
||||
width, height, page_width, page_height = get_image_and_page_edge_lengths()
|
||||
|
||||
return {
|
||||
"top_left": get_metadata_for_coords(0, PAGE_HEIGHT - HEIGHT, WIDTH, PAGE_HEIGHT),
|
||||
"bottom_left": get_metadata_for_coords(0, 0, WIDTH, HEIGHT),
|
||||
"bottom_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, 0, PAGE_WIDTH, HEIGHT),
|
||||
"top_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, PAGE_HEIGHT - HEIGHT, PAGE_WIDTH, PAGE_HEIGHT),
|
||||
"top_left": get_metadata_for_coords(0, page_height - height, width, page_height),
|
||||
"bottom_left": get_metadata_for_coords(0, 0, width, height),
|
||||
"bottom_right": get_metadata_for_coords(page_width - width, 0, page_width, height),
|
||||
"top_right": get_metadata_for_coords(page_width - width, page_height - height, page_width, page_height),
|
||||
}
|
||||
|
||||
|
||||
def get_metadata_for_coords(x1, y1, x2, y2):
|
||||
metadata = base_position_metadata()
|
||||
metadata.update({Info.X1: x1, Info.Y1: y1, Info.X2: x2, Info.Y2: y2})
|
||||
return metadata
|
||||
@pytest.fixture
|
||||
def base_position_metadata(WIDTH, HEIGHT, PAGE_WIDTH, PAGE_HEIGHT):
|
||||
return get_base_position_metadata(WIDTH, HEIGHT, PAGE_WIDTH, PAGE_HEIGHT)
|
||||
|
||||
|
||||
def base_position_metadata():
|
||||
@pytest.fixture
|
||||
def get_metadata_for_coords(base_position_metadata):
|
||||
def __get_metadata_for_coords(*coords):
|
||||
meta_data_coords = get_metadata_coords(*coords)
|
||||
return {**meta_data_coords, **omit(base_position_metadata, meta_data_coords.keys())}
|
||||
|
||||
return __get_metadata_for_coords
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def get_image_and_page_edge_lengths(base_position_metadata):
|
||||
def __get_w_h_pw_ph():
|
||||
return itemgetter(*attrgetter("WIDTH", "HEIGHT", "PAGE_WIDTH", "PAGE_HEIGHT")(Info))(base_position_metadata)
|
||||
|
||||
return __get_w_h_pw_ph
|
||||
|
||||
|
||||
@pytest.fixture(params=[33, 100])
|
||||
def HEIGHT(request):
|
||||
return request.param
|
||||
|
||||
|
||||
@pytest.fixture(params=[10, 31])
|
||||
def WIDTH(request):
|
||||
return request.param
|
||||
|
||||
|
||||
@pytest.fixture(params=[220, 30])
|
||||
def PAGE_HEIGHT(request):
|
||||
return request.param
|
||||
|
||||
|
||||
@pytest.fixture(params=[100, 310])
|
||||
def PAGE_WIDTH(request):
|
||||
return request.param
|
||||
|
||||
|
||||
def get_base_position_metadata(width, height, page_width, page_height):
|
||||
return {
|
||||
Info.X1: 0,
|
||||
Info.Y1: 0,
|
||||
Info.X2: WIDTH,
|
||||
Info.Y2: HEIGHT,
|
||||
Info.WIDTH: WIDTH,
|
||||
Info.HEIGHT: HEIGHT,
|
||||
Info.X1: None,
|
||||
Info.Y1: None,
|
||||
Info.X2: None,
|
||||
Info.Y2: None,
|
||||
Info.WIDTH: width,
|
||||
Info.HEIGHT: height,
|
||||
Info.PAGE_IDX: 0,
|
||||
Info.PAGE_WIDTH: PAGE_WIDTH,
|
||||
Info.PAGE_HEIGHT: PAGE_HEIGHT,
|
||||
Info.PAGE_WIDTH: page_width,
|
||||
Info.PAGE_HEIGHT: page_height,
|
||||
}
|
||||
|
||||
|
||||
def get_metadata_coords(x1, y1, x2, y2):
|
||||
return {Info.X1: x1, Info.Y1: y1, Info.X2: x2, Info.Y2: y2}
|
||||
|
||||
|
||||
@pytest.mark.parametrize("coordinate_system", ["pdfnet"])
|
||||
def test_coordinate_transformer_by_image(
|
||||
transformer, position_metadata_in_given_system, position_metadata_in_reference_system
|
||||
):
|
||||
metadata_transformed = transformer(position_metadata_in_given_system)
|
||||
|
||||
target_image = metadata_to_test_image(position_metadata_in_reference_system)
|
||||
test_image = metadata_to_test_image(metadata_transformed)
|
||||
|
||||
assert np.allclose(target_image, test_image)
|
||||
|
||||
|
||||
def metadata_to_test_image(metadata):
|
||||
image = get_coordinate_test_image()
|
||||
pdf = get_coordinate_test_fpdf()
|
||||
image = get_coordinate_test_image(
|
||||
*itemgetter(*attrgetter("WIDTH", "HEIGHT")(Info))(metadata)
|
||||
)
|
||||
pdf = get_coordinate_test_fpdf(
|
||||
*itemgetter(*attrgetter("PAGE_WIDTH", "PAGE_HEIGHT")(Info))(metadata)
|
||||
)
|
||||
add_image(pdf, ImageMetadataPair(image, metadata))
|
||||
page_image = fpdf_to_page_tensor(pdf)
|
||||
return page_image
|
||||
|
||||
|
||||
def get_coordinate_test_image():
|
||||
return array_to_image(np.zeros(shape=(WIDTH, HEIGHT, 3)))
|
||||
def get_coordinate_test_image(width, height):
|
||||
return array_to_image(np.zeros(shape=(width, height, 3)))
|
||||
|
||||
|
||||
def get_coordinate_test_fpdf():
|
||||
pdf = fpdf.FPDF(unit="pt", format=(PAGE_WIDTH, PAGE_HEIGHT))
|
||||
def get_coordinate_test_fpdf(page_width, page_height):
|
||||
pdf = fpdf.FPDF(unit="pt", format=(page_width, page_height))
|
||||
return pdf
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user