zignal 0.5.0
A major release bringing computer vision capabilities, advanced filtering, and significant Python API improvements.
Highlights
Computer Vision
- ORB feature detection with FAST corners and binary descriptors
- Multi-scale image pyramids
Optimization
- Hungarian algorithm for optimal assignment problems
Image Processing
- Convolution framework with Gaussian blur, DoG, and Sobel filters
- Motion blur effects (linear and radial) with SIMD optimization
- 12 blend modes for advanced compositing
- Image transforms: rotation, warping, perspective
- PSNR quality metrics
Python Enhancements
- Matrix class with NumPy interoperability
- PCA (Principal Component Analysis) implementation
- Direct pixel access: image[y,x].r = 255
- Improved NumPy integration with strided arrays
- Arc drawing and enhanced Canvas API
- Modern type hints with comprehensive stubs
Architecture
- Refactored image module into logical sub-modules
- Dynamic SVD for runtime dimensions
- Enhanced font system with full Unicode support
- SIMD optimizations throughout
Breaking Changes
- Enum renames: InterpolationMethod → Interpolation, BlendMode → Blending
- Rectangle bounds now exclusive (was inclusive)
- Python: Canvas.draw_text parameter order changed
- Image constructor renames for clarity
Performance
- 2-5x speedup in filtering operations via SIMD
- Optimized integral images and convolution
- Channel-separated processing for better cache locality
What's Changed
- feat(image): add image rotation with interpolation by @arrufat in #92
- build: update zig version and c extern linkage by @arrufat in #93
- feat(python): add box blur method by @arrufat in #94
- feat(python): add Image.copy method by @arrufat in #95
- feat(python): add Image.sharpen method by @arrufat in #96
- refactor(rectangle)!: make bounds exclusive by @arrufat in #97
- feat(image): add insert method for image region placement by @arrufat in #98
- feat(python): add crop, extract, and insert methods by @arrufat in #99
- feat(image): add horizontal and vertical flip methods by @arrufat in #100
- feat(python): implement comparison for color types by @arrufat in #101
- feat(python): add psnr method by @arrufat in #102
- feature(python): add a file path for verbose error msg by @cih9088 in #103
- refactor(bindings): extract color utilities by @arrufat in #104
- feat(python): add image fill method by @arrufat in #105
- feat(python): add image view and is_view methods by @arrufat in #106
- docs(python): update readme with comprehensive examples by @arrufat in #107
- feat(image): add convolution and gaussian blur by @arrufat in #108
- feat(image): add difference of gaussians filter by @arrufat in #109
- feat(color)!: add advanced blending modes by @arrufat in #110
- feat(python): add blend method with blend modes by @arrufat in #111
- refactor(svd): separate static and dynamic SVD implementations by @arrufat in #112
- feat(font): refactor bitmap font system with dynamic unicode support by @arrufat in #113
- feat(python): add iteration and equality comparison by @arrufat in #114
- feat(python): allow int for extract size by @arrufat in #115
- feat(canvas): add arc drawing and filling functions by @arrufat in #116
- feat(python): add Python bindings for canvas arc by @arrufat in #117
- refactor(ArrayList): use ArrayList (unmanaged) by @arrufat in #118
- feat(perf): improve convolution and interpolation with channel separation by @arrufat in #119
- refactor(image)!: rename blur methods, add gaussian blur binding by @arrufat in #120
- feat: add ORB feature detection by @arrufat in #121
- feat(optimization): add Hungarian algorithm by @arrufat in #122
- feat(numeric): generalize matrix and assignment types by @arrufat in #123
- feat(image): add dupe method by @arrufat in #124
- feat(image): add multi-format support by @arrufat in #125
- refactor(image): make filtering stride-safe for views by @arrufat in #126
- feat(python): add image slice assignment and copy by @arrufat in #127
- refactor(image/filtering): refactor filtering and convolution helpers by @arrufat in #128
- refactor(image)!: rename image constructors by @arrufat in #129
- feat(python): add to_gray method to color types by @arrufat in #130
- fix(py/image): correctly detect Rgba objects for color init by @arrufat in #131
- refactor(python): generalize color parsing utility by @arrufat in #132
- refactor(python): streamline color bindings and validation by @arrufat in #133
- refactor(geometry): move color conversion to Point methods by @arrufat in #134
- feat(python-bindings): add Matrix type with NumPy interop by @arrufat in #135
- refactor(image): rename
isViewtoisContiguousby @arrufat in #136 - feat(python): add python bindings for assignment problem by @arrufat in #137
- build(python): include type stubs by @arrufat in #138
- feat(python): add optional blend mode to color.blend by @arrufat in #139
- feat(jpeg): add 4:4:4 chroma subsampling support by @arrufat in #140
- feat(jpeg): add 4:2:2 and 4:1:1 chroma subsampling by @arrufat in #142
- docs: fix typos by @kianmeng in #141
- feat(python) add sobel edge detection to Image class by @arrufat in #143
- refactor(pyimage): centralize PyImage creation and ownership by @arrufat in #144
- feat(python): add support for strided images in numpy interop by @arrufat in #145
- feat(python): enable direct pixel component assignment by @arrufat in #146
- test(python): consolidate binding tests to smoke tests by @arrufat in #147
- feat(image): add blend method for image compositing by @arrufat in #148
- refactor(image): make channel operations generic by @arrufat in #149
- feat(pixel-proxy): add color conversion and blend methods by @arrufat in #150
- feat(python): add motion blur image processing by @arrufat in #151
- refactor: rename InterpolationMethod enum to Interpolation by @arrufat in #152
- refactor(blending): rename BlendMode enum to Blending by @arrufat in #153
- feat(warp): add Image.warp and python transforms by @arrufat in #154
- feat(python): allow tuple for view rect parameter by @arrufat in #155
- refactor(display): rename ANSI terminal display modes to SGR by @arrufat in #156
- refactor(python): unify motion blur classes by @arrufat in #157
- feat(pca): add python bindings by @arrufat in #158
- refactor(image): split module into sub-modules by @arrufat in #159
- feat(image): add set_border method by @arrufat in #160
- feat(image): add get_rectangle method by @arrufat in #161
- fix(image): correct behavior of setBorder by @arrufat in #162
- feat(python): add iou/overlaps, extend intersect with tuple support by @arrufat in #163
- fix(python): don't allow None rectangle in Image.set_border by @arrufat in #164
- refactor(python): make transform init points mandatory by @arrufat in #165
- refactor(python): organize type registrations and methods by @arrufat in #166
New Contributors
Full Changelog: 0.4.1...0.5.0