diff --git a/ObjectTracking.py b/ObjectTracking.py index da1d31907db9109b372d5e48b6be544629515b65..67859730d15a01a2fe449c38a62f517554185ee8 100644 --- a/ObjectTracking.py +++ b/ObjectTracking.py @@ -2,7 +2,7 @@ import cv2 import numpy as np import os import matplotlib.pyplot as plt -def calculate_histogram(image, bins=32): +def calculate_histogram(image, bins=255): hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) hist = cv2.calcHist([hsv_image], [0, 1], None, [bins, bins], [0, 180, 0, 256]) return cv2.normalize(hist, hist).flatten() @@ -22,6 +22,13 @@ def emd(hist1, hist2): bins2 = np.array([[i, hist2[i]] for i in range(len(hist2))], dtype=np.float32) emd_value, _, _ = cv2.EMD(bins1, bins2, cv2.DIST_L2) return emd_value +def qf_distance(hist1, hist2): + A = np.zeros((len(hist1), len(hist2))) + dist = np.abs(hist1[:, None] - hist2) + A = 1 - dist / np.max(dist) + diff = np.abs(hist1 - hist2) + qf = np.sqrt(np.dot(diff.T, np.dot(A, diff))) + return qf def find_minimum_distance(reference_image_path, scene_folder, bins=32): # Charger l'image de référence reference_image = cv2.imread(reference_image_path) @@ -33,14 +40,14 @@ def find_minimum_distance(reference_image_path, scene_folder, bins=32): 'Bhattacharyya': float('inf'), 'Minkowski': float('inf'), 'Matusita': float('inf'), - 'Cosine': float('inf'), + 'QF': float('inf'), 'EMD': float('inf') } closest_images = { 'Bhattacharyya': None, 'Minkowski': None, 'Matusita': None, - 'Cosine': None, + 'QF': None, 'EMD': None } for filename in os.listdir(scene_folder): @@ -55,7 +62,7 @@ def find_minimum_distance(reference_image_path, scene_folder, bins=32): 'Bhattacharyya': bhattacharyya_distance(reference_hist, target_hist), 'Minkowski': minkowski_distance(reference_hist, target_hist), 'Matusita': matusita_distance(reference_hist, target_hist), - 'Cosine': cosine_distance(reference_hist, target_hist), + 'QF': qf_distance(reference_hist, target_hist), 'EMD': emd(reference_hist, target_hist) } @@ -66,7 +73,7 @@ def find_minimum_distance(reference_image_path, scene_folder, bins=32): return min_distances, closest_images, reference_image,distances def visualize_results(reference_image, closest_images, min_distances): metrics = list(closest_images.keys()) - fig, axes = plt.subplots(1, len(metrics) + 1, figsize=(15, 5)) + fig, axes = plt.subplots(1, len(metrics) + 1, figsize=(15, 10)) axes[0].imshow(cv2.cvtColor(reference_image, cv2.COLOR_BGR2RGB)) axes[0].set_title("Image de Référence") axes[0].axis('off') @@ -80,11 +87,14 @@ def visualize_results(reference_image, closest_images, min_distances): axes[i + 1].axis('off') plt.tight_layout() plt.show() -reference_image_path = "Scene1/158.jpg" -scene_folder = "Scene1" +reference_image_path = "20210617_193155.jpg" +scene_folder = "scene" min_distances, closest_images, reference_image, dis = find_minimum_distance(reference_image_path, scene_folder) print("Distances minimales et images correspondantes :") for metric, distance in min_distances.items(): print(f"{metric} : {distance:.4f} (Image : {closest_images[metric]})") visualize_results(reference_image, closest_images, min_distances) + + + diff --git a/h.py b/h.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391