#!/usr/bin/env python3 """ Verklig förändringsdetektion med bildbehandling Använder numpy för att analysera bildskillnader """ import numpy as np from PIL import Image import json import os from datetime import datetime def analyze_image_difference(image_path1, image_path2): """ Analysera skillnader mellan två bilder Returnerar förändringskarta och statistik """ if not os.path.exists(image_path1) or not os.path.exists(image_path2): return None # Ladda bilder img1 = Image.open(image_path1).convert('L') # Gråskala img2 = Image.open(image_path2).convert('L') # Konvertera till numpy arrays arr1 = np.array(img1) arr2 = np.array(img2) # Beräkna skillnad diff = np.abs(arr2.astype(float) - arr1.astype(float)) # Statistik stats = { "mean_difference": float(np.mean(diff)), "max_difference": float(np.max(diff)), "std_difference": float(np.std(diff)), "changed_pixels": int(np.sum(diff > 30)), "total_pixels": diff.size, "change_percentage": float(np.sum(diff > 30) / diff.size * 100) } # Identifiera förändringsområden threshold = 50 changes = [] # Hitta konturer av förändrade områden (förenklad) change_mask = diff > threshold # Dela upp i grid och hitta aktiva celler h, w = change_mask.shape grid_size = 50 for i in range(0, h, grid_size): for j in range(0, w, grid_size): cell = change_mask[i:i+grid_size, j:j+grid_size] if np.sum(cell) > (grid_size * grid_size * 0.1): # 10% av cellen förändrad changes.append({ "x": j, "y": i, "width": grid_size, "height": grid_size, "severity": "high" if np.sum(cell) > (grid_size * grid_size * 0.3) else "medium" }) return { "statistics": stats, "changes": changes[:20], # Begränsa till 20 förändringar "analysis_time": datetime.now().isoformat() } def generate_synthetic_comparison(): """ Generera syntetiska före/efter-bilder för demo """ # Skapa två bilder med kända skillnader size = (400, 400) # Bild 1: "Före" img1 = np.ones(size, dtype=np.uint8) * 128 # Grå bakgrund # Lägg till "väg" img1[180:220, :] = 80 # Mörkare väg # Bild 2: "Efter" (med förändringar) img2 = img1.copy() # Lägg till "hål" i vägen img2[190:210, 150:250] = 200 # Ljust hål # Lägg till "skada" img2[300:320, 100:150] = 50 # Mörk skada # Spara Image.fromarray(img1).save('synthetic_before.png') Image.fromarray(img2).save('synthetic_after.png') print("Generated synthetic comparison images") return 'synthetic_before.png', 'synthetic_after.png' if __name__ == "__main__": print("="*60) print("REAL CHANGE DETECTION") print("="*60) # Generera syntetiska bilder för demo before, after = generate_synthetic_comparison() # Analysera skillnader result = analyze_image_difference(before, after) if result: print("\nAnalysis Results:") print(f" Mean difference: {result['statistics']['mean_difference']:.2f}") print(f" Max difference: {result['statistics']['max_difference']:.2f}") print(f" Changed pixels: {result['statistics']['changed_pixels']:,}") print(f" Change percentage: {result['statistics']['change_percentage']:.2f}%") print(f"\nDetected {len(result['changes'])} change areas") # Spara resultat with open('change_detection_result.json', 'w') as f: json.dump(result, f, indent=2) print("\nResult saved to change_detection_result.json") else: print("Failed to analyze images") print("="*60)