| |
| """ |
| Example script demonstrating mosaic generation functionality. |
| """ |
|
|
| import numpy as np |
| from PIL import Image |
| import matplotlib.pyplot as plt |
| import os |
|
|
| from src.config import Config |
| from src.pipeline import MosaicPipeline |
|
|
|
|
| def create_sample_image(size=(512, 512)): |
| """Create a sample image with gradients and patterns.""" |
| img_array = np.zeros((size[1], size[0], 3), dtype=np.float32) |
| |
| |
| for y in range(size[1]): |
| for x in range(size[0]): |
| |
| img_array[y, x, 0] = x / size[0] |
| |
| |
| img_array[y, x, 1] = y / size[1] |
| |
| |
| img_array[y, x, 2] = (x + y) / (size[0] + size[1]) |
| |
| |
| center_x, center_y = size[0] // 2, size[1] // 2 |
| radius = min(size) // 4 |
| |
| for y in range(size[1]): |
| for x in range(size[0]): |
| |
| dist = np.sqrt((x - center_x)**2 + (y - center_y)**2) |
| if dist < radius: |
| img_array[y, x] = [1.0, 0.5, 0.2] |
| |
| return Image.fromarray((img_array * 255).astype(np.uint8)) |
|
|
|
|
| def demonstrate_mosaic_generation(): |
| """Demonstrate mosaic generation with different configurations.""" |
| |
| print("π¨ Mosaic Generator Example") |
| print("=" * 40) |
| |
| |
| print("Creating sample image...") |
| sample_img = create_sample_image() |
| os.makedirs("images", exist_ok=True) |
| sample_img.save("images/sample_input.png") |
| print("β
Sample image saved to images/sample_input.png") |
| |
| |
| grid_sizes = [16, 32, 48] |
| |
| for grid_size in grid_sizes: |
| print(f"\nGenerating mosaic with {grid_size}x{grid_size} grid...") |
| |
| |
| config = Config( |
| grid=grid_size, |
| tile_size=32, |
| out_w=512, |
| out_h=512 |
| ) |
| |
| |
| pipeline = MosaicPipeline(config) |
| |
| |
| results = pipeline.run_full_pipeline(sample_img) |
| |
| |
| mosaic_img = results['outputs']['mosaic'] |
| processed_img = results['outputs']['processed_image'] |
| |
| mosaic_img.save(f"images/mosaic_{grid_size}x{grid_size}.png") |
| processed_img.save(f"images/processed_{grid_size}x{grid_size}.png") |
| |
| |
| metrics = results['metrics'] |
| timing = results['timing'] |
| |
| print(f"β
Mosaic saved to images/mosaic_{grid_size}x{grid_size}.png") |
| print(f" Processing time: {timing['total']:.3f}s") |
| print(f" MSE: {metrics['mse']:.6f}") |
| print(f" SSIM: {metrics['ssim']:.4f}") |
| |
| |
| print(f"\nComparing implementations...") |
| |
| config_vect = Config(grid=32, tile_size=32, out_w=512, out_h=512, impl="Vectorised") |
| config_loop = Config(grid=32, tile_size=32, out_w=512, out_h=512, impl="Loops") |
| |
| pipeline_vect = MosaicPipeline(config_vect) |
| pipeline_loop = MosaicPipeline(config_loop) |
| |
| import time |
| |
| |
| start = time.time() |
| results_vect = pipeline_vect.run_full_pipeline(sample_img) |
| time_vect = time.time() - start |
| |
| |
| start = time.time() |
| results_loop = pipeline_loop.run_full_pipeline(sample_img) |
| time_loop = time.time() - start |
| |
| speedup = time_loop / time_vect if time_vect > 0 else 0 |
| |
| print(f"β
Vectorized: {time_vect:.3f}s") |
| print(f"β
Loop-based: {time_loop:.3f}s") |
| print(f"β
Speedup: {speedup:.2f}x") |
| |
| |
| fig, axes = plt.subplots(2, 3, figsize=(15, 10)) |
| |
| |
| axes[0, 0].imshow(sample_img) |
| axes[0, 0].set_title("Original Image") |
| axes[0, 0].axis('off') |
| |
| |
| mosaic_16 = Image.open("images/mosaic_16x16.png") |
| axes[0, 1].imshow(mosaic_16) |
| axes[0, 1].set_title("16Γ16 Grid Mosaic") |
| axes[0, 1].axis('off') |
| |
| |
| mosaic_32 = Image.open("images/mosaic_32x32.png") |
| axes[0, 2].imshow(mosaic_32) |
| axes[0, 2].set_title("32Γ32 Grid Mosaic") |
| axes[0, 2].axis('off') |
| |
| |
| mosaic_48 = Image.open("images/mosaic_48x48.png") |
| axes[1, 0].imshow(mosaic_48) |
| axes[1, 0].set_title("48Γ48 Grid Mosaic") |
| axes[1, 0].axis('off') |
| |
| |
| axes[1, 1].imshow(results_vect['outputs']['mosaic']) |
| axes[1, 1].set_title(f"Vectorized ({time_vect:.3f}s)") |
| axes[1, 1].axis('off') |
| |
| |
| axes[1, 2].imshow(results_loop['outputs']['mosaic']) |
| axes[1, 2].set_title(f"Loop-based ({time_loop:.3f}s)") |
| axes[1, 2].axis('off') |
| |
| plt.tight_layout() |
| plt.savefig("images/mosaic_comparison.png", dpi=300, bbox_inches='tight') |
| plt.close() |
| |
| print(f"\nβ
Comparison visualization saved to images/mosaic_comparison.png") |
| |
| print(f"\nπ Example complete! Check the 'images' folder for results.") |
|
|
|
|
| if __name__ == "__main__": |
| demonstrate_mosaic_generation() |
|
|