analyze-frame-diff.py 1.6 KB

1234567891011121314151617181920212223242526
  1. from pathlib import Path
  2. import json
  3. import numpy as np
  4. from PIL import Image
  5. root = Path(__file__).parent
  6. first = np.asarray(Image.open(root / 'k2-normal-a.jpg').convert('RGB')).astype(np.int16)
  7. second = np.asarray(Image.open(root / 'k2-normal-b.jpg').convert('RGB')).astype(np.int16)
  8. assert first.shape == second.shape == (1540, 2723, 3)
  9. # Fixed boxes from the observed normalized screenshots. All exclude the clock,
  10. # detail panel and dashboard; the control box contains only static ground imagery.
  11. boxes = {'device_and_halo': (1320, 805, 1395, 885), 'static_ground_control': (1050, 800, 1225, 900)}
  12. results = {}
  13. for name, (left, top, right, bottom) in boxes.items():
  14. delta = np.abs(first[top:bottom, left:right] - second[top:bottom, left:right])
  15. per_pixel = delta.max(axis=2)
  16. results[name] = {'box_xyxy': [left, top, right, bottom], 'pixels': int(per_pixel.size),
  17. 'changed_over_10': int((per_pixel > 10).sum()),
  18. 'changed_over_20': int((per_pixel > 20).sum()),
  19. 'mean_channel_delta': float(delta.mean()), 'max_channel_delta': int(delta.max())}
  20. results['evidence_limits'] = ['JPEG normalized tool screenshots, not original PNG pixels.',
  21. 'Two wall-clock captures ~35 seconds apart, not a controlled RAF trace.',
  22. 'Local image change supports visible motion, not a measured frame rate or GPU timing.',
  23. 'No live page script or browser process was used; this only analyzes saved images.']
  24. (root / 'pixel-diff.json').write_text(json.dumps(results, ensure_ascii=False, indent=2), encoding='utf-8')
  25. print(json.dumps(results, ensure_ascii=False, indent=2))