coordinate transformer, added Fitz transformer

This commit is contained in:
Matthias Bisping 2022-04-03 02:15:41 +02:00
parent 3d2c97bc10
commit f44e6f4fd7
2 changed files with 45 additions and 5 deletions

View File

@ -0,0 +1,8 @@
from image_prediction.transformer.transformer import Transformer
class FitzCoordinateTransformer(Transformer):
def transform(self, metadata: dict):
"""Fitz uses top left corner as origin; we take this as the reference coordinate system."""
return metadata

View File

@ -1,10 +1,13 @@
import numpy as np import numpy as np
import pytest import pytest
from fpdf import fpdf from fpdf import fpdf
from funcy import project, second
from pdf2image import pdf2image from pdf2image import pdf2image
from image_prediction.image_extractor.extractor import ImageMetadataPair from image_prediction.image_extractor.extractor import ImageMetadataPair
from image_prediction.image_extractor.extractors.parsable import ParsablePDFImageExtractor
from image_prediction.info import Info from image_prediction.info import Info
from image_prediction.transformer.transformers.coordinate.fitz import FitzCoordinateTransformer
from image_prediction.transformer.transformers.coordinate.fpdf import FPDFCoordinateTransformer from image_prediction.transformer.transformers.coordinate.fpdf import FPDFCoordinateTransformer
from test.conftest import array_to_image, add_image from test.conftest import array_to_image, add_image
@ -23,10 +26,22 @@ def coordinate_test_fpdf():
def get_fpdf_coordinates(corner): def get_fpdf_coordinates(corner):
metadata = base_position_metadata() metadata = base_position_metadata()
if corner == "top left": if corner == "top_left":
metadata.update({Info.X1: 0, Info.Y1: 0}) metadata.update({Info.X1: 0, Info.Y1: 0})
elif corner == "bottom left": elif corner == "bottom_left":
metadata.update({Info.X1: 0, Info.Y1: 100})
return metadata
def get_fitz_coordinates(corner):
metadata = base_position_metadata()
if corner == "top_left":
metadata.update({Info.X1: 0, Info.Y1: 0})
elif corner == "bottom_left":
metadata.update({Info.X1: 0, Info.Y1: 100}) metadata.update({Info.X1: 0, Info.Y1: 100})
return metadata return metadata
@ -41,6 +56,12 @@ def position_metadata(corner, coordinate_system):
if coordinate_system == "fpdf": if coordinate_system == "fpdf":
return get_fpdf_coordinates(corner) return get_fpdf_coordinates(corner)
elif coordinate_system == "fitz":
return get_fitz_coordinates(corner)
else:
raise ValueError(f"Unknown coordinate system: {coordinate_system}")
@pytest.fixture @pytest.fixture
def coordinate_test_pdf(position_metadata, coordinate_test_image, coordinate_test_fpdf): def coordinate_test_pdf(position_metadata, coordinate_test_image, coordinate_test_fpdf):
@ -53,9 +74,20 @@ def coordinate_test_page_image(coordinate_test_pdf):
return pdf2image.convert_from_bytes(coordinate_test_pdf)[0] return pdf2image.convert_from_bytes(coordinate_test_pdf)[0]
@pytest.mark.parametrize("corner", ["top left", "bottom left"]) @pytest.mark.parametrize("corner", ["top_left", "bottom_left"])
@pytest.mark.parametrize("coordinate_system", ["fpdf"]) @pytest.mark.parametrize("coordinate_system", ["fpdf"])
def test_coordinate_transformer(position_metadata, coordinate_test_page_image): def test_fpdf_coordinate_transformer(position_metadata):
assert FPDFCoordinateTransformer()(position_metadata) == position_metadata
@pytest.mark.parametrize("corner", ["top_left", "bottom_left"])
@pytest.mark.parametrize("coordinate_system", ["fitz"])
def test_coordinate_transformer(position_metadata, coordinate_test_pdf):
# coordinate_test_pdf.output("/tmp/x.pdf") # coordinate_test_pdf.output("/tmp/x.pdf")
# coordinate_test_page_image.show() # coordinate_test_page_image.show()
assert FPDFCoordinateTransformer()(position_metadata) == position_metadata
metadata_extracted = next(map(second, ParsablePDFImageExtractor()(coordinate_test_pdf)))
position_extracted = project(metadata_extracted, list(position_metadata.keys()))
assert position_extracted == position_metadata
assert FitzCoordinateTransformer()(position_metadata) == position_metadata