From 594a9a13580cf58868d836adee3a5bbaebc42d12 Mon Sep 17 00:00:00 2001 From: Peter Corke Date: Thu, 30 Jul 2026 09:32:24 +1000 Subject: [PATCH 1/2] docs: switch sphinx-codeautolink to released 0.19.0, drop branch pin felix-hilden/sphinx-codeautolink#202 (typing.Self return-annotation resolution) merged upstream 2026-07-29 and shipped in the 0.19.0 PyPI release the same day. Verified directly: downloaded and inspected the 0.19.0 wheel, confirmed the same Self-handling code as the branch we'd been pinning to, and rebuilt the docs against it -- chained method calls like Image.Random(...).print() now cross-link correctly using the real release. Pin sphinx-codeautolink>=0.19.0 in pyproject.toml's docs extra (rather than leaving it unpinned) so the fix is guaranteed rather than incidentally whatever resolves, and drop the git+https branch override from docs/requirements.txt entirely. Removes the corresponding tech-debt.md entry about pinning CI to an unmerged branch, and adds a second real-world example (PR #24) of the ci.yml/pyproject.toml drift problem to the micromamba entry. --- docs/requirements.txt | 1 - pyproject.toml | 4 +- tech-debt.md | 219 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+), 3 deletions(-) create mode 100644 tech-debt.md diff --git a/docs/requirements.txt b/docs/requirements.txt index 567f9a09..142b6ca3 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,2 +1 @@ -e .[docs] -sphinx-autorun @ git+https://github.com/petercorke/sphinx-autorun.git diff --git a/pyproject.toml b/pyproject.toml index e1f92f19..62620cc1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -73,11 +73,11 @@ ros = ["rosbags", "roslibpy", "websockets"] docs = [ "sphinx", "pydata-sphinx-theme", - "sphinx-codeautolink", + "sphinx-codeautolink>=0.19.0", "sphinx-favicon", "sphinx-copybutton", "sphinxcontrib-programoutput", - "sphinx-autorun", + "sphinx-pyrunblock", "sphinx-design", ] diff --git a/tech-debt.md b/tech-debt.md new file mode 100644 index 00000000..447f4c33 --- /dev/null +++ b/tech-debt.md @@ -0,0 +1,219 @@ +# Technical Debt + +## `Image.ncdf` is documented as deprecated but never warns + +`ncdf` (`src/machinevisiontoolbox/ImageWholeFeatures.py:511-523`) has a +`.. deprecated:: 2.0.0` docstring note pointing at `hist().cdf`, but unlike +every other deprecated method/property in this codebase (`rank`, `image`, +`A`, `to_int`, `to_float`, `thresh`, `ithresh`, `adaptive_threshold`, +`column`, etc. — all of which call `warnings.warn(..., DeprecationWarning, +stacklevel=2)`), `ncdf`'s body just returns `hist.cdf` directly with no +warning call. Callers get no runtime signal that they're using a +deprecated API. + +Found 2026-07-29 while auditing why `rankfilter()` was missing from the +Sphinx sidebar (unrelated bug, since fixed — see git history for +`docs/source/image_class.rst`, which also added a "Deprecated aliases" +section that now gives `ncdf` its own docs page like every other +deprecated alias). So this is purely a runtime-warning gap, not a docs +bug. + +### Fix + +Add the standard warning to `ncdf`, matching its sibling `cdf` property's +migration note: + +```python +warnings.warn( + "Deprecated in 2.0.0: use hist().cdf instead of ncdf.", + DeprecationWarning, + stacklevel=2, +) +``` + +This is a real code change (not docs-only), so bundle it with a `fix:` +commit when picked up rather than folding it into a docs-only change. + +## GitHub Actions versions are stale across most workflows + +Audited 2026-07-29 (prompted by a similar finding in another toolbox +repo). `docs.yml`'s actions have been bumped to current majors as part of +the same change that fixed the `Image` sidebar bug (see git history), but +the rest of `.github/workflows/` was deliberately left alone — bumping +`release.yml` touches the real PyPI publish pipeline and deserves its own +careful pass (per the release-safety rule in +`~/.claude/CLAUDE.md`: verify the actual release workflow file, don't +just bump and hope), not a drive-by alongside a docs fix. + +| Action | Pinned | Latest (2026-07-29) | Where | Gap | +|---|---|---|---|---| +| `actions/download-artifact` | v4 | v8 | `release.yml` | 4 majors | +| `actions/upload-artifact` | v4 | v7 | `release.yml` | 3 majors | +| `actions/checkout` | v6 | v7 | `ci.yml`, `release.yml` | 1 major | +| `actions/setup-python` | v6 | v7 | `release.yml` | 1 major | +| `googleapis/release-please-action` | v4 | v5 | `release-please.yml` | 1 major | +| `amannn/action-semantic-pull-request` | v5 | v6 | `commitlint.yml` | 1 major | +| `mamba-org/setup-micromamba` | v2 | v3 | `ci.yml` | 1 major | +| `codecov/codecov-action` | v6 | v7 | `ci.yml` | 1 major | +| `pypa/gh-action-pypi-publish` | `release/v1` | — | `release.yml` | none — floating tag, already tracks latest v1.x | + +`download-artifact` and `upload-artifact` are the standouts — 3-4 majors +behind, both used in `release.yml`'s build→publish artifact handoff. Most +of these `actions/*` majors turned out to be low-risk (mainly Node.js +runtime bumps: v24 requires Actions Runner ≥ v2.327.1, a non-issue on +GitHub-hosted runners), confirmed while bumping `docs.yml`, but +`download-artifact`/`upload-artifact` v4→v7/v8 haven't been checked for +breaking input/output changes yet — do that before bumping `release.yml`. + +### Fix + +For each remaining workflow file, check that action's release notes +between the pinned and latest major for actual breaking changes (not just +Node runtime bumps), then bump. Do `release.yml` last and most carefully +— it's the one that actually publishes to PyPI. Re-run +`.github/workflows/ci.yml` on a real PR after bumping it, since it's the +main test gate. + +## `ci.yml` uses conda/micromamba; every sibling toolbox uses plain pip + +Observed 2026-07-29, prompted directly by the opencv5 pin incident above +(a conda-forge-specific dependency-drift failure that plain pip installs +wouldn't have hit the same way, since `pyproject.toml`'s own +`opencv-python<5.0.0` / `opencv-contrib-python<5.0.0` pins would have +been honoured). `machinevision-toolbox-python/.github/workflows/ci.yml` +is the only one of Peter's toolbox CI configs that uses +`mamba-org/setup-micromamba` + a hand-maintained `create-args` package +list. Checked directly: + +| Repo | CI setup | +|---|---| +| robotics-toolbox-python | `actions/setup-python` + `pip install .[dev]` | +| bdsim | `actions/setup-python` + `pip install .[dev,bdedit]` | +| spatialmath-python | `actions/setup-python` + `pip install .[dev]` | +| **machinevision-toolbox-python** | **`mamba-org/setup-micromamba` + `create-args` package list** | + +This is a genuine outlier, apparently introduced by a conda-preferring +contributor at some point, not a deliberate MVTB-specific technical +requirement (MVTB's own `pyproject.toml` dependencies are ordinary PyPI +packages — `opencv-python`, `opencv-contrib-python`, etc. — nothing here +actually needs conda). Consequences of the mismatch, beyond one-off +annoyance: + +- Dependency pins in `pyproject.toml` (the pip-installable, publishable + package spec) don't apply to CI at all, since `ci.yml` never runs `pip + install .` against the conda env's packages the normal way — it + pre-installs everything via `create-args`, then does + `pip install .[dev] --no-deps --no-build-isolation` (explicitly + `--no-deps`, so pip's own resolver never even sees the pins). That's + exactly how CI silently drifted onto conda-forge's opencv 5.0.0 despite + `pyproject.toml` saying `<5.0.0` — see the opencv5 entry above. +- Doubles the maintenance surface for CI dependency changes: an + `environment.yml`-style `create-args` list to keep in sync with + `pyproject.toml`'s `dependencies`/`docs`/`dev` extras by hand, instead + of one source of truth. +- Inconsistent with every sibling repo, so fixes/conventions that get + worked out on RTB/bdsim/SMTB's CI don't transfer here without + translation, and vice versa (see `~/.claude/toolbox-infrastructure.md`'s + shared-infrastructure convention). + +**Second live example, 2026-07-29**: PR #24 (`feat/tools-extra`, adding a +new `tool` extra to `pyproject.toml` for optional `IPython`/`pygments` +support) fails CI with `mvtbtool requires IPython and pygments, which are +not installed (No module named 'IPython')` — because `ci.yml`'s +`create-args` package list was never updated to include them. A plain +`pip install .[dev,tool]`-style CI setup would have picked up the new +extra automatically; the hand-maintained conda list requires a manual, +easy-to-forget edit in a second place every time `pyproject.toml` gains a +new extra or dependency. + +### Fix + +Normalize to the same `actions/setup-python` + `pip install .[dev]` +pattern the other three repos use, dropping `mamba-org/setup-micromamba` +entirely. Before doing so, check *why* conda was introduced here in the +first place — search git blame/log on `ci.yml` for context — in case +there's a real reason (e.g. a native dependency that's painful via pip +on some platform) rather than just contributor preference. If no real +reason turns up, this is a straightforward rip-and-replace: swap the +`mamba-org/setup-micromamba` step for `actions/setup-python`, replace +`create-args` with `pip install .[dev]` (defining a `dev` extra in +`pyproject.toml` if one doesn't already exist, matching RTB/bdsim), and +drop the separate `libegl` conda-forge install step (find the pip/apt +equivalent, or confirm it's no longer needed). + +## opencv5 migration is in progress but not finished + +Discovered 2026-07-29 via CI failures on unrelated PRs (#25, and an +`ImageConstants.py` `Self`-import fix). `pyproject.toml` pins +`opencv-python<5.0.0` / `opencv-contrib-python<5.0.0`, i.e. the pip-based +install path deliberately caps below opencv5 because the codebase isn't +ready for it yet. But `.github/workflows/ci.yml`'s conda/micromamba +install used the bare `opencv` conda-forge package with no version +constraint — conda-forge has since published opencv 5.0.0, so CI silently +started testing against opencv5 while the actual pip-installable package +still targets opencv4. Result: CI now fails across the whole test matrix +(every OS × Python version) on API surface that changed between opencv4 +and opencv5 — confirmed causes: `cv2.BRISK_create` moved/renamed, +`cv2.aruco.estimatePoseSingleMarkers` removed/renamed, MSER indexing +return shape changed. Last known-green run on `main` was 2026-06-16; +conda-forge's opencv5 release landed sometime after that, so this wasn't +caused by any code change, just dependency drift. + +Fixed for now on branch `ci/pin-opencv-below-5`: pinned both `opencv` +occurrences in `ci.yml` (`test` and `codecov` jobs) to `opencv<5`, +matching `pyproject.toml`'s existing pip constraint. This unblocks CI but +does not do any opencv5 migration work itself. + +There is a separate, not-yet-finished branch (`opencv5`, this repo's +current working branch as of 2026-07-29) actively migrating the codebase +to support opencv5 — e.g. `src/machinevisiontoolbox/ImagePointFeatures.py` +has an uncommitted change from `cv2.BRISK_create` to +`cv2.xfeatures2d.BRISK_create`, presumably chasing opencv5's API +reorganization. **Do not casually bump the `ci.yml` opencv pin back up** +until that migration branch is actually merged and the full test suite +passes against opencv5 — re-check `pyproject.toml`'s pin at the same +time, since both need to move together. + +## Repo root is full of untracked scratch/junk files + +Observed 2026-07-29, pre-existing (not from this session's work). `git +status` on `opencv5` shows ~50 untracked files/dirs at the repo root and +scattered through `src/`, `docs/`, `examples/`, `tests/`, e.g.: stray +scratch scripts (`findimages.py`, `phone.py`, `sunday.py`, `readbag.py`, +`fmtparser.py`, `audit_typing.py`, `inspect_bag.py`, +`src/machinevisiontoolbox/cvfuncs.py`, `docbugs.py`, `newcameras.py`, +`test_skimage.py`, `testblobplots.py`), planning notes +(`CODEAUTOLINK_FORK_PLAN.md`, `MIGRATION.md`, `NOTES`, +`OPENCV_FUNCTIONS.md`/`OPENCV_FUNCTIONS-original.md`, +`plot_call_inventory.md`), build artifacts (`machinevision-toolbox-python.pdf`/`.svg`, +`machinevisiontoolbox.pdf`, `aruco0.pdf`, `aruco50.pdf`), stray media/data +(`flowers.jpg`, `xx.mp4`, `ss`, `bags/`, `examples/bus.jpg`, +`examples/street_scene.jpg`, `examples/yolo26n.pt`, +`packages/mvtb-data/mvtbdata/data/bunny.dat`, `.../images/tags.png`), +old Sphinx warning-log captures (`docs/warnings*.txt`, referenced by +`CODEAUTOLINK_FORK_PLAN.md`'s regression-corpus methodology — may still +be wanted), and a couple of loose `x.json` files. + +One item worth checking rather than just sweeping up: +`release-please-config.json` is untracked despite `release-please.yml` +requiring it (`config-file: release-please-config.json`) — if that's +really never been committed, `release-please` may only be working by +accident (whatever's on disk locally) and would break for anyone else's +checkout / a fresh CI runner. Worth confirming before cleanup, not after. + +Also 4 pre-existing modified-but-uncommitted tracked files as of +2026-07-29: `README.md`, `src/machinevisiontoolbox/ImagePointFeatures.py`, +`src/machinevisiontoolbox/bin/imtool.py`, `tests/base/test_graphics.py` +— not touched this session. `ImagePointFeatures.py`'s change is very +likely in-progress work for the opencv5 migration (see below), not +junk — check before assuming any of these four are safe to discard. + +### Fix + +Triage into: (a) delete outright (build artifacts, one-off scratch +scripts that are clearly done), (b) commit properly if still wanted +(`release-please-config.json` almost certainly belongs in git), (c) move +to `.gitignore` if it's a recurring local-only output (e.g. the +`docs/warnings*.txt` capture files, if that workflow continues). Don't +bulk `git clean -xdf` without a human eyeballing the list first — some of +this may be in-progress work, not junk. From 20c219d65fdb68ca14d58777a08f0c29333303dd Mon Sep 17 00:00:00 2001 From: Peter Corke Date: Thu, 30 Jul 2026 10:03:38 +1000 Subject: [PATCH 2/2] docs: fix Image class sidebar, cut over to sphinx-pyrunblock Root cause of rankfilter() missing from the sidebar: image_class.rst's autosummary blocks lost their :toctree: stubs argument in commit 333fff7 (2026-03-23), which silently broke stub-page generation for every Image method, not just rankfilter -- the sidebar (and every per-method doc page) has been effectively empty on the live published site since then. Restored :toctree: stubs to all blocks, fixed the ~rank -> ~rankfilter entry, and added a "Deprecated aliases" section (matching the existing sources.rst convention) so deprecated methods get a findable migration page instead of silently disappearing. Also cuts docs.yml/conf.py over from sphinx_autorun to sphinx_pyrunblock (now published to PyPI as sphinx-pyrunblock 1.0.0), and bumps docs.yml's actions to current majors (checkout, setup-python, upload-artifact, upload-pages-artifact, deploy-pages). Verified with real local builds throughout (250+ Image stub pages now generate; rankfilter's deprecation notice hyperlinks correctly). --- .github/workflows/docs.yml | 10 +++---- docs/source/conf.py | 6 ++-- docs/source/image_class.rst | 60 +++++++++++++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 10 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 23483782..f780e8c8 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -34,9 +34,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v7 with: python-version: "3.12" @@ -133,13 +133,13 @@ jobs: zip -r docs/build/html/mvtb_notebooks.zip docs/notebooks - name: Upload notebooks zip artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: mvtb_notebooks path: docs/build/html/mvtb_notebooks.zip if-no-files-found: error - - uses: actions/upload-pages-artifact@v3 + - uses: actions/upload-pages-artifact@v5 if: github.event_name == 'push' with: path: docs/build/html @@ -155,4 +155,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/docs/source/conf.py b/docs/source/conf.py index d5edd3de..c563087e 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -56,7 +56,7 @@ "sphinx.ext.doctest", "sphinx.ext.autosectionlabel", "sphinx.ext.inheritance_diagram", - "sphinx_autorun", + "sphinx_pyrunblock", "sphinx.ext.intersphinx", "sphinx_favicon", "sphinx_copybutton", @@ -69,8 +69,8 @@ autoclass_content = "both" # use __init__ or class docstring add_function_parentheses = False -# -- sphinx-autorun setup ---------------------------------------------------- -# options for spinx_autorun, used for inline examples +# -- sphinx-pyrunblock setup -------------------------------------------------- +# options for sphinx_pyrunblock, used for inline examples # choose UTF-8 encoding to allow for Unicode characters, eg. ansitable # Python session setup, turn off color printing for SE3, set NumPy precision autorun_languages = {} diff --git a/docs/source/image_class.rst b/docs/source/image_class.rst index fc38401a..6e793876 100644 --- a/docs/source/image_class.rst +++ b/docs/source/image_class.rst @@ -32,6 +32,7 @@ Image attributes Describe the attributes of an :class:`~machinevisiontoolbox.Image`. .. autosummary:: + :toctree: stubs :nosignatures: ~__repr__ @@ -53,6 +54,7 @@ Predicates Test attributes of an ``Image``. .. autosummary:: + :toctree: stubs :nosignatures: ~isbgr @@ -68,6 +70,7 @@ Color planes and channels Return information about the color planes of an ``Image`` instance. .. autosummary:: + :toctree: stubs :nosignatures: ~nplanes @@ -92,6 +95,7 @@ Image coordinates Describe the pixel coordinates of an ``Image``. .. autosummary:: + :toctree: stubs :nosignatures: ~contains @@ -107,6 +111,7 @@ NumPy pixel data Return ``Image`` pixel data as a NumPy array. .. autosummary:: + :toctree: stubs :nosignatures: ~array @@ -125,6 +130,7 @@ Getting pixels Access individual pixels or groups of pixels. .. autosummary:: + :toctree: stubs :nosignatures: ~__getitem__ @@ -137,6 +143,7 @@ Image datatype Describe or change the datatype of ``Image`` pixel values. .. autosummary:: + :toctree: stubs :nosignatures: ~astype @@ -161,6 +168,7 @@ Sub images Extract sub-images or planes from an ``Image`` instance. .. autosummary:: + :toctree: stubs :nosignatures: ~blue @@ -176,6 +184,7 @@ Color space and gamma Convert between color spaces and perform gamma encoding and decoding. .. autosummary:: + :toctree: stubs :nosignatures: ~chromaticity @@ -193,6 +202,7 @@ Composition Combine multiple ``Image`` instances into a single ``Image`` instance. .. autosummary:: + :toctree: stubs :nosignatures: ~anaglyph @@ -210,6 +220,7 @@ Monadic functions Operate elementwise on an ``Image`` instance and returns a new ``Image`` instance. .. autosummary:: + :toctree: stubs :nosignatures: ~abs @@ -230,6 +241,7 @@ Dyadic functions Operate elementwise on two ``Image`` instances and return a new ``Image`` instance. .. autosummary:: + :toctree: stubs :nosignatures: ~apply2 @@ -243,6 +255,7 @@ Linear filtering Linear filtering operations including convolution, corner and edge detection. .. autosummary:: + :toctree: stubs :nosignatures: ~canny @@ -266,6 +279,7 @@ Non-linear (morphological) filtering Variety of non-linear morphological operations. .. autosummary:: + :toctree: stubs :nosignatures: ~close @@ -277,7 +291,7 @@ Variety of non-linear morphological operations. ~medianfilter ~morph ~open - ~rank + ~rankfilter ~thin ~thin_animate ~triplepoint @@ -290,6 +304,7 @@ Image labeling Binary, greyscale and color image segmentation using various algorithms. .. autosummary:: + :toctree: stubs :nosignatures: ~labels_binary @@ -302,6 +317,7 @@ Image similarity Various scalar image similarity measures. .. autosummary:: + :toctree: stubs :nosignatures: ~ncc @@ -318,6 +334,7 @@ Shape changing Changing the shape of an ``Image`` instance. .. autosummary:: + :toctree: stubs :nosignatures: ~decimate @@ -336,6 +353,7 @@ Image distortion Distorting the image within an ``Image`` instance. .. autosummary:: + :toctree: stubs :nosignatures: ~interp2d @@ -353,6 +371,7 @@ Multiview operations Stereo image processing, rectification, and display. .. autosummary:: + :toctree: stubs :nosignatures: ~DSI_refine @@ -367,6 +386,7 @@ Tensor conversion Convert between ``Image`` objects and PyTorch tensors. .. autosummary:: + :toctree: stubs :nosignatures: ~tensor @@ -396,6 +416,7 @@ Arithmetic and bitwise logical operations can be performed elementwise on: .. autosummary:: + :toctree: stubs :nosignatures: ~__add__ @@ -422,6 +443,7 @@ Logical operations can be performed elementwise on: ``Image`` ☆ ``Image``. The result is always an ``Image`` with boolean pixel values: .. autosummary:: + :toctree: stubs :nosignatures: ~__eq__ @@ -443,6 +465,7 @@ Arithmetic and bitwise logical operations can be performed elementwise on: The result is always an ``Image``. A scalar value is broadcast across the whole image. .. autosummary:: + :toctree: stubs :nosignatures: ~__iadd__ @@ -464,6 +487,7 @@ A scalar value is broadcast across the whole image to create a new ``Image`` in In place stacking allows for planes to be appended. .. autosummary:: + :toctree: stubs :nosignatures: ~__imod__ @@ -473,6 +497,7 @@ Image statistics ---------------- .. autosummary:: + :toctree: stubs :nosignatures: ~max @@ -501,6 +526,7 @@ Histograms """""""""" .. autosummary:: + :toctree: stubs :nosignatures: ~hist @@ -510,6 +536,7 @@ Image moments """"""""""""" .. autosummary:: + :toctree: stubs :nosignatures: ~humoments @@ -522,6 +549,7 @@ Other """"" .. autosummary:: + :toctree: stubs :nosignatures: ~flatnonzero @@ -537,6 +565,7 @@ Region features Find homogeneous regions, text or fiducual tags. .. autosummary:: + :toctree: stubs :nosignatures: ~blobs @@ -549,6 +578,7 @@ Fiducial features ^^^^^^^^^^^^^^^^^ .. autosummary:: + :toctree: stubs :nosignatures: ~fiducial @@ -559,6 +589,7 @@ Line features Find lines in an image. .. autosummary:: + :toctree: stubs :nosignatures: ~Hough @@ -569,6 +600,7 @@ Point/corner features Find distincitive points in an image. .. autosummary:: + :toctree: stubs :nosignatures: ~AKAZE @@ -586,6 +618,7 @@ File ^^^^ .. autosummary:: + :toctree: stubs :nosignatures: ~metadata @@ -596,6 +629,7 @@ Graphical ^^^^^^^^^ .. autosummary:: + :toctree: stubs :nosignatures: ~disp @@ -606,6 +640,7 @@ Text ^^^^ .. autosummary:: + :toctree: stubs :nosignatures: ~print @@ -618,6 +653,7 @@ Comparison helpers Utilities for scalar equality checks between images. .. autosummary:: + :toctree: stubs :nosignatures: ~sameas @@ -628,6 +664,7 @@ Constant images Create images that are constant, random, or have a simple geometric pattern. .. autosummary:: + :toctree: stubs :nosignatures: ~Chequerboard @@ -648,6 +685,7 @@ Render simple graphical annotations into an image. The equivalent functions ``p from SpatialMath Toolbox create graphical overlays rather than changing the the image data. .. autosummary:: + :toctree: stubs :nosignatures: ~draw_box @@ -662,4 +700,22 @@ Test images ----------- Sometimes, for pedagogy and unit tests, it is helpful to create, process and numerically -display small example images. \ No newline at end of file +display small example images. + +Deprecated aliases +------------------- + +These names are kept for backward compatibility and will emit a deprecation warning. + +.. autosummary:: + :toctree: stubs + :nosignatures: + + ~A + ~adaptive_threshold + ~column + ~image + ~ithresh + ~ncdf + ~rank + ~thresh \ No newline at end of file