AI_Lab_CAM / developer_api.py
Aditya7864's picture
Add application file
8096125
Raw
History Blame Contribute Delete
3.82 kB
"""High-level Python API / SDK for CV Lab developers."""
from __future__ import annotations
import json
from pathlib import Path
from typing import Any
import numpy as np
from PIL import Image
from batch.dataset_processor import process_dataset
from cv_ops.analysis import histogram_figure, low_resolution_pair, pixel_preview, stats
from cv_ops.morphology import apply_morphology
from cv_ops.transforms import reflect, rotate, scale_image, translate
from filters.builtin import BUILTIN_FILTERS, ensure_rgb
from filters.custom import parse_kernel, parse_pipeline
from filters.registry import apply_definition, apply_step, load_definition, save_filter
from models.face_filters import apply_face_filter, ar_filter_names, save_ar_filter
from models.style_transfer import stylize
def load_image(source: str | Path | np.ndarray) -> np.ndarray:
"""Load an image from file path or return RGB numpy array."""
if isinstance(source, (str, Path)):
img = Image.open(source).convert("RGB")
return np.array(img, dtype=np.uint8)
return ensure_rgb(source)
def save_image(image: np.ndarray, output_path: str | Path) -> str:
"""Save an RGB numpy image array to file."""
path = Path(output_path)
path.parent.mkdir(parents=True, exist_ok=True)
Image.fromarray(image).save(path)
return str(path)
def generate_python_snippet(operation: str, params: dict[str, Any]) -> str:
"""Generate reproducible Python code snippet for developers."""
params_str = json.dumps(params, indent=2)
return f"""import numpy as np
from PIL import Image
from filters.registry import apply_step
# Load image
image = np.array(Image.open("input.jpg").convert("RGB"))
# Apply filter
params = {params_str}
result = apply_step(image, "{operation}", params)
# Save result
Image.fromarray(result).save("output.jpg")
"""
def process_image(
image_input: str | Path | np.ndarray,
operation_type: str,
operation_name: str = "Grayscale",
params: dict[str, Any] | None = None,
output_path: str | Path | None = None,
) -> tuple[np.ndarray, dict[str, Any]]:
"""Programmatic API to process images with any CV Lab operation."""
img = load_image(image_input)
params = params or {}
if operation_type == "filter":
result = apply_step(img, operation_name, params)
meta = {"operation": operation_name, "params": params}
elif operation_type == "pipeline":
definition = parse_pipeline(operation_name) if isinstance(operation_name, str) else operation_name
result = apply_definition(img, definition)
meta = {"definition": definition}
elif operation_type == "transform":
if operation_name == "Translation":
result = translate(img, **params)[0]
elif operation_name == "Rotation":
result = rotate(img, **params)[0]
elif operation_name == "Scaling":
result = scale_image(img, **params)[0]
else:
result = reflect(img, **params)[0]
meta = {"operation": operation_name, "params": params}
elif operation_type == "morphology":
result, kernel = apply_morphology(img, operation_name, **params)
meta = {"operation": operation_name, "kernel_shape": kernel.shape}
elif operation_type == "ar":
result, msg = apply_face_filter(img, operation_name, custom_def=params.get("custom_def"))
meta = {"status": msg}
elif operation_type == "style":
style_img = load_image(params["style_image"])
result, time_sec, msg = stylize(img, style_img, max_size=params.get("max_size", 512))
meta = {"time_seconds": time_sec, "message": msg}
else:
raise ValueError(f"Unknown operation type: {operation_type}")
if output_path:
save_image(result, output_path)
return result, meta