import cv2
import base64
import numpy as np
import os
from selenium.webdriver import Chrome
def compute(path, d_mime_type, d_width=None, d_height=None):
"""This function computes the mean absolute difference between an image resized then encoded
from the browser and the same image resized then encoded from opencv.
Args:
path (str): Path to the image to resize and encode.
d_mime_type (str): Destination mime type of the image to encode.
d_width (int, optional): Destination width of the image to encode. Defaults to None.
d_height (int, optional): Destination height of the image to encode. Defaults to None.
Returns:
float: Mean absolute difference between the two images.
"""
# Decoding input image
image = cv2.imread(path)
# Setting default values
s_width = image.shape[1]
s_height = image.shape[0]
d_width = d_width if d_width else s_width
d_height = d_height if d_height else s_height
s_mime_type = os.path.splitext(path)[-1][1:]
# Encoding raw image to base64 (for the browser)
encoded_image = f"data:image/{s_mime_type};base64," + base64.b64encode(open(path, "rb").read()).decode()
# Getting results from the browser
driver = Chrome()
driver.get("file://" + os.path.join(os.getcwd(), "index.html"))
browser_result = driver.execute_script(
"return encodeAndResize(arguments[0], arguments[1], arguments[2], arguments[3])",
encoded_image,
f"image/{d_mime_type}",
d_width,
d_height
).split(",")[-1]
browser_result = np.frombuffer(base64.b64decode(browser_result), np.uint8)
browser_result = cv2.imdecode(browser_result, cv2.IMREAD_COLOR).astype(np.int16)
driver.quit()
# Getting results from opencv
opencv_result = cv2.resize(image, (d_width, d_height), interpolation=cv2.INTER_LINEAR)
_, opencv_result = cv2.imencode(f".{d_mime_type}", opencv_result)
opencv_result = cv2.imdecode(opencv_result, cv2.IMREAD_COLOR).astype(np.int16)
# Comparing results
mae = np.mean(np.abs(browser_result - opencv_result))
print(f"MAE {s_mime_type} ({s_width}x{s_height}) -> {d_mime_type} ({d_width}x{d_height}): {mae}")
compute("example.bmp", "jpeg", 100, 100)
compute("example.bmp", "jpeg", 250, 250)
compute("example.bmp", "jpeg", 500, 500)
compute("example.bmp", "jpeg")
compute("example.bmp", "bmp", 100, 100)
compute("example.bmp", "bmp", 250, 250)
compute("example.bmp", "bmp", 500, 500)
compute("example.bmp", "bmp")
compute("example.bmp", "png", 100, 100)
compute("example.bmp", "png", 250, 250)
compute("example.bmp", "png", 500, 500)
compute("example.bmp", "png")
compute("example.jpg", "jpeg", 100, 100)
compute("example.jpg", "jpeg", 250, 250)
compute("example.jpg", "jpeg", 500, 500)
compute("example.jpg", "jpeg")
compute("example.jpg", "bmp", 100, 100)
compute("example.jpg", "bmp", 250, 250)
compute("example.jpg", "bmp", 500, 500)
compute("example.jpg", "bmp")
compute("example.jpg", "png", 100, 100)
compute("example.jpg", "png", 250, 250)
compute("example.jpg", "png", 500, 500)
compute("example.jpg", "png")
compute("example.png", "jpeg", 100, 100)
compute("example.png", "jpeg", 250, 250)
compute("example.png", "jpeg", 500, 500)
compute("example.png", "jpeg")
compute("example.png", "bmp", 100, 100)
compute("example.png", "bmp", 250, 250)
compute("example.png", "bmp", 500, 500)
compute("example.png", "bmp")
compute("example.png", "png", 100, 100)
compute("example.png", "png", 250, 250)
compute("example.png", "png", 500, 500)
compute("example.png", "png")