Skip to content

zignal 0.5.0

Choose a tag to compare

@arrufat arrufat released this 02 Sep 13:40
· 235 commits to master since this release

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 isView to isContiguous by @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