CHANGELOG.md
May 25, 2026 ยท View on GitHub
2.0.0 May 2026
-
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) - top-level of reST documentation now uses sphinx-design and a card-based TOC
- 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) idispcan now put text labels on colorbar ticks
Imageclass and core API- image NumPy array for pixel data
- deprecate
.Aproperty, setting.Anow raises an exception - systematic internal use of
._Afor array access .arrayfor user use, provide a read-only view of the pixel data
- deprecate
- uses
_image_typing.pyprotocol to resolveImagetype across mixins - improved color order and type logic
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- all are computed lazily
- 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 images
- now has a
pdfarugment to create an image with arbitary pixel-value distribution.
img1.sameas(img2)performs scalar equality checks across datatype/planes/pixels (img1 == img2remains element-wise)- image histogram properties
h,pdf,cf,cdfare now computed lazily, and each returns a 2-tuple of ndarays (statistic, x). These property names match those of theHistogramclass. They were formally calledh,cdf, andncdfand return just a single ndarray. __str__now includes image statistics like mean, std, median.- all "constant constructors" like
Zeros,Constant,Randometc. now have a consistent API with keyword argumentssize,dtype,colororder,like. Kernel.Gaussandsmoothwith a half-width butsigma=0will use a rule-of-thumb to estimate a goodsigmavalueshowpixelshas a major improvement in visual appearance, some parameters now gone. The animation window has been refactored intoshowwindow.examples/morphdemoshows this in action.rprintis a variant ofprintthat returns the image object, soimg = Image.Random(size=5).rprint()does an assignment toimgand displays the pixel values to stdout in one line.
- image NumPy array for pixel data
Histogramclass- now has a
pdfproperty for an estimated/empirical probability density function - cumulative frequency is renamed from
cdftocf;ncdfrenamed tocdf - now implemented using 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
- now has a
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() - added default color and linestyle to all plot functions. These all accept Matplotlib format string or keyword arguments for line styling
- 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; useFileArchiverank; userankfilterImage.Zeros(10)is nowImage.Zeros(size=10)Image.Constant(3,4,5)is nowImage.Constant(5, size=(3,4))Image.Random(10)is nowImage.Random(size=10)
-
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 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.