Spaces:
Running
Running
import cv2 as cv | |
import numpy as np | |
import requests | |
from pathlib import Path | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
from sklearn.cluster import KMeans | |
def get_iiif_image_urls(ie_pid: str): | |
try: | |
manifest_url = f"https://rosetta.slv.vic.gov.au/delivery/iiif/presentation/2.1/{ie_pid}/manifest" | |
session = requests.Session() | |
response = session.get(manifest_url) | |
manifest = response.json() | |
image_ids = [ | |
canvas["images"][0]["resource"]["service"]["@id"] | |
for canvas in manifest["sequences"][0]["canvases"] | |
] | |
image_urls = [f"{image_id}/full/600,/0/default.jpg" for image_id in image_ids] | |
except Exception as e: | |
print(f"Could not get iiif image URLs for {ie_pid}, here's the error {e}") | |
print(f"Manifest url {manifest_url}") | |
image_urls = [] | |
return image_urls | |
# print(get_iiif_image_urls("IE1258179")) | |
def show_img_compare(img_1, img_2): | |
f, ax = plt.subplots(1, 2, figsize=(10, 10)) | |
ax[0].imshow(img_1) | |
ax[1].imshow(img_2) | |
ax[0].axis("off") # hide the axis | |
ax[1].axis("off") | |
f.tight_layout() | |
plt.show() | |
def palette(clusters): | |
width = 300 | |
palette = np.zeros((50, width, 3), np.uint8) | |
steps = width / clusters.cluster_centers_.shape[0] | |
for idx, centers in enumerate(clusters.cluster_centers_): | |
palette[:, int(idx * steps) : (int((idx + 1) * steps)), :] = centers | |
return palette | |
def get_palette_clusters(img, no_of_clusters=5): | |
cluster = KMeans(n_clusters=no_of_clusters) | |
cluster.fit(img.reshape(-1, 3)) | |
clusters = cluster.fit(img.reshape(-1, 3)) | |
return clusters | |
def get_colour_palette_iiif_image(ie_pid="", dim=(500, 300), iiif_url=None): | |
if not iiif_url: | |
# get iiif image urls | |
image_urls = get_iiif_image_urls(ie_pid) | |
iiif_url = image_urls[0] | |
if not image_urls: | |
return False | |
response = requests.get(iiif_url) | |
# decode image | |
img = cv.imdecode(np.frombuffer(response.content, np.uint8), -1) | |
img = cv.cvtColor(img, cv.COLOR_BGR2RGB) | |
img = cv.resize(img, dim, interpolation=cv.INTER_AREA) | |
palette_clusters = get_palette_clusters(img) | |
img_palette = palette(palette_clusters) | |
return img_palette | |
def get_palette_rgbs(ie_pid: str): | |
print("Getting palette RGBs for", ie_pid) | |
img_palette = get_colour_palette_iiif_image(ie_pid) | |
if isinstance(img_palette, bool): | |
return "" | |
palette_rgbs = np.unique(img_palette[0], axis=0) | |
palette_rgbs = palette_rgbs.tolist() | |
return palette_rgbs | |
# print(get_palette_rgbs("IE1391238")) | |
# img, palette = get_colour_palette_iiif_image("IE1423319") | |
# img, palette = get_colour_palette_iiif_image("IE1391238") | |
# show_img_compare(img, palette) | |