Download tools/encode_image.py from hmgill/CXR-Agent: direct link, hf CLI and curl.
- Browser
- Download file 2.32 kB
-
https://huggingface.co/spaces/hmgill/CXR-Agent/resolve/main/tools/encode_image.py
- Command line
-
hf download hf://spaces/hmgill/CXR-Agent/tools/encode_image.py
-
curl -L -o encode_image.py https://huggingface.co/spaces/hmgill/CXR-Agent/resolve/main/tools/encode_image.py
2.32 kB
| # cxr-agent/tools/encode_image.py | |
| """ | |
| CXR Image Encoding Tool | |
| ======================= | |
| Prepares a CXR image for submission to the NV-Reason-CXR-3B MCP server. | |
| Resizes to a specified maximum side length and encodes as base64 PNG. | |
| The default of 1280px prevents garbled output from Qwen2.5-VL's smart_resize, | |
| but the agent can pass a smaller value for faster inference or a larger value | |
| if fine detail is required. | |
| Data classes are defined in models/pipeline.py — none are declared here. | |
| """ | |
| from __future__ import annotations | |
| import base64 | |
| import io | |
| from pathlib import Path | |
| from PIL import Image | |
| DEFAULT_MAX_SIDE = 1280 | |
| def encode_image_for_reasoning( | |
| image_path: str, | |
| max_side: int = DEFAULT_MAX_SIDE, | |
| ) -> tuple[str, str]: | |
| """ | |
| Load, resize, and base64-encode a CXR image for the reasoning MCP tool. | |
| Resizes the image so the longest side is at most max_side pixels, converts | |
| to RGB PNG, and returns the base64 string alongside the image_id (filename | |
| stem), ready to pass directly to reason_cxr or analyze_cxr. | |
| Args: | |
| image_path: Path to the image file (JPEG or PNG). | |
| max_side: Maximum pixels on the longest side. Default 1280. | |
| Use smaller values (e.g. 512, 768) for faster inference. | |
| Use larger values (e.g. 1536) only if fine detail is needed | |
| and the model version supports it. | |
| Returns: | |
| (image_b64, image_id) where image_b64 is a base64-encoded PNG string | |
| and image_id is the filename stem (e.g. "cxr_demo"). | |
| Raises: | |
| FileNotFoundError: If the image file does not exist. | |
| ValueError: If max_side is less than 64 or greater than 2048. | |
| """ | |
| if not 64 <= max_side <= 2048: | |
| raise ValueError(f"max_side must be between 64 and 2048, got {max_side}") | |
| path = Path(image_path) | |
| if not path.exists(): | |
| raise FileNotFoundError(f"Image not found: {image_path}") | |
| img = Image.open(path).convert("RGB") | |
| w, h = img.size | |
| if max(w, h) > max_side: | |
| scale = max_side / max(w, h) | |
| img = img.resize((int(w * scale), int(h * scale)), Image.LANCZOS) | |
| buf = io.BytesIO() | |
| img.save(buf, format="PNG") | |
| image_b64 = base64.b64encode(buf.getvalue()).decode("ascii") | |
| image_id = path.stem | |
| return image_b64, image_id | |