152 lines
4.5 KiB
Python
152 lines
4.5 KiB
Python
|
|
"""
|
||
|
|
Example script demonstrating the Image class functionality.
|
||
|
|
"""
|
||
|
|
|
||
|
|
import sys
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
# Add parent directory to path for imports
|
||
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||
|
|
|
||
|
|
from src.utils import Image, ImageLoadError
|
||
|
|
|
||
|
|
|
||
|
|
def demonstrate_image_loading():
|
||
|
|
"""Demonstrate basic image loading functionality."""
|
||
|
|
print("=" * 60)
|
||
|
|
print("Image Class Demonstration")
|
||
|
|
print("=" * 60)
|
||
|
|
|
||
|
|
# Example 1: Try to load an image (replace with your own path)
|
||
|
|
example_paths = [
|
||
|
|
"data/datasets/example.jpg",
|
||
|
|
"data/datasets/sample.png",
|
||
|
|
"tests/test_image.jpg",
|
||
|
|
]
|
||
|
|
|
||
|
|
loaded_img = None
|
||
|
|
for image_path in example_paths:
|
||
|
|
if Path(image_path).exists():
|
||
|
|
try:
|
||
|
|
print(f"\n1. Loading image: {image_path}")
|
||
|
|
img = Image(image_path)
|
||
|
|
loaded_img = img
|
||
|
|
print(f" ✓ Successfully loaded!")
|
||
|
|
print(f" {img}")
|
||
|
|
break
|
||
|
|
except ImageLoadError as e:
|
||
|
|
print(f" ✗ Failed: {e}")
|
||
|
|
else:
|
||
|
|
print(f"\n1. Image not found: {image_path}")
|
||
|
|
|
||
|
|
if loaded_img is None:
|
||
|
|
print("\nNo example images found. Creating a test image...")
|
||
|
|
create_test_image()
|
||
|
|
return
|
||
|
|
|
||
|
|
# Example 2: Access image properties
|
||
|
|
print(f"\n2. Image Properties:")
|
||
|
|
print(f" Width: {loaded_img.width} pixels")
|
||
|
|
print(f" Height: {loaded_img.height} pixels")
|
||
|
|
print(f" Channels: {loaded_img.channels}")
|
||
|
|
print(f" Format: {loaded_img.format.upper()}")
|
||
|
|
print(f" Shape: {loaded_img.shape}")
|
||
|
|
print(f" File size: {loaded_img.size_mb:.2f} MB")
|
||
|
|
print(f" Is color: {loaded_img.is_color()}")
|
||
|
|
print(f" Is grayscale: {loaded_img.is_grayscale()}")
|
||
|
|
|
||
|
|
# Example 3: Get different formats
|
||
|
|
print(f"\n3. Accessing Image Data:")
|
||
|
|
print(f" BGR data shape: {loaded_img.data.shape}")
|
||
|
|
print(f" RGB data shape: {loaded_img.get_rgb().shape}")
|
||
|
|
print(f" Grayscale shape: {loaded_img.get_grayscale().shape}")
|
||
|
|
print(f" PIL image mode: {loaded_img.pil_image.mode}")
|
||
|
|
|
||
|
|
# Example 4: Resizing
|
||
|
|
print(f"\n4. Resizing Image:")
|
||
|
|
resized = loaded_img.resize(320, 320)
|
||
|
|
print(f" Original size: {loaded_img.width}x{loaded_img.height}")
|
||
|
|
print(f" Resized to: {resized.shape[1]}x{resized.shape[0]}")
|
||
|
|
|
||
|
|
# Example 5: Working with copies
|
||
|
|
print(f"\n5. Creating Copies:")
|
||
|
|
copy = loaded_img.copy()
|
||
|
|
print(f" Created copy with shape: {copy.shape}")
|
||
|
|
print(f" Original data unchanged: {(loaded_img.data == copy).all()}")
|
||
|
|
|
||
|
|
print("\n" + "=" * 60)
|
||
|
|
print("Demonstration Complete!")
|
||
|
|
print("=" * 60)
|
||
|
|
|
||
|
|
|
||
|
|
def create_test_image():
|
||
|
|
"""Create a test image for demonstration purposes."""
|
||
|
|
import cv2
|
||
|
|
import numpy as np
|
||
|
|
|
||
|
|
print("\nCreating a test image...")
|
||
|
|
|
||
|
|
# Create a colorful test image
|
||
|
|
width, height = 400, 300
|
||
|
|
test_img = np.zeros((height, width, 3), dtype=np.uint8)
|
||
|
|
|
||
|
|
# Add some colors
|
||
|
|
test_img[:100, :] = [255, 0, 0] # Blue section
|
||
|
|
test_img[100:200, :] = [0, 255, 0] # Green section
|
||
|
|
test_img[200:, :] = [0, 0, 255] # Red section
|
||
|
|
|
||
|
|
# Save the test image
|
||
|
|
test_path = Path("test_demo_image.png")
|
||
|
|
cv2.imwrite(str(test_path), test_img)
|
||
|
|
print(f"Test image created: {test_path}")
|
||
|
|
|
||
|
|
# Now load and demonstrate with it
|
||
|
|
try:
|
||
|
|
img = Image(test_path)
|
||
|
|
print(f"\nLoaded test image: {img}")
|
||
|
|
print(f"Dimensions: {img.width}x{img.height}")
|
||
|
|
print(f"Channels: {img.channels}")
|
||
|
|
print(f"Format: {img.format}")
|
||
|
|
|
||
|
|
# Clean up
|
||
|
|
test_path.unlink()
|
||
|
|
print(f"\nTest image cleaned up.")
|
||
|
|
|
||
|
|
except ImageLoadError as e:
|
||
|
|
print(f"Error loading test image: {e}")
|
||
|
|
|
||
|
|
|
||
|
|
def demonstrate_error_handling():
|
||
|
|
"""Demonstrate error handling."""
|
||
|
|
print("\n" + "=" * 60)
|
||
|
|
print("Error Handling Demonstration")
|
||
|
|
print("=" * 60)
|
||
|
|
|
||
|
|
# Try to load non-existent file
|
||
|
|
print("\n1. Loading non-existent file:")
|
||
|
|
try:
|
||
|
|
img = Image("nonexistent.jpg")
|
||
|
|
except ImageLoadError as e:
|
||
|
|
print(f" ✓ Caught error: {e}")
|
||
|
|
|
||
|
|
# Try unsupported format
|
||
|
|
print("\n2. Loading unsupported format:")
|
||
|
|
try:
|
||
|
|
# Create a text file
|
||
|
|
test_file = Path("test.txt")
|
||
|
|
test_file.write_text("not an image")
|
||
|
|
img = Image(test_file)
|
||
|
|
except ImageLoadError as e:
|
||
|
|
print(f" ✓ Caught error: {e}")
|
||
|
|
test_file.unlink() # Clean up
|
||
|
|
|
||
|
|
print("\n" + "=" * 60)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
print("\n")
|
||
|
|
demonstrate_image_loading()
|
||
|
|
print("\n")
|
||
|
|
demonstrate_error_handling()
|
||
|
|
print("\n")
|