aee0f09db8
- Datafabrik: Dockerfile fix, agentorkestrering fungerar - Vision: Identify-modell, FAISS, OCR alla testade - API: Alla 7 integrationstester passerade - Upplösare: Entitetsupplösning verifierad
124 lines
3.8 KiB
Python
124 lines
3.8 KiB
Python
#!/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)
|