1.1.0 April 2026
-
Highlights
- support for ROS (bag files & streams) and PyTorch
- major rework across code, documentation, unit tests, and CI
- type hinting throughout and broad cleanup of lint/suppression issues
- extensive API and naming consistency work, including deprecation standardization
- massive use of CoPilot
-
Added
- image sources
ROSBagreads images and point clouds from ROS 1/2 bag filesROSTopicreads images and point clouds from live ROS 1/2 systems viarosbridgeImageSequence: a sequence of image objectsPointCloudSequence: a sequence of point cloud objectsTensorStack: reads images from a batch tensorLabelMeReader: returns image and shape data from a LabelMe JSON file
- CLI tools
bagtool: animate images or point clouds from a ROS 1/2 bag fileocrtool: write OCR text to stdout or JSON
- documentation
- ecosystem diagram
- new Sphinx sections for ROS, PyTorch, NumPy integration, and Jupyter
- code copy button for examples (strips
>>>prompts)
- image sources
-
Changed
- CI and packaging
- changed
masterbranch tomain - reworked and renamed CI files
- replaced
flake8withruff - added extras:
jupyter,pytorch,ros,ocr - added
allextra to install all optional extras - consolidated documentation and notebooks into
docs
- changed
- code quality
- tested with Python 3.13
- improved behaviour when Open3D is unavailable
- many more unit tests, with average coverage now > 50%
- consistent and PEP-conformant
repr()andstr()formatting - more consistent handling of lazy imports
- systematic use of
import cv2 - consistent naming of test files
- PEP 8/257-compliant import grouping and module docstrings
- revisited suppression comment tags for validity and currency
- normalized deprecation/warning/docstring language with explicit version tagging
- image I/O and display
ireadnow usescv2.imdecodeinstead of PIL, with internal refactor for corner casesiread_iteris an efficient lazy wildcard iteratoridispnow includes keyboard display and animation controls whenfpsoranimateis specified- fixed
idispissues with Jupyter Matplotlib backend selection (for example%matplotlib widget)
Imageclass and core API- uses
_image_typing.pyprotocol to resolveImagetype across mixins - improved color order and type logic
- systematic internal use of
._Afor NumPy array access Image(..., dtype=True)forces image dtype to match the ndarray; otherwise the smallest fitting dtype is selectedsizeoption supports turning pixel row/column data into 2D or 3D imagesImage.Tensor()andimg.tensor()for PyTorch import/export- statistics improvements:
sum,min,max,mean,std,medianforward arguments to NumPy (for exampleaxis)img.statsis now a property returning per-plane statisticsimg.printstats()prints formatted per-plane statistics
- thresholding improvements:
- native NumPy implementations for
otsuandtrianglethreshold estimators threshold_interactivereworked for Jupyter support
- native NumPy implementations for
- NaN/Inf handling:
img.numnanandimg.numinfpropertiesfixbad()for remediation- reporting in
repr()andstr()
- NumPy ufunc integration (for example
np.ceil(img)returns anImage) %operator stacks images plane-wise (for exampleimg1 % img2,img1 % 0)Image.Random()supports multi-channel imagesimg1.sameas(img2)performs scalar equality checks across datatype/planes/pixels (img1 == img2remains element-wise)
- uses
Histogramclass- now implemented on NumPy rather than OpenCV for wider dtype support
- works properly in Jupyter
- histogram computation moved to constructor
clipcontrols bin range behaviour- plotting options for
span,log,cursor, andstatsmarkers
Blobsclass- major internal refactor;
Blobis now a dataclass - improved handling of runt (single-pixel) blobs
- added
idmethod - new attributes/methods:
MER()/plot_MER(),MEC()/plot_MEC()
- major internal refactor;
- Image sources
- all sources are iterators and context managers, reworked the common abstract base class
- all sources inherit display/animation (
.disp()) and batch tensor (.tensor()) methods - all sources accept keyword arguments forwarded to
convert VideoCamerahas a newlistmethod showing camera name/id mappingVideoFile,WebCam, andEarthVieware unchanged
- CLI
- improved
--helpstrings and option ordering mvtbtoolsupports image preloading into the IPython namespace, autoreload, optional PyTorch import, andMVTB_OPTIONSenvironment variabletagtoolreports ArUco/April tags to stdout or JSON
- improved
- notebook support
- notebooks revamped and extended
threshold_interactiveworks in Jupyter- notebook workflows are unit-testable
- distributed as a ZIP built by GitHub Actions
- distributed in a zero-install JupyterLite environment (WASM + Emscripten)
- CI and packaging
-
Deprecated
iread(..., grey=...)andiread(..., gray=...); usemono=insteadimg.imageandimg.A; useimg.arrayimg.to_int()andimg.to_float(); useimg.array_as()column; useview1dthresh(); usethreshold()- threshold keyword
t; usethreshold - threshold keyword
opt; usemethod ithresh; usethreshold_interactiveadaptive_threshold; usethreshold_adaptive- legacy
Image.Constantpositional size form (for example migrate fromImage.Constant(10, 20, 30)toImage.Constant(30, size=(10, 20))) ImageCollection; useFileCollectionZipArchive; useFileArchive
-
Fixed
- resolved many Sphinx warnings
- resolved issues in plot/runblock examples
- improved OpenCV documentation link consistency where intersphinx is not effective
- fixed issues in
idispthat confused Jupyter Matplotlib backend selection
-
Miscellaneous
- generated OpenCV guard functions from OpenCV documentation for input validation
Kernelclass refactored to its own file- ROS synchronization support via
SyncROSStreams
1.0.2 January 2026
-
Imageclass-
warp_affinecan now warp an image into a given output image -
graphic primitives
-
create an ArUco marker
-
save as PDF
-
all the draw_xxx() functions in base now have wrappers as methods of
Image -
draw_xxx() now handle floating point arguments, rounding them to the neares int
-
improvements in name2color to handle image datatypes and colororder
-
-
FiducialCollection class, represent a generalized calibration board with AR tags
-
ArUcoBoard class, represent a generalized ArUco calibration board
-
changed to src folder layout, code is in src/machinevisiontoolbox
-
changed from setuptools to hatch
-
works if Open3D is not installed, it's always well behind in Python version support
-
removed numpy < 2.0 constraint, OpenCV now suppports numpy 2.x
-
working with Python 3.12 (except for Open3D)
-
added command line tools:
imtoolfor displaying images, exploring pixels, picking points, showing metadata etc. Works with your own images or those provided with MVTBtagtoolfor highlighting AR tags in images
1.0.1 March 2025
-
Imageclass.dicemethod, chops an image up into tiles, can be overlapping.Tile(columns=0)will arrange the tiles into a roughly square layout- Constant images, previously many of these could only generate square images, this is now generalized
.Chequerboardcreates a chequerboard pattern- set background color for image warp undefined pixels
- single plane images can have a colorplane name
- deprecate
colordict(), usecolororder2dict()instead Stringnow supports two string formats, can create color images- fixed bug with gamma="sRGB" which always returned a float image, type is now the same as passed
-
Blobs
- new methods for blob aligned box, plot_aligned_box,
plot_perimeteroptionsperimeter_hullconvex hull- fixed bug with runt blobs
-
Kernels
- added
Kernel.HGaussfor Hessian of Gaussian - added
Kernelrepr method,dispmethod ArUcoBoard class
- added
-
Camera models
- Fixed errors in some camera projection models
-
Point clouds
PointCloudnow has a "constructor" for depth images,PointCloud.DepthImage()
-
Miscellaneous
- Lots more code examples and plots
- Move decoratores scalar_result and array_result to machinevisiontoolbox.decorators.py
- improved unit testing
1.0.0 January 2025
-
Kernelmethods now returnKernelinstances rather than NumPy arrays. Methods that accept a kernel can accept aKernelinstance or a NumPy array. Methods exist to stringify or print a kernel. -
The indexing order of an
Imageobject (using square bracket__getitem__access) has changed and is nowimg[u,v]whereuis the column coordinate andvis the row coordinate. This is consistent with the column-first convention used across the Toolbox and is consistent with the$(u,v)$ coordinate system for images. But, this is the opposite order to that used for NumPy index on the underlying array, and to earlier versions of the Toolbox.- a 2-tuple of integers, select this pixel. If the image has multiple planes, the result is a vector over planes.
- a 3-tuple of integers, for a multiplane image select this pixel from the specified plane.
- a 2-tuple of slice objects, select this region. If the image has multiple planes, the result is a 3D array.
- a 3-tuple of slice objects, select this region of uv and planes
- an int, select this plane
- a string, select this named plane or planes
-
added
pixel(u,v)method for faster access to a single pixel value, scalar or vector. -
the children of a
Blobis now given as a list ofBlobobjects, not their indices within the overall list of blobs. This simplies traversing the blob hierarchy tree. Similarly, the parent is a reference to the parentBlobobject rather than an index, and isNoneif the blob has no parent (its parent is the background). -
Documentation overhaul, both in-code docstrings, and the organization of the overall Sphinx document.
-
Additional unit tests
-
Myriad minor bug fixes, see commit history.