|
import numpy as np |
|
from skimage.metrics import structural_similarity as ssim |
|
import gradio as gr |
|
import cv2 |
|
|
|
|
|
def calculate_similarity(img1, img2): |
|
if len(img1.shape) == 2: |
|
img1 = cv2.cvtColor(img1, cv2.COLOR_GRAY2RGB) |
|
if len(img2.shape) == 2: |
|
img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2RGB) |
|
return ssim(img1, img2, win_size=3) |
|
|
|
|
|
|
|
def compute_similarity(target_image, image_list): |
|
scores = [] |
|
target_image_resized = cv2.resize(target_image, (target_image.shape[1], target_image.shape[0])) |
|
for image in image_list: |
|
image_resized = cv2.resize(image, (target_image.shape[1], target_image.shape[0])) |
|
similarity_score = calculate_similarity(target_image_resized, image_resized) |
|
scores.append(similarity_score) |
|
return scores |
|
|
|
|
|
|
|
def image_similarity(target_image, image_list): |
|
target_image = target_image.astype(np.uint8) |
|
image_list = [image.astype(np.uint8) for image in image_list] |
|
scores = compute_similarity(target_image, image_list) |
|
results = list(zip(image_list, scores)) |
|
results.sort(key=lambda x: x[1], reverse=True) |
|
formatted_results = [(str(image.tolist()), f"{score:.4f}") for image, score in results] |
|
return formatted_results |
|
|
|
|
|
iface = gr.Interface( |
|
fn=image_similarity, |
|
inputs=[ |
|
gr.inputs.Image(type="numpy", label="Target Image"), |
|
gr.inputs.Image(type="numpy", label="Image List") |
|
], |
|
outputs="text", |
|
title="Image Similarity Calculator", |
|
description="Upload an image and a list of images. Get similarity scores." |
|
) |
|
|
|
|
|
iface.launch() |