sdimg
Small, function-based image and mask processing library built on
numpy.ndarray. The public API is pure functions and requires Python 3.12+.
Install
pip install sdimg
Architecture
| Path | Responsibility |
|---|---|
sdimg.core |
Shared array, shape, parameter, and bbox contracts. It contains no image-processing algorithms. |
sdimg.image |
Image representation conversion, filtering, enhancement, normalization, identity, codecs, and file I/O. Channel and Pillow adapters stay in this domain. |
sdimg.mask |
Binary-mask conversion, measurement, morphology, connected components, hulls, and distance transforms. |
sdimg.spatial |
Dtype-preserving crop, pad, resize, transform, and tiling operations. tile.split owns tile layout; tile.merge owns validated numerical reconstruction. |
sdimg.segment |
Algorithms that orchestrate image, mask, and spatial operations: Otsu thresholding and GrabCut refinement. |
The dependency direction is core <- {image, mask, spatial} <- segment.
Representation-specific helpers stay with the domain that owns the
representation; cross-domain workflows belong in segment.
Public imports are flat within each domain:
from sdimg.image import apply_gaussian_blur, equalize_histogram
from sdimg.mask import apply_morphology
from sdimg.segment import refine_grabcut
Import public functions from the flat domain packages rather than implementation modules.
Core Contracts
- Processing inputs are
numpy.ndarrayvalues with real numeric or boolean dtype. - Images use non-empty shape
(H, W)or(H, W, C)withC in {1, 2, 3, 4}. - Color images are RGB. Convert OpenCV BGR inputs before calling
sdimg. - Channel meanings are grayscale, grayscale+alpha, RGB, and RGBA.
sdimg.imageprocessing returnsnp.uint8. Filters and enhancement preserve channel shape and leave alpha content unchanged. Color denoising follows the RGB contract; setting both denoising strengths to zero is an exact converted no-op.- Normalization operates per visual channel and preserves alpha. Constant
channels become midgray (
128); non-finite visual values are rejected. Channel scaling keeps min-max and z-score calculations stable for very large and very small finitefloat64inputs. Compared with versions before 0.3.4, rounding-boundary results can differ by oneuint8level. - Masks use non-empty shape
(H, W)and valuesbool,{0, 1}, or{0, 255}. Mask processing returns binarynp.uint8in{0, 1}; distance transforms returnnp.float32. Two-dimensional morphology kernel sizes use(width, height)order. sdimg.spatialoperations preserve input dtype and channel shape.resizeand tile merging reject integer values outside the safe range[-2**53, 2**53]instead of silently changing them.refine_grabcutaccepts an image-sized binary mask and returns a binary mask with the same spatial shape. Itsmarginexpands the initial bounding box over real source pixels, so refinement may add foreground outside that box.- Points use
(x, y). Bounding boxes use(xmin, ymin, xmax, ymax), minimum-inclusive and maximum-exclusive. - Empty mask geometry returns
Nonewhere no geometry exists.
Error Policy
TypeError: wrong Python input type.ValueError: invalid shape, dtype, parameter, mask value, or bbox.RuntimeError: wrapped OpenCV, Pillow, or third-party failure.
Quick Example
import numpy as np
from sdimg.image import apply_gaussian_blur, equalize_histogram
from sdimg.mask import apply_morphology
from sdimg.segment import refine_grabcut
image = np.random.default_rng(0).integers(
0,
256,
(128, 128, 3),
dtype=np.uint8,
)
mask = np.zeros((128, 128), dtype=np.uint8)
mask[32:96, 40:88] = 1
image = equalize_histogram(image)
image = apply_gaussian_blur(image, kernel_size=(5, 5), sigma_x=1.2)
mask = apply_morphology(mask, operation="open", kernel_size=(3, 3))
refined = refine_grabcut(image, mask)
Supporting Image Utilities
from sdimg.image import (
decode_image,
encode_image,
make_array_id,
read_image,
write_image,
)
image = read_image("input.tif")
image_id = make_array_id(image, prefix="img_")
payload = encode_image(image)
restored = decode_image(payload)
write_image(f"{image_id}.png", restored)
read_image returns RGB uint8. High-bit-depth and floating images are scaled
explicitly before RGB conversion. write_image writes RGB and ignores alpha.
make_array_id accepts any shape and any non-object dtype, and includes the
full dtype definition, original shape, and content. Structured dtype field names
and layout therefore participate in the ID.
The lossless WebP string codec preserves RGBA alpha and ignores
grayscale+alpha's alpha channel.
Metadata
Release files for sdimg 0.3.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sdimg-0.3.4.tar.gz | 22.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sdimg-0.3.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 51.0 kB
Release files / sdimg-0.3.4.tar.gz
| Download URL | sdimg-0.3.4.tar.gz |
|---|---|
| Size | 22.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d816ac0d06bf008ff69fedbe234962b5f0133c84901f41276f8587eb217d2a67
|
|
BLAKE2b-256 checksum How to use checksums |
e1164ce25ee26260e3e7c775005adbfaf7ca919cf4808661badf3f80eb679296
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.14
|
Release files / sdimg-0.3.4-py3-none-any.whl
| Download URL | sdimg-0.3.4-py3-none-any.whl |
|---|---|
| Size | 29.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3be798cc18f2179ad4d92a3ab86316a08db114acd2d484dca6c121d0519f47d0
|
|
BLAKE2b-256 checksum How to use checksums |
2119605af58fa8572b52523b427bbb89e3559b547c1f277cd36581e8117997fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.14
|