Files
boc/rivp-pilot-1/real_change_detection.py
T

124 lines
3.8 KiB
Python
Raw Normal View History

#!/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)