| """ |
| Visualization utilities for compression results. |
| """ |
|
|
| import numpy as np |
| import cv2 |
| from PIL import Image |
| from typing import Tuple |
| import matplotlib.pyplot as plt |
|
|
|
|
| def highlight_roi( |
| image: Image.Image, |
| mask: np.ndarray, |
| alpha: float = 0.3, |
| color: Tuple[int, int, int] = (0, 255, 0) |
| ) -> Image.Image: |
| """ |
| Highlight ROI regions in image with colored overlay. |
| |
| Args: |
| image: PIL Image |
| mask: Binary mask (H, W) |
| alpha: Overlay transparency (0-1) |
| color: RGB color tuple for ROI highlight |
| |
| Returns: |
| Image with ROI highlighted |
| """ |
| img_array = np.array(image) |
| |
| |
| overlay = img_array.copy() |
| overlay[mask > 0.5] = color |
| |
| |
| result = cv2.addWeighted(img_array, 1 - alpha, overlay, alpha, 0) |
| |
| return Image.fromarray(result) |
|
|
|
|
| def create_comparison_grid( |
| original: Image.Image, |
| compressed: Image.Image, |
| mask: np.ndarray, |
| bpp: float, |
| sigma: float, |
| lambda_val: float, |
| highlight: bool = True |
| ) -> Image.Image: |
| """ |
| Create side-by-side comparison of original and compressed images. |
| |
| Args: |
| original: Original PIL Image |
| compressed: Compressed PIL Image |
| mask: Binary mask used |
| bpp: Bits per pixel |
| sigma: Sigma value used |
| lambda_val: Lambda value used |
| highlight: Whether to show ROI overlay |
| |
| Returns: |
| Combined comparison image |
| """ |
| fig, axes = plt.subplots(1, 3 if highlight else 2, figsize=(15 if highlight else 10, 5)) |
| |
| |
| axes[0].imshow(original) |
| axes[0].set_title('Original', fontsize=14) |
| axes[0].axis('off') |
| |
| |
| axes[1].imshow(compressed) |
| axes[1].set_title(f'Compressed (σ={sigma:.2f}, λ={lambda_val}, BPP={bpp:.3f})', fontsize=14) |
| axes[1].axis('off') |
| |
| |
| if highlight: |
| highlighted = highlight_roi(original, mask, alpha=0.4, color=(0, 255, 0)) |
| axes[2].imshow(highlighted) |
| axes[2].set_title('ROI Mask (green)', fontsize=14) |
| axes[2].axis('off') |
| |
| plt.tight_layout() |
| |
| |
| fig.canvas.draw() |
| img_array = np.frombuffer(fig.canvas.buffer_rgba(), dtype=np.uint8) |
| img_array = img_array.reshape(fig.canvas.get_width_height()[::-1] + (4,)) |
| img_array = img_array[:, :, :3] |
| plt.close(fig) |
| |
| return Image.fromarray(img_array) |
|
|