ImageOperations
ImageOperations is a minimal, device‑aware image ops library built on top of OpenCV and NumPy. You can call functions directly without initialization, or use a small facade class with a default device (CPU/GPU/MPS placeholder). When the requested device is unavailable, the library transparently falls back to CPU.
- ✅ Functional API and OOP API
- ✅ Device selection per call (
device="cpu"|"gpu"|"mps") - ✅ Safe fallback (GPU/MPS → CPU)
- ✅ Typed (PEP 561,
py.typed) - ✅ Clean, modular structure (
ops/,registry,device,types) - 🔧 Easy to extend: add new ops or backends without touching the public API
Note: MPS (Apple Metal) is reserved in
ComputeDevicebut currently falls back to CPU.
Installation
poetry add img-ops
# or with pip:
# pip install img-ops
Headless environments: replace opencv-python with opencv-python-headless in your environment
if you don't need GUI capabilities.
Quick Start
Functional API
from img_ops import bgr_to_hsv, in_range, gauss_blur, ComputeDevice
hsv = bgr_to_hsv(img, device="gpu") # uses GPU if CUDA available; else CPU
mask = in_range(hsv, (0, 80, 80), (10, 255, 255)) # default device (CPU)
blur = gauss_blur(img, (5, 5), 1.2, device=ComputeDevice.CPU)
OOP API with default device
from img_ops import ImageProcessor
proc = ImageProcessor(default_device="gpu")
hsv = proc.bgr_to_hsv(img) # defaults to GPU (fallback → CPU)
mask = proc.in_range(hsv, (0, 80, 80), (10, 255, 255)) # uses proc.default_device
blur = proc.gauss_blur(img, (5, 5), 1.2, device="cpu") # per-call override → CPU
Supported Operations (initial set)
- Color:
bgr_to_rgb,bgr_to_hsv,in_range - Filters:
gauss_blur - Segmentation (CPU-only):
find_contours,connected_components - Utils:
sum_masks(internal registry op)
Add more ops by editing registry.py and adding thin wrappers in ops/.
Devices
from img_ops import ComputeDevice
# ComputeDevice.GPU -> CUDA (if available)
# ComputeDevice.MPS -> reserved (falls back to CPU)
# ComputeDevice.CPU -> always available
Fallback behavior
- If you request
GPUand CUDA is unavailable, the call automatically falls back toCPU. MPSis a placeholder and currently always falls back toCPU.
Types
The library ships with type hints and py.typed.
from img_ops import CvImage, PointHSV
# CvImage: NDArray[uint8 | float32] # shape (H,W,3) or (H,W)
# PointHSV: tuple[int, int, int] # (H, S, V)
Shape is not fixed in the type system; keep (H, W) or (H, W, 3) by convention.
Error Handling
- Unknown device strings raise
ValueErrorwith allowed values. - Missing implementations raise
NotImplementedError(after attempting CPU fallback).
Extending the Library
Add a new operation
- Implement CPU/GPU/MPS callables in
registry.pyunder_cpu(),_gpu(),_mps(). - Add a thin function wrapper in
ops/<category>.pythat normalizesdeviceand callsdispatch(...). - (Optional) Expose it in
ops/__init__.pyand the package__init__.py.
Add a new device
- Extend
ComputeDevice(e.g.,OPENCL,TORCH). - Add a registry builder (e.g.,
_opencl()), wire it inREGISTRY. - Add availability checks in
device.pyand normalization in eachops/*.pywrapper.
This keeps public API stable while evolving internals.
Performance Notes
- GPU helps mostly for larger images or heavy kernels; small images can be faster on CPU due to upload/download overhead.
- Prefer
cv2.addovera + bfor masks to handle saturation properly.
Testing
poetry run pytest
poetry run mypy src/img_ops
poetry run ruff check .
Author
Project: https://github.com/omigutin/img_ops
Project Tracker: https://github.com/users/omigutin/projects/4
Contact: migutin83@yandex.ru
License
MIT License. See LICENSE for details.
Metadata
Release files for img-ops 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| img_ops-0.1.2.tar.gz | 12.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| img_ops-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.0 kB
Release files / img_ops-0.1.2.tar.gz
| Download URL | img_ops-0.1.2.tar.gz |
|---|---|
| Size | 12.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fc699db06cfb37c0899e1ace0469cd7fc29f609030ab075b81ad8574ef5f38d2
|
|
BLAKE2b-256 checksum How to use checksums |
f1a9fad2fc4746c803ab08a7beae791dcb72ea11b298a8840c2f8e71a54db2ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.8.0 CPython/3.10.11 Windows/10
|
Release files / img_ops-0.1.2-py3-none-any.whl
| Download URL | img_ops-0.1.2-py3-none-any.whl |
|---|---|
| Size | 15.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3e2f500234ea1a3241f708f454d4fad594f31bf399fa6c917be2db0b44652a2b
|
|
BLAKE2b-256 checksum How to use checksums |
7559f7f713af8868f88f7753eba1c24b1228e228d2b392a91ac8f1da41b032fe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.8.0 CPython/3.10.11 Windows/10
|