diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ca37ee8c8d36e69e0853fde38dd74d03a95aa40c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +venv +.idea +.vscode +.ipynb_checkpoints +*.pyc \ No newline at end of file diff --git a/iiif_components/__init__.py b/iiif_components/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..5342d714a10b7109b916e0af2fb6da70af4eee68 --- /dev/null +++ b/iiif_components/__init__.py @@ -0,0 +1,60 @@ +import requests +import cv2 as cv +import numpy as np + + +class IIIFComponent: + """ + Base class for all IIIF components + """ + + def __init__(self, url: str): + self.url = url + self._data = None + + @property + def data(self): + if not self._data: + self._data = requests.get(self.url).json() + return self._data + + @property + def id(self): + return self.data['@id'] + + @property + def context(self): + return self.data['@context'] + + @property + def type(self): + return self.data['@type'] + + +class IIIFImage(IIIFComponent): + def load_image(self, region: str = 'full', size: str = 'full', rotation: + int = 0, quality: str = 'default', format: str = 'jpg'): + image_url = f"{self.id}/{region}/{size}" \ + f"/{rotation}" \ + f"/{quality}" \ + f".{format}" + image_request = requests.get(image_url, stream=True) + image = np.asarray(bytearray(image_request.raw.read()), dtype='uint8') + image = cv.imdecode(image, cv.IMREAD_COLOR) + return image + + +class IIIFManifest(IIIFComponent): + """ + A class for handling IIIF manifests for further processing. + """ + + def get_images(self, indices: list = [], sequence_number: int = 0): + # return all images if empty list + if len(indices) == 0: + indices = range(len(self.data['sequences'][sequence_number][ + 'canvases'])) + for i in indices: + for image in self.data['sequences'][sequence_number]['canvases'][ + i]['images']: + yield IIIFImage(image['resource']['service']['@id']) diff --git a/iiif_modifier/IIIFColorizer.py b/iiif_modifier/IIIFColorizer.py new file mode 100644 index 0000000000000000000000000000000000000000..b49d825469e68f170d25c7a4837a732b3122aaa2 --- /dev/null +++ b/iiif_modifier/IIIFColorizer.py @@ -0,0 +1,4 @@ +from iiif_components import IIIFManifest + +class IIIFColorizer(IIIFManifest): + pass \ No newline at end of file diff --git a/iiif_modifier/IIIFImageStitcher.py b/iiif_modifier/IIIFImageStitcher.py new file mode 100644 index 0000000000000000000000000000000000000000..389351916b72bb734921740c2e6bf6da67237353 --- /dev/null +++ b/iiif_modifier/IIIFImageStitcher.py @@ -0,0 +1,17 @@ +from iiif_components import IIIFManifest +from stitching import scan + +import cv2 as cv + +class IIIFImageStitcher(IIIFManifest): + def stitch_images(self, indices: list = [], sequence_number: int = 0, + quality: int = 100): + # return all images if empty list + if len(indices) == 0: + indices = range(len(self.data['sequences'][sequence_number][ + 'canvases'])) + imgs = [image.load_image(size=f"pct:{quality}") for image in self.get_images( + indices)] + img_names = [image.id for image in self.get_images(indices)] + + return scan.full_stitching_pipeline(imgs, img_names) \ No newline at end of file diff --git a/iiif_tools.py b/iiif_tools.py deleted file mode 100644 index e82eabc34f1b1ee5b89c16dde5e3a5c625d758c2..0000000000000000000000000000000000000000 --- a/iiif_tools.py +++ /dev/null @@ -1,33 +0,0 @@ -import cv2 -import numpy as np -import requests -# from abc import ABC, abstractmethod - - -class IIIFAbstractManifest: - """ - A class for handling IIIF manifests for further processing. - """ - def __init__(self, manifest_url): - self.manifest_url = manifest_url - self.manifest = requests.get(manifest_url).json() - - @property - def manifest(self): - return self._manifest - - @manifest.setter - def manifest(self, man): - self._manifest = man - - def get_image(self, index): - image_uri = self.manifest['sequences']['canvases'][0]['images'][index] - return requests.get(image_uri) - - -class IIIFColorizer(IIIFAbstractManifest): - pass - - -class IIIFImageStitcher(IIIFAbstractManifest): - pass \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index fe707a2522b1ee9b81465349a5a204de5ef6bbe4..08f07a0b33f734d42316ffaaeb3d8a9597b7583f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,4 @@ pillow ipython ipykernel jsonpath-ng +requests \ No newline at end of file