[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3122076.svg)](https://doi.org/10.5281/zenodo.3122076)
PlantCV v3.3.0 adds new functionality and fixes several bugs and usability issues. Big thanks to HaleySchuhl, dschneiderch, JLJ90, huberma, and karnoldbio for work and guidance on the updates below.
**Summary of changes**:
* Added `plantcv.visualize` sub-package
* Moved `pseudocolor` and `histogram` into sub-package
* Added `colorize_masks` function to sub-package to make false-colored images from a set of binary masks (e.g. output masks from the naive Bayes classifier)
* Added `plantcv.opening` and `plantcv.closing` functions (removes salt and pepper noise)
* Added `plantcv.threshold.custom_range` function (threshold based on upper and lower values)
* Added `plantcv.within_frame` function (tests if object, in a binary image, is within the field of view)
* Added `plantcv.morphology` sub-package
* Added `skeletonize` function to sub-package (skeletonizes a binary image)
* Added `prune` function to sub-package (removes spurs from skeleton)
* Added `check_cycles` function to sub-package (checks for connected cycles in skeleton)
* Added `find_branch_pts` function to sub-package (finds branch points in skeleton)
* Added `find_tips` function to sub-package (finds tips in skeleton)
* Added `segment_skeleton` function to sub-package (segments a skeleton into component paths)
* Added `segment_sort` function to sub-package (sorts segments into primary and secondary groups)
* Added `segment_id` function to sub-package (plots/labels segment IDs)
* Added `segment_path_length` function to sub-package (calculates segment lengths)
* Added `segment_euclidean_length` function to sub-package (calculates segment Euclidean lengths)
* Added `segment_curvature` function to sub-package (calculates the ratio of path length to Euclidean length)
* Added `segment_angle` function to sub-package (calculates the overall angle of the segment)
* Added `segment_insertion_angle` function to sub-package (calculates the angle that a segment intersects another segment)
* Added `segment_tangent_angle` function to sub-package (calculates the angle between the tangents of the ends of each segment)
* Added `parallel` sub-package.
* The sub-package contains functions that were originally from the `plantcv-pipeline.py` script file
* Renamed `plantcv-pipeline.py` to `plantcv-workflow.py`
* Removed SQLite database and requirements. Data are now output in a JSON-formatted text file
* `plantcv.print_results` now outputs data in JSON format
* The `Outputs` class now stores data in a single dictionary
* Added `add_observation` method to the `Outputs` class. Allows user to add custom observations to the output
* Output observations are stored by a unique variable name along with a trait name, method, scale (units), data type, value, and label(s)
* Keep 1st generation sub contours when using 'largest' in `roi_objects`
* In `analyze_color`, color and color property scales now use the conventional scale for each type (e.g. hue is a value from 0-359 degrees while green is a value from 0-255)
* Added summary statistics for hue in `analyze_color`: median hue value, circular mean hue value, and the circular mean standard deviation of hue
* Removed the `bins` argument from `analyze_color`