| Title: | Tools for Plant Image Analysis |
|---|---|
| Description: | Tools for both single and batch image manipulation and analysis (Olivoto, 2022 <doi:10.1111/2041-210X.13803>) and phytopathometry (Olivoto et al., 2022 <doi:10.1007/S40858-021-00487-5>). The tools can be used for the quantification of leaf area, object counting, extraction of image indexes, shape measurement, object landmark identification, and Elliptical Fourier Analysis of object outlines (Claude (2008) <doi:10.1007/978-0-387-77789-4>). The package also provides a comprehensive pipeline for generating shapefiles with complex layouts and supports high-throughput phenotyping of RGB, multispectral, and hyperspectral orthomosaics. This functionality facilitates field phenotyping using UAV- or satellite-based imagery. |
| Authors: | Tiago Olivoto [aut, cre] (ORCID: <https://orcid.org/0000-0002-0241-9636>) |
| Maintainer: | Tiago Olivoto <[email protected]> |
| License: | GPL (>= 3) |
| Version: | 3.2.0 |
| Built: | 2026-10-08 17:09:52 UTC |
| Source: | https://github.com/nepem-ufsc/pliman |
image objectsSubsetting method for image objects
## S3 method for class 'image' x[i, j, k, ..., drop = FALSE]## S3 method for class 'image' x[i, j, k, ..., drop = FALSE]
x |
An |
i |
Row/X index or missing. |
j |
Column/Y index or missing. |
k |
Channel index or missing. |
... |
Additional arguments. |
drop |
Logical; whether to drop dimensions. |
High-performance C++ implementation of Enhanced Correlation Coefficient (ECC) maximization with multi-scale Gaussian pyramids for sub-pixel image alignment.
align_stack_cpp( images, ref_idx = 0L, method = "ecc", crop = TRUE, levels = 3L, max_iter = 50L, eps = 1e-04, verbose = TRUE )align_stack_cpp( images, ref_idx = 0L, method = "ecc", crop = TRUE, levels = 3L, max_iter = 50L, eps = 1e-04, verbose = TRUE )
images |
List of |
ref_idx |
0-indexed reference image index. |
method |
Character: |
crop |
Logical: automatically crop empty affine borders. |
levels |
Integer: number of pyramid levels (default: 3). |
max_iter |
Integer: max iterations per level (default: 50). |
eps |
Numeric: convergence tolerance (default: 1e-4). |
verbose |
Logical: print progress. |
A named list containing aligned, matrices, statuses, and crop_box.
analyze_objects() provides tools for counting and extracting object
features (e.g., area, perimeter, radius, pixel intensity, Haralick texture,
veins, and Fourier descriptors) in an image using an ultra-fast, cache-optimized
C++ computer vision engine. See more at the Details section.
analyze_objects_iter() provides an iterative section to measure object
features using an object with a known area.
plot.anal_obj() produces a histogram or density plot for object measures or
R, G, and B values when argument object_index is used in analyze_objects().
analyze_objects2() is maintained as an exact alias for analyze_objects().
analyze_objects( img, foreground = NULL, background = NULL, pick_palettes = FALSE, segment_objects = TRUE, viewer = get_pliman_viewer(), reference = FALSE, reference_area = NULL, back_fore_index = "R/(G/B)", fore_ref_index = "B-R", reference_img = NULL, reference_larger = FALSE, reference_smaller = FALSE, pattern = NULL, parallel = FALSE, workers = NULL, watershed = TRUE, veins = FALSE, sigma_veins = 1, veins_thinning = FALSE, veins_rel_erode = 0.005, ab_angles = FALSE, ab_angles_percentiles = c(0.25, 0.75), width_at = FALSE, width_at_percentiles = c(0.05, 0.25, 0.5, 0.75, 0.95), haralick = FALSE, har_nbins = 32, har_scales = 1, har_band = 1, smooth = FALSE, pcv = FALSE, pcv_niter = 100, resize = FALSE, trim = FALSE, fill_hull = FALSE, erode = FALSE, dilate = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, return_exact = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), invert = FALSE, object_size = "medium", sensitivity = "medium", area_mode = c("contour", "pixel"), index = "NB", r = 1, g = 2, b = 3, re = 4, nir = 5, swir = 6, object_index = NULL, pixel_level_index = FALSE, return_mask = FALSE, efourier = FALSE, nharm = 10, threshold = "Otsu", k = 0.1, windowsize = NULL, tolerance = NULL, extension = NULL, lower_noise = 0.1, rel_size = NULL, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, lower_eccent = NULL, upper_eccent = NULL, lower_circ = NULL, upper_circ = NULL, randomize = TRUE, nrows = 1000, plot = TRUE, show_original = TRUE, show_chull = FALSE, show_contour = FALSE, show_bbox = FALSE, contour_col = "red", contour_size = 1, show_lw = FALSE, show_background = TRUE, show_segmentation = FALSE, col_foreground = NULL, col_background = NULL, marker = "point", marker_col = "red", marker_size = NULL, save_image = FALSE, max_pixels = 2e+06, prefix = "proc_", dir_original = NULL, dir_processed = NULL, verbose = TRUE ) analyze_objects2( img, foreground = NULL, background = NULL, pick_palettes = FALSE, segment_objects = TRUE, viewer = get_pliman_viewer(), reference = FALSE, reference_area = NULL, back_fore_index = "R/(G/B)", fore_ref_index = "B-R", reference_img = NULL, reference_larger = FALSE, reference_smaller = FALSE, pattern = NULL, parallel = FALSE, workers = NULL, watershed = TRUE, veins = FALSE, sigma_veins = 1, veins_thinning = FALSE, veins_rel_erode = 0.005, ab_angles = FALSE, ab_angles_percentiles = c(0.25, 0.75), width_at = FALSE, width_at_percentiles = c(0.05, 0.25, 0.5, 0.75, 0.95), haralick = FALSE, har_nbins = 32, har_scales = 1, har_band = 1, smooth = FALSE, pcv = FALSE, pcv_niter = 100, resize = FALSE, trim = FALSE, fill_hull = FALSE, erode = FALSE, dilate = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, return_exact = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), invert = FALSE, object_size = "medium", sensitivity = "medium", area_mode = c("contour", "pixel"), index = "NB", r = 1, g = 2, b = 3, re = 4, nir = 5, swir = 6, object_index = NULL, pixel_level_index = FALSE, return_mask = FALSE, efourier = FALSE, nharm = 10, threshold = "Otsu", k = 0.1, windowsize = NULL, tolerance = NULL, extension = NULL, lower_noise = 0.1, rel_size = NULL, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, lower_eccent = NULL, upper_eccent = NULL, lower_circ = NULL, upper_circ = NULL, randomize = TRUE, nrows = 1000, plot = TRUE, show_original = TRUE, show_chull = FALSE, show_contour = FALSE, show_bbox = FALSE, contour_col = "red", contour_size = 1, show_lw = FALSE, show_background = TRUE, show_segmentation = FALSE, col_foreground = NULL, col_background = NULL, marker = "point", marker_col = "red", marker_size = NULL, save_image = FALSE, max_pixels = 2e+06, prefix = "proc_", dir_original = NULL, dir_processed = NULL, verbose = TRUE ) ## S3 method for class 'anal_obj' plot( x, which = "measure", measure = "area", type = c("density", "histogram"), ... ) ## S3 method for class 'anal_obj_ls' plot( x, which = "measure", measure = "area", type = c("density", "histogram"), ... ) analyze_objects_iter(pattern, known_area, verbose = TRUE, ...)analyze_objects( img, foreground = NULL, background = NULL, pick_palettes = FALSE, segment_objects = TRUE, viewer = get_pliman_viewer(), reference = FALSE, reference_area = NULL, back_fore_index = "R/(G/B)", fore_ref_index = "B-R", reference_img = NULL, reference_larger = FALSE, reference_smaller = FALSE, pattern = NULL, parallel = FALSE, workers = NULL, watershed = TRUE, veins = FALSE, sigma_veins = 1, veins_thinning = FALSE, veins_rel_erode = 0.005, ab_angles = FALSE, ab_angles_percentiles = c(0.25, 0.75), width_at = FALSE, width_at_percentiles = c(0.05, 0.25, 0.5, 0.75, 0.95), haralick = FALSE, har_nbins = 32, har_scales = 1, har_band = 1, smooth = FALSE, pcv = FALSE, pcv_niter = 100, resize = FALSE, trim = FALSE, fill_hull = FALSE, erode = FALSE, dilate = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, return_exact = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), invert = FALSE, object_size = "medium", sensitivity = "medium", area_mode = c("contour", "pixel"), index = "NB", r = 1, g = 2, b = 3, re = 4, nir = 5, swir = 6, object_index = NULL, pixel_level_index = FALSE, return_mask = FALSE, efourier = FALSE, nharm = 10, threshold = "Otsu", k = 0.1, windowsize = NULL, tolerance = NULL, extension = NULL, lower_noise = 0.1, rel_size = NULL, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, lower_eccent = NULL, upper_eccent = NULL, lower_circ = NULL, upper_circ = NULL, randomize = TRUE, nrows = 1000, plot = TRUE, show_original = TRUE, show_chull = FALSE, show_contour = FALSE, show_bbox = FALSE, contour_col = "red", contour_size = 1, show_lw = FALSE, show_background = TRUE, show_segmentation = FALSE, col_foreground = NULL, col_background = NULL, marker = "point", marker_col = "red", marker_size = NULL, save_image = FALSE, max_pixels = 2e+06, prefix = "proc_", dir_original = NULL, dir_processed = NULL, verbose = TRUE ) analyze_objects2( img, foreground = NULL, background = NULL, pick_palettes = FALSE, segment_objects = TRUE, viewer = get_pliman_viewer(), reference = FALSE, reference_area = NULL, back_fore_index = "R/(G/B)", fore_ref_index = "B-R", reference_img = NULL, reference_larger = FALSE, reference_smaller = FALSE, pattern = NULL, parallel = FALSE, workers = NULL, watershed = TRUE, veins = FALSE, sigma_veins = 1, veins_thinning = FALSE, veins_rel_erode = 0.005, ab_angles = FALSE, ab_angles_percentiles = c(0.25, 0.75), width_at = FALSE, width_at_percentiles = c(0.05, 0.25, 0.5, 0.75, 0.95), haralick = FALSE, har_nbins = 32, har_scales = 1, har_band = 1, smooth = FALSE, pcv = FALSE, pcv_niter = 100, resize = FALSE, trim = FALSE, fill_hull = FALSE, erode = FALSE, dilate = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, return_exact = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), invert = FALSE, object_size = "medium", sensitivity = "medium", area_mode = c("contour", "pixel"), index = "NB", r = 1, g = 2, b = 3, re = 4, nir = 5, swir = 6, object_index = NULL, pixel_level_index = FALSE, return_mask = FALSE, efourier = FALSE, nharm = 10, threshold = "Otsu", k = 0.1, windowsize = NULL, tolerance = NULL, extension = NULL, lower_noise = 0.1, rel_size = NULL, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, lower_eccent = NULL, upper_eccent = NULL, lower_circ = NULL, upper_circ = NULL, randomize = TRUE, nrows = 1000, plot = TRUE, show_original = TRUE, show_chull = FALSE, show_contour = FALSE, show_bbox = FALSE, contour_col = "red", contour_size = 1, show_lw = FALSE, show_background = TRUE, show_segmentation = FALSE, col_foreground = NULL, col_background = NULL, marker = "point", marker_col = "red", marker_size = NULL, save_image = FALSE, max_pixels = 2e+06, prefix = "proc_", dir_original = NULL, dir_processed = NULL, verbose = TRUE ) ## S3 method for class 'anal_obj' plot( x, which = "measure", measure = "area", type = c("density", "histogram"), ... ) ## S3 method for class 'anal_obj_ls' plot( x, which = "measure", measure = "area", type = c("density", "histogram"), ... ) analyze_objects_iter(pattern, known_area, verbose = TRUE, ...)
img |
The image to be analyzed. |
foreground, background, reference_img
|
A color palette for the foreground,
background, and reference object, respectively (optional). If a character
is used (e.g., |
pick_palettes |
Logical argument indicating whether the user needs to pick up the color palettes for foreground and background for the image. |
segment_objects |
Segment objects in the image? Defaults to |
viewer |
The viewer option for interactive plotting. |
reference |
Logical to indicate if a reference object is present in the image. |
reference_area |
The known area of the reference object. |
back_fore_index |
A character value to indicate the index to segment the
foreground (objects and reference) from the background. Defaults to |
fore_ref_index |
A character value to indicate the index to segment
objects and the reference object. Defaults to |
reference_larger, reference_smaller
|
Logical argument indicating when the larger/smaller object in the image must be used as the reference object. |
pattern |
A pattern of file name used to identify images to be imported. |
parallel |
If |
workers |
Number of parallel processes. |
watershed |
If |
veins |
Logical argument indicating whether vein features are computed per object. |
sigma_veins |
Fine Gaussian scale parameter for vein detection (default |
veins_thinning |
Logical value indicating whether Guo-Hall skeleton thinning should
be applied to detected veins (default |
veins_rel_erode |
Relative boundary erosion fraction of |
ab_angles |
Logical argument indicating whether apex and base angles should be computed. |
ab_angles_percentiles |
The percentiles indicating the heights of the object for angles. |
width_at |
Logical. If |
width_at_percentiles |
A vector of heights along the vertical axis of the object. |
haralick |
Logical value indicating whether Haralick features are computed. |
har_nbins |
An integer indicating the number of bins for the Haralick matrix. Defaults to 32. |
har_scales |
An integer vector indicating the number of scales for Haralick features. |
har_band |
The band to compute Haralick features (1 = R, 2 = G, 3 = B, or |
smooth |
Whether the object contours should be smoothed with |
pcv |
Computes the Perimeter Complexity Value? Defaults to |
pcv_niter |
An integer specifying the number of smoothing iterations for PCV. |
resize |
Resize the image before processing? |
trim |
Number of pixels removed from edges in the analysis. |
fill_hull |
Fill holes in the binary image? Defaults to |
opening, closing, filter, erode, dilate
|
Morphological operations (brush size), applied in hierarchical order. |
return_exact |
Logical. If |
filter_order |
Hierarchical order of morphological operations. |
invert |
Inverts the binary image if desired. |
object_size |
The size of the object ( |
sensitivity |
Sensitivity level for thresholding ( |
area_mode |
The method to compute object area ( |
index |
A character value specifying the index for conversion to binary image. |
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands, respectively. |
swir |
The short-wave infrared band. |
object_index |
If informed, the average index value for each object is returned. |
pixel_level_index |
Return indexes computed in |
return_mask |
Returns the mask for the analyzed image? |
efourier |
Logical argument indicating if Elliptical Fourier should be computed. |
nharm |
Number of harmonics for Fourier analysis. Defaults to 10. |
threshold |
The threshold method ( |
k, windowsize
|
Parameters for adaptive thresholding. |
tolerance |
Minimum height for watershed segmentation. |
extension |
Neighborhood radius for watershed segmentation. |
lower_noise |
Objects with area less than |
rel_size |
Relative size threshold as a fraction of mean object area. |
lower_size, upper_size
|
Lower and upper size limits for object filtering. |
topn_lower, topn_upper
|
Select top |
lower_eccent, upper_eccent, lower_circ, upper_circ
|
Eccentricity and circularity limits. |
randomize |
Randomize rows before training GLM model? |
nrows |
Number of rows to sample for GLM training. |
plot |
Show image after processing? |
show_original |
Show count objects on the original image? |
show_chull |
Show convex hull around objects? |
show_contour |
Show contour line around objects? |
show_bbox |
Show bounding box around objects? |
contour_col, contour_size
|
Color and size for contour line. |
show_lw |
Plot length and width lines on each object? |
show_background |
Show the background? |
show_segmentation |
Shows object segmentation colored with random permutations? |
col_foreground, col_background
|
Foreground and background colors. |
marker, marker_col, marker_size
|
Type, color, and size of object marker. |
save_image |
Save the image after processing? |
max_pixels |
Maximum number of pixels to render when plotting or saving. |
prefix |
Prefix for processed images. |
dir_original, dir_processed
|
Directories for original and processed images. |
verbose |
If |
x |
An object of class |
which |
Which to plot. Either 'measure' (object measures) or 'index'
(object index). Defaults to |
measure |
The measure to plot. Defaults to |
type |
The type of plot. Either |
... |
Additional arguments passed to methods. |
known_area |
Known area of template object in |
A binary image is first generated to segment the foreground and
background. The argument index is useful to choose a proper index to
segment the image (see image_binary() for more details). It is also
possible to provide color palettes for background and foreground (arguments
background and foreground, respectively). When this is used, a general
linear model (binomial family) is fitted to the RGB values to segment fore- and
background.
Then, the number of objects in the foreground is counted. By setting up
arguments such as lower_size and upper_size, it is possible to set a
threshold for lower and upper sizes of the objects, respectively. The
argument object_size or sensitivity can be used to set up pre-defined values of
tolerance and extension depending on the image resolution. This will
influence the watershed-based object segmentation. Users can also tune up
tolerance and extension explicitly for a better precision of watershed
segmentation.
If watershed = FALSE is used, all pixels for each connected set of
foreground pixels in img are set to a unique object. This is faster,
especially for a large number of objects, but it is not able to segment
touching objects.
There are some ways to correct the measures based on a reference object. If
a reference object with a known area (reference_area) is used in the image
and reference = TRUE is used, the measures of the objects will be
corrected, considering the unit of measure informed in reference_area.
There are two main ways to work with reference objects:
* The first is to provide a reference object that has a contrasting color with
both the background and object of interest. In this case, the arguments
back_fore_index and fore_ref_index can be used to define an index to
first segment the reference object and objects to be measured from the
background, then the reference object from objects to be measured.
* The second one is to use a reference object that has a similar color to the
objects to be measured, but has a contrasting size. For example, if we are
counting small brown grains, we can use a brown reference template that has
an area larger (says 3 times the area of the grains) and then uses
reference_larger = TRUE. With this, the larger object in the image will be
used as the reference object. This is particularly useful when images are
captured with background light. The argument reference_smaller can be used in the same way.
By using pattern, it is possible to process several images with common
pattern names that are stored in the current working directory or in the
subdirectory informed in dir_original. To speed up the computation time,
one can set parallel = TRUE.
analyze_objects_iter() can be used to process several images using an
object with a known area as a template. In this case, all the images in the
current working directory that match the pattern will be processed.
Additional measures:
If haralick = TRUE, the function computes 13 Haralick texture features for
each object based on a gray-level co-occurrence matrix (Haralick et al. 1973).
If efourier = TRUE is used, an Elliptical Fourier Analysis (Kuhl and
Giardina, 1982) is computed for each object contour using efourier().
If veins = TRUE, vein features are computed for each object using
Difference of Gaussians (DoG) bandpass filtering.
If ab_angles = TRUE, the apex and base angles of each object are
computed with poly_apex_base_angle().
If width_at = TRUE, the widths at given percentiles of object height are computed.
If pcv = TRUE, the Perimeter Complexity Value is computed.
An object of class anal_obj (single image) or anal_obj_ls (batch).
Tiago Olivoto [email protected]
Haralick, R.M., K. Shanmugam, and I. Dinstein. 1973. Textural Features for Image Classification. IEEE Transactions on Systems, Man, and Cybernetics SMC-3(6): 610–621. doi:10.1109/TSMC.1973.4309314
Kuhl, F. P., and Giardina, C. R. (1982). Elliptic Fourier features of a closed contour. Computer Graphics and Image Processing 18, 236-258.
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") obj <- analyze_objects(img) obj$statistics # Top-5 grains with largest area top <- analyze_objects(img, marker = "id", topn_upper = 5) top$results # Reference object correction img <- image_pliman("flax_grains.jpg") res <- analyze_objects(img, index = "GRAY", reference = TRUE, reference_area = 6, reference_larger = TRUE, lower_noise = 0.3) } if (interactive()) { library(pliman) img <- image_pliman("soy_green.jpg") rgb <- analyze_objects(img, marker = "id", object_index = "B", pixel_level_index = TRUE) # density of area plot(rgb) # histogram of perimeter plot(rgb, measure = "perimeter", type = "histogram") # density of the blue (B) index plot(rgb, which = "index") }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") obj <- analyze_objects(img) obj$statistics # Top-5 grains with largest area top <- analyze_objects(img, marker = "id", topn_upper = 5) top$results # Reference object correction img <- image_pliman("flax_grains.jpg") res <- analyze_objects(img, index = "GRAY", reference = TRUE, reference_area = 6, reference_larger = TRUE, lower_noise = 0.3) } if (interactive()) { library(pliman) img <- image_pliman("soy_green.jpg") rgb <- analyze_objects(img, marker = "id", object_index = "B", pixel_level_index = TRUE) # density of area plot(rgb) # histogram of perimeter plot(rgb, measure = "perimeter", type = "histogram") # density of the blue (B) index plot(rgb, which = "index") }
A lighter option to analyze_objects()
analyze_objects_minimal( img, segment_objects = TRUE, reference = FALSE, reference_area = NULL, back_fore_index = "R/(G/B)", fore_ref_index = "B-R", reference_larger = FALSE, reference_smaller = FALSE, pattern = NULL, parallel = FALSE, workers = NULL, watershed = TRUE, fill_hull = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, invert = FALSE, object_size = "medium", index = "NB", r = 1, g = 2, b = 3, re = 4, nir = 5, threshold = "Otsu", tolerance = NULL, extension = NULL, lower_noise = 0.1, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, lower_eccent = NULL, upper_eccent = NULL, lower_circ = NULL, upper_circ = NULL, plot = TRUE, show_original = TRUE, show_contour = TRUE, contour_col = "red", contour_size = 1, col_foreground = NULL, col_background = NULL, marker = FALSE, marker_col = NULL, marker_size = NULL, save_image = FALSE, max_pixels = 4e+06, prefix = "proc_", dir_original = NULL, dir_processed = NULL, verbose = TRUE ) ## S3 method for class 'anal_obj_minimal' plot( x, which = "measure", measure = "area", type = c("density", "histogram"), ... ) ## S3 method for class 'anal_obj_ls_minimal' plot( x, which = "measure", measure = "area", type = c("density", "histogram"), ... )analyze_objects_minimal( img, segment_objects = TRUE, reference = FALSE, reference_area = NULL, back_fore_index = "R/(G/B)", fore_ref_index = "B-R", reference_larger = FALSE, reference_smaller = FALSE, pattern = NULL, parallel = FALSE, workers = NULL, watershed = TRUE, fill_hull = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, invert = FALSE, object_size = "medium", index = "NB", r = 1, g = 2, b = 3, re = 4, nir = 5, threshold = "Otsu", tolerance = NULL, extension = NULL, lower_noise = 0.1, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, lower_eccent = NULL, upper_eccent = NULL, lower_circ = NULL, upper_circ = NULL, plot = TRUE, show_original = TRUE, show_contour = TRUE, contour_col = "red", contour_size = 1, col_foreground = NULL, col_background = NULL, marker = FALSE, marker_col = NULL, marker_size = NULL, save_image = FALSE, max_pixels = 4e+06, prefix = "proc_", dir_original = NULL, dir_processed = NULL, verbose = TRUE ) ## S3 method for class 'anal_obj_minimal' plot( x, which = "measure", measure = "area", type = c("density", "histogram"), ... ) ## S3 method for class 'anal_obj_ls_minimal' plot( x, which = "measure", measure = "area", type = c("density", "histogram"), ... )
img |
The image to be analyzed. |
segment_objects |
Segment objects in the image? Defaults to |
reference |
Logical to indicate if a reference object is present in the image. |
reference_area |
The known area of the reference object. |
back_fore_index |
A character value to indicate the index to segment the
foreground (objects and reference) from the background. Defaults to |
fore_ref_index |
A character value to indicate the index to segment
objects and the reference object. Defaults to |
reference_larger, reference_smaller
|
Logical argument indicating when the larger/smaller object in the image must be used as the reference object. |
pattern |
A pattern of file name used to identify images to be imported. |
parallel |
If |
workers |
Number of parallel processes. |
watershed |
If |
fill_hull |
Fill holes in the binary image? Defaults to |
opening, closing, filter, erode, dilate
|
Morphological operations (brush size), applied in hierarchical order. |
invert |
Inverts the binary image if desired. |
object_size |
The size of the object ( |
index |
A character value specifying the index for conversion to binary image. |
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands, respectively. |
threshold |
The threshold method ( |
tolerance |
Minimum height for watershed segmentation. |
extension |
Neighborhood radius for watershed segmentation. |
lower_noise |
Objects with area less than |
lower_size, upper_size
|
Lower and upper size limits for object filtering. |
topn_lower, topn_upper
|
Select top |
lower_eccent, upper_eccent, lower_circ, upper_circ
|
Eccentricity and circularity limits. |
plot |
Show image after processing? |
show_original |
Show count objects on the original image? |
show_contour |
Show contour line around objects? |
contour_col, contour_size
|
Color and size for contour line. |
col_foreground, col_background
|
Foreground and background colors. |
marker, marker_col, marker_size
|
Type, color, and size of object marker. |
save_image |
Save the image after processing? |
max_pixels |
Maximum number of pixels to render when plotting or saving. |
prefix |
Prefix for processed images. |
dir_original, dir_processed
|
Directories for original and processed images. |
verbose |
If |
x |
An object of class |
which |
Which to plot. Either 'measure' (object measures) or 'index'
(object index). Defaults to |
measure |
The measure to plot. Defaults to |
type |
The type of plot. Either |
... |
Additional arguments passed to methods. |
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") obj <- analyze_objects(img) obj$statistics } if (interactive()) { library(pliman) img <- image_pliman("soy_green.jpg") # Segment the foreground (grains) using the normalized blue index (NB, default) # Shows the average value of the blue index in each object rgb <- analyze_objects_minimal(img) # density of area plot(rgb) # histogram of area plot(rgb, type = "histogram") # or 'hist' }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") obj <- analyze_objects(img) obj$statistics } if (interactive()) { library(pliman) img <- image_pliman("soy_green.jpg") # Segment the foreground (grains) using the normalized blue index (NB, default) # Shows the average value of the blue index in each object rgb <- analyze_objects_minimal(img) # density of area plot(rgb) # histogram of area plot(rgb, type = "histogram") # or 'hist' }
Analyzes objects using shapefiles
analyze_objects_shp( img, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, prepare = FALSE, segment_objects = TRUE, viewer = get_pliman_viewer(), index = "R", r = 1, g = 2, b = 3, re = 4, nir = 5, shapefile = NULL, interactive = FALSE, plot = FALSE, parallel = FALSE, workers = NULL, watershed = TRUE, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, object_size = "medium", efourier = FALSE, object_index = NULL, veins = FALSE, width_at = FALSE, verbose = TRUE, invert = FALSE, ... )analyze_objects_shp( img, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, prepare = FALSE, segment_objects = TRUE, viewer = get_pliman_viewer(), index = "R", r = 1, g = 2, b = 3, re = 4, nir = 5, shapefile = NULL, interactive = FALSE, plot = FALSE, parallel = FALSE, workers = NULL, watershed = TRUE, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, object_size = "medium", efourier = FALSE, object_index = NULL, veins = FALSE, width_at = FALSE, verbose = TRUE, invert = FALSE, ... )
img |
An |
nrow, ncol
|
The number of rows and columns to generate the shapefile
when |
buffer_x, buffer_y
|
Buffering factor for the width and height, respectively, of each individual shape's side. A value between 0 and 0.5 where 0 means no buffering and 0.5 means complete buffering (default: 0). A value of 0.25 will buffer the shape by 25% on each side. |
prepare |
Logical value indicating whether to prepare the image for
analysis using |
segment_objects |
Segment objects in the image? Defaults to |
viewer |
The viewer option. If not provided, the value is retrieved
using |
index |
A character value specifying the index for conversion to binary image. |
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands, respectively. |
shapefile |
(Optional) An object created with |
interactive |
If |
plot |
Plots the processed images? Defaults to |
parallel |
If |
workers |
Number of parallel processes. |
watershed |
If |
opening, closing, filter, erode, dilate
|
Morphological operations (brush size), applied in hierarchical order. |
object_size |
Argument to control control the watershed segmentation.
See |
efourier |
Logical argument indicating if Elliptical Fourier should be computed. |
object_index |
If informed, the average index value for each object is returned. |
veins |
Logical argument indicating whether vein features are computed per object. |
width_at |
Logical. If |
verbose |
If |
invert |
Inverts the binary image if desired. |
... |
Aditional arguments passed on to analyze_objects. |
The analyze_objects_shp function performs object analysis on an
image and generates shapefiles representing the analyzed objects. The
function first prepares the image for analysis using the image_prepare()
function if the prepare argument is set to TRUE. If a shapefile object is
provided, the number of rows and columns for splitting the image is obtained
from the shapefile. Otherwise, the image is split into multiple sub-images
based on the specified number of rows and columns using the
object_split_shp() function. The objects in each sub-image are analyzed
using the analyze_objects() function, and the results are stored in a list.
If parallel processing is enabled, the analysis is performed in parallel
using multiple workers.
The output object provides access to various components of the analysis results, such as the analyzed object coordinates and properties. Additionally, the shapefiles representing the analyzed objects are included in the output object for further analysis or visualization.
An object of class anal_obj. See more details in the Value
section of analyze_objects().
if (interactive()) { library(pliman) # Computes the DGCI index for each flax leaf flax <- image_pliman("flax_leaves.jpg", plot =TRUE) res <- analyze_objects_shp(flax, nrow = 3, ncol = 5, plot = FALSE, object_index = "DGCI") plot(flax) plot(res$shapefiles) plot_measures(res, measure = "DGCI") }if (interactive()) { library(pliman) # Computes the DGCI index for each flax leaf flax <- image_pliman("flax_leaves.jpg", plot =TRUE) res <- analyze_objects_shp(flax, nrow = 3, ncol = 5, plot = FALSE, object_index = "DGCI") plot(flax) plot(res$shapefiles) plot_measures(res, measure = "DGCI") }
Most of the functions in pliman can be applied to a list of images, but this can be not
ideal to deal with lots of images, mainly if they have a high resolution. For
curiosity, a 6000 x 4000 image use nearly 570 Megabytes of RAM. So, it would be
impossible to deal with lots of images within R. apply_fun_to_img() applies a
function to images stored in a given directory as follows:
Create a vector of image names that contain a given pattern of name.
Import each image of such a list.
Apply a function to the imported image.
Export the mutated image to the computer.
If parallel is set to FALSE (default), the images are processed sequentially, which
means that one image needs to be imported, processed, and exported so that the other
image can be processed. If parallel is set to TRUE, the images are processed
asynchronously (in parallel) in separate R sessions (3) running in the background on
the same machine. It may speed up the processing time when lots of images need to be
processed.
apply_fun_to_imgs( pattern, fun, ..., dir_original = NULL, dir_processed = NULL, prefix = "", suffix = "", parallel = FALSE, workers = 3, verbose = TRUE )apply_fun_to_imgs( pattern, fun, ..., dir_original = NULL, dir_processed = NULL, prefix = "", suffix = "", parallel = FALSE, workers = 3, verbose = TRUE )
pattern |
A pattern to match the images' names. |
fun |
A function to apply to the images. |
... |
Arguments passed on to |
dir_original, dir_processed
|
The directory containing the original and processed
images. Defaults to |
prefix, suffix
|
A prefix and/or suffix to be included in the name of processed
images. Defaults to |
parallel |
If |
workers |
A positive numeric scalar or a function specifying the number of parallel processes that can be active at the same time. Defaults to 3. |
verbose |
Shows the progress in console? Defaults to |
Nothing. The processed images are saved to the current working directory.
# apply_fun_to_imgs("pattern", image_resize, rel_size = 50)# apply_fun_to_imgs("pattern", image_resize, rel_size = 50)
image pixel values to numeric vectorCoerce image pixel values to numeric vector
## S3 method for class 'image' as.numeric(x, raw_to_scale = TRUE, ...)## S3 method for class 'image' as.numeric(x, raw_to_scale = TRUE, ...)
x |
An |
raw_to_scale |
Logical; if |
... |
Unused. |
image to standard R raster matrixConvert image to standard R raster matrix
## S3 method for class 'image' as.raster(x, ...)## S3 method for class 'image' as.raster(x, ...)
x |
An |
... |
Unused. |
Combines multiple yolo_fewshot_model objects into a multi-class few-shot model.
## S3 method for class 'yolo_fewshot_model' c(...)## S3 method for class 'yolo_fewshot_model' c(...)
... |
|
A yolo_fewshot_multimodel object.
Calibrating the actual size is possible if any interlandmark distance on the image is known. calibrate() can be used to determine the size of a known distance (cm) on the graph. I invite users to photograph the object together with a scale (e.g., ruler, micrometer...).
calibrate(img, viewer = get_pliman_viewer())calibrate(img, viewer = get_pliman_viewer())
img |
An |
viewer |
The viewer option. If not provided, the value is retrieved
using |
A numeric (double) scalar value indicating the scale (in pixels per
unit of known distance).
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
if(isTRUE(interactive())){ library(pliman) #### compute scale (dots per unit of known distance) #### # only works in an interactive section # objects_300dpi.jpg has a known resolution of 300 dpi img <- image_pliman("objects_300dpi.jpg") # Larger square: 10 x 10 cm # 1) Run the function calibrate() # 2) Use the left mouse button to create a line in the larger square # 3) Declare a known distance (10 cm) # 4) See the computed scale (pixels per cm) calibrate(img) # scale ~118 # 118 * 2.54 ~300 DPI }if(isTRUE(interactive())){ library(pliman) #### compute scale (dots per unit of known distance) #### # only works in an interactive section # objects_300dpi.jpg has a known resolution of 300 dpi img <- image_pliman("objects_300dpi.jpg") # Larger square: 10 x 10 cm # 1) Run the function calibrate() # 2) Use the left mouse button to create a line in the larger square # 3) Declare a known distance (10 cm) # 4) See the computed scale (pixels per cm) calibrate(img) # scale ~118 # 118 * 2.54 ~300 DPI }
Computes several statistics to evaluate the agreement and accuracy between observed (real) and predicted values. It includes Lin's Concordance Correlation Coefficient (CCC), Pearson's correlation, Willmott's index of agreement, and error metrics like RMSE and Bias.
ccc(data, real, predito)ccc(data, real, predito)
data |
A data frame or a grouped data frame ( |
real |
The column containing the observed/reference values. |
predito |
The column containing the predicted/estimated values. |
The function evaluates model performance through different lenses:
Precision: Pearson's r and r2 measure how well the predicted values
follow a linear relationship with the observed values.
Accuracy/Agreement: ccc and d measure how close the predictions
are to the 1:1 line (perfect agreement).
Error magnitude: rmse, mae, and rrmse quantify the average
deviation in absolute and relative terms.
Directional Bias: bias indicates if the model consistently overestimates
(positive) or underestimates (negative) the real values.
Lin's CCC is defined as:
Willmott's index of agreement (d) is defined as:
A data frame with the following columns:
r: Pearson correlation coefficient.
r2: Coefficient of determination (R-squared).
ccc: Lin's Concordance Correlation Coefficient.
d: Willmott's Index of Agreement.
rmse: Root Mean Squared Error.
rrmse: Relative Root Mean Squared Error (%).
mae: Mean Absolute Error.
bias: Mean bias error.
library(dplyr) library(pliman) df <- data.frame( group = rep(c("A", "B"), each = 5), real = c(1:5, 2:6), predicted = c(1.1, 2, 2.9, 4.1, 5, 2.2, 3.1, 4, 4.8, 6.1) ) # Without grouping ccc(df, real, predicted) # With grouping df |> group_by(group) |> ccc(real, predicted)library(dplyr) library(pliman) df <- data.frame( group = rep(c("A", "B"), each = 5), real = c(1:5, 2:6), predicted = c(1.1, 2, 2.9, 4.1, 5, 2.2, 3.1, 4, 4.8, 6.1) ) # Without grouping ccc(df, real, predicted) # With grouping df |> group_by(group) |> ccc(real, predicted)
Deletes cached .rds files used by functions such as object_scatter().
You can either remove the entire cache directory or only files older
than a given number of days.
clear_pliman_cache(all = TRUE, days = NULL)clear_pliman_cache(all = TRUE, days = NULL)
all |
Logical. If |
days |
Integer (optional). If provided, removes only files older than
|
Invisibly returns TRUE if the operation was successful.
if(interactive()){ # Clear everything clear_pliman_cache() # Clear only files older than 7 days clear_pliman_cache(all = FALSE, days = 7) }if(interactive()){ # Clear everything clear_pliman_cache() # Clear only files older than 7 days clear_pliman_cache(all = FALSE, days = 7) }
Provides the standard reference RGB values for the 24-patch ColorChecker Classic (Macbeth) chart in sRGB D65 color space.
colorchecker_ref(chart = c("colorchecker24", "macbeth"))colorchecker_ref(chart = c("colorchecker24", "macbeth"))
chart |
The reference chart standard. Currently |
A data.frame with 24 rows and columns:
id: Patch identifier (1 to 24).
code: Patch code (No.001 to No.024).
name: Descriptive name of the color patch.
R, G, B: Standard reference sRGB values (0-255 scale).
ref_R, ref_G, ref_B: Alias reference columns.
ref <- colorchecker_ref() head(ref)ref <- colorchecker_ref() head(ref)
Extracts the external contour of each object in a labeled matrix (e.g., from watershed segmentation). It returns a list of coordinates for each object.
contour(labels)contour(labels)
labels |
A labeled |
A list where each element is a matrix of (x, y) coordinates for the contour of the respective object.
library(pliman) # generate a binary image img <- image_pliman("soybean_touch.jpg") bin <- image_binary(img, "B")[[1]] # watershed segmentation wat <- image_watershed(bin) # extract contours cont <- contour(wat) plot(img) plot_contour(cont, col = "red", lwd = 2)library(pliman) # generate a binary image img <- image_pliman("soybean_touch.jpg") bin <- image_binary(img, "B")[[1]] # watershed segmentation wat <- image_watershed(bin) # extract contours cont <- contour(wat) plot(img) plot_contour(cont, col = "red", lwd = 2)
A list of contour outlines from five leaves. It may be used as
example in some functions such as efourier()
A list with five objects
leaf_1
leaf_2
leaf_3
leaf_4
leaf_5
Each object is a data.frame with the coordinates for the outline perimeter
Tiago Olivoto [email protected]
Personal data. The images were obtained in the Flavia data set downlodable at https://flavia.sourceforge.net/
Fast C++ raster extraction engine without GDAL
cpp_extract_raster( values, n_row, n_col, n_lyr, bbox_raster, geoms_r, fun = as.character(c("none")), exact = FALSE, return_coverage_area = FALSE, subdiv = 10L, summarize_quantiles = as.numeric(c(0.05, 0.975)) )cpp_extract_raster( values, n_row, n_col, n_lyr, bbox_raster, geoms_r, fun = as.character(c("none")), exact = FALSE, return_coverage_area = FALSE, subdiv = 10L, summarize_quantiles = as.numeric(c(0.05, 0.975)) )
values |
Matrix of raster values (ncell x nlyr). |
n_row |
Number of raster rows. |
n_col |
Number of raster columns. |
n_lyr |
Number of raster layers. |
bbox_raster |
Vector c(xmin, xmax, ymin, ymax). |
geoms_r |
Rcpp::List of polygon geometries for each feature. |
fun |
CharacterVector of summary functions ("none", "mean", "median", "sum", "min", "max", "sd", "count", "quantile", "quantiles"). |
exact |
Logical, whether to compute exact pixel area fraction coverage. |
return_coverage_area |
Logical, whether to include coverage_area column in raw pixel output. |
subdiv |
Number of subdivisions per dimension when exact = TRUE. |
summarize_quantiles |
NumericVector of quantile probabilities (between 0 and 1) when "quantiles" is requested. |
This function generates a custom color palette using the specified colors and number of colors.
custom_palette( colors = c("yellow", "#53CC67", "#009B95", "#00588B", "#4B0055"), n = 5 )custom_palette( colors = c("yellow", "#53CC67", "#009B95", "#00588B", "#4B0055"), n = 5 )
colors |
A vector of colors to create the color palette. Default is c("steelblue", "salmon", "forestgreen"). |
n |
The number of gradient colors in the color palette. Default is 100. |
A vector of colors representing the custom color palette.
# Generate a custom color palette with default colors and 10 colors custom_palette() # Generate a custom color palette with specified colors and 20 colors custom_palette(colors = c("blue", "red"), n = 20) # example code library(pliman) custom_palette(n = 5)# Generate a custom color palette with default colors and 10 colors custom_palette() # Generate a custom color palette with specified colors and 20 colors custom_palette(colors = c("blue", "red"), n = 20) # example code library(pliman) custom_palette(n = 5)
Fast morphological dilation
dilate_cpp(img, raio = 3L, forma = "disc")dilate_cpp(img, raio = 3L, forma = "disc")
img |
A logical matrix representing the binary image. |
raio |
Radius of the structuring element (integer >= 1). |
forma |
Shape of the structuring element ("disc" or "square"). |
Computes the distance map transform of a binary image. The distance map is a matrix which contains for each pixel the distance to its nearest background pixel.
dist_transform(binary, normalize = FALSE)dist_transform(binary, normalize = FALSE)
binary |
A binary |
normalize |
Logical argument indicating whether the distance map should
be normalized to the 0-1 range. Defaults to |
An image object or an array, with pixels containing the distances
to the nearest background points
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") binary <- image_binary(img, "B")[[1]] wts <- dist_transform(binary) range(wts) }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") binary <- image_binary(img, "B")[[1]] wts <- dist_transform(binary) range(wts) }
dl_extract_phenotypes() bridges deep learning inference with botanical, agronomic,
and biological measurement. It extracts granular phenotypes for every detected instance
(seeds, fruits, leaves, lesions, roots) predicted by image_detect_dl(), image_segment_dl(),
or image_detect_sahi().
Extracted traits include:
Morphometry: Area (pixels and physical units like cm^2), perimeter, circularity, solidity, eccentricity, aspect ratio, and major/minor axes.
Spectral Color Profiles: Mean R, G, B channels and user-selected vegetation/color indices (e.g., VARI, NGRDI, GLI, BGI).
Texture Features: Haralick contrast, entropy, correlation, and homogeneity.
Phytopathology & Severity: Automated disease severity percentage ((Lesion Area / Host Area) * 100) grouped per leaf.
dl_extract_phenotypes( data, img = NULL, pixel_size = NULL, extract_indexes = c("R", "G", "B", "VARI", "NGRDI"), haralick = FALSE, severity = FALSE, host_class = "leaf", lesion_class = "lesion", verbose = TRUE )dl_extract_phenotypes( data, img = NULL, pixel_size = NULL, extract_indexes = c("R", "G", "B", "VARI", "NGRDI"), haralick = FALSE, severity = FALSE, host_class = "leaf", lesion_class = "lesion", verbose = TRUE )
data |
A prediction object returned by |
img |
An optional |
pixel_size |
Optional numeric scalar representing physical size per pixel (e.g. |
extract_indexes |
Character vector of color indices to calculate per instance.
Defaults to |
haralick |
Logical. Whether to extract Haralick texture features. Defaults to |
severity |
Logical. Whether to calculate disease severity percentages. Defaults to |
host_class |
Character string naming the host plant class (e.g., |
lesion_class |
Character string naming the symptom/lesion class (e.g., |
verbose |
Logical. Show progress messages. Defaults to |
An S3 object of class c("dl_phenotypes", "data.frame") containing per-object phenotypic traits.
## Not run: library(pliman) # Segment leaves and lesions res <- image_segment_dl("bean_rust.jpg", model = "bean_rust_yolo_seg.onnx") # Extract comprehensive phenotypes & disease severity pheno <- dl_extract_phenotypes(res, pixel_size = 0.02, severity = TRUE) head(pheno) ## End(Not run)## Not run: library(pliman) # Segment leaves and lesions res <- image_segment_dl("bean_rust.jpg", model = "bean_rust_yolo_seg.onnx") # Extract comprehensive phenotypes & disease severity pheno <- dl_extract_phenotypes(res, pixel_size = 0.02, severity = TRUE) head(pheno) ## End(Not run)
Computes Elliptical Fourier Analysis of closed outlines based on x and
y-coordinates coordinates.
efourier(x, nharm = 10, align = FALSE, center = FALSE, smooth_iter = 0)efourier(x, nharm = 10, align = FALSE, center = FALSE, smooth_iter = 0)
x |
A |
nharm |
An integer indicating the number of harmonics to use. Defaults to 10. |
align |
Align the objects before computing Fourier analysis? Defaults to
|
center |
Center the objects on the origin before computing Fourier
analysis? Defaults to |
smooth_iter |
The number of smoothing iterations to perform. This will
smooth the perimeter of the objects using |
Adapted from Claude (2008). pp. 222-223.
A list of class efourier with:
the harmonic coefficients (an, bn, cn and dn)
the estimates of the coordinates of the centroid of the configuration
(a0 and c0).
The number of rows (points) of the perimeter outline (nr).
The number of harmonics used (nharm).
The original coordinates (coords).
If x is a list of perimeter coordinates, a list of efourier objects will
be returned as an object of class iefourier_lst.
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
Kuhl, F. P., and Giardina, C. R. (1982). Elliptic Fourier features of a closed contour. Computer Graphics and Image Processing 18, 236-258. doi: doi:10.1016/0146-664X(82)90034-X
if (interactive()) { library(pliman) leaf1 <- contours[[4]] plot_polygon(leaf1) #### default options # 10 harmonics (default) # without alignment ef <- efourier(leaf1) efourier_coefs(ef) # object is aligned along the major caliper with `poly_align()` # object is centered on the origin with `poly_center()` # using a list of object coordinates ef2 <- efourier(contours, align = TRUE, center = TRUE) efourier_coefs(ef2) # reconstruct the perimeter of the object # Use only the first one for simplicity plot_polygon(contours[[1]] |> poly_align() |> poly_center()) efourier_inv(ef2[[1]]) |> plot_contour(col = "red", lwd = 4) }if (interactive()) { library(pliman) leaf1 <- contours[[4]] plot_polygon(leaf1) #### default options # 10 harmonics (default) # without alignment ef <- efourier(leaf1) efourier_coefs(ef) # object is aligned along the major caliper with `poly_align()` # object is centered on the origin with `poly_center()` # using a list of object coordinates ef2 <- efourier(contours, align = TRUE, center = TRUE) efourier_coefs(ef2) # reconstruct the perimeter of the object # Use only the first one for simplicity plot_polygon(contours[[1]] |> poly_align() |> poly_center()) efourier_inv(ef2[[1]]) |> plot_contour(col = "red", lwd = 4) }
Extracts the Fourier coefficients from objects computed with efourier() and
efourier_norm() returning a 'ready-to-analyze' data frame.
efourier_coefs(x)efourier_coefs(x)
x |
An object computed with |
A data.frame object
if (interactive()) { library(pliman) # a list of objects efourier(contours) |> efourier_coefs() # one object, normalized coefficients efourier(contours[[4]]) |> efourier_norm() |> efourier_coefs() }if (interactive()) { library(pliman) # a list of objects efourier(contours) |> efourier_coefs() # one object, normalized coefficients efourier(contours[[4]]) |> efourier_norm() |> efourier_coefs() }
Computes the sum of squared distances between the original data and
reconstructed outline. It allows examining reconstructed outlines with the
addition of successive contributing harmonics indicated in the argument
nharm.
efourier_error( x, nharm = NULL, type = c("error", "outline", "deviations"), plot = TRUE, ncol = NULL, nrow = NULL )efourier_error( x, nharm = NULL, type = c("error", "outline", "deviations"), plot = TRUE, ncol = NULL, nrow = NULL )
x |
An object computed with |
nharm |
An integer or vector of integers indicating the number of
harmonics to use. If not specified the number of harmonics used in |
type |
The type of plot to produce. By default, a line plot with the sum
of squared distances (y-axis) and the number of harmonics (x-axis) is
produced. If |
plot |
A logical to inform if a plot should be produced. Defaults to
|
ncol, nrow
|
The number of rows or columns in the plot grid. Defaults to
|
A list with the objects:
dev_points A list with the deviations (distances) from original and
predicted outline for each pixel of the outline.
data.frame object with the minimum, maximum and average
deviations (based on the outline points).
If x is an object of class efourier_lst, a list will be returned.
if (interactive()) { library(pliman) ef <- contours[[1]] |> efourier(nharm = 30) efourier_error(ef) efourier_error(ef, nharm = 30, type = "outline") efourier_error(ef, nharm = c(1, 4, 20), type = "deviations") }if (interactive()) { library(pliman) ef <- contours[[1]] |> efourier(nharm = 30) efourier_error(ef) efourier_error(ef, nharm = 30, type = "outline") efourier_error(ef, nharm = c(1, 4, 20), type = "deviations") }
Performs an inverse elliptical Fourier transformation to construct a shape,
given a list with Fourier coefficients computed with efourier().
efourier_inv(x, nharm = NULL, a0 = NULL, c0 = NULL, npoints = 500)efourier_inv(x, nharm = NULL, a0 = NULL, c0 = NULL, npoints = 500)
x |
An object of class |
nharm |
An integer indicating the number of harmonics to use. If not
specified the number of harmonics used in |
a0, c0
|
the estimates of the coordinates of the centroid of the
configuration. If |
npoints |
The number of interpolated points on the constructed outline. Defaults to 500. |
Adapted from Claude (2008). pp. 223.
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
if (interactive()) { library(pliman) plot_polygon(contours, aspect_ratio = 1) # without alignment ef <- efourier(contours, nharm = 10, align = FALSE) ief <- efourier_inv(ef) plot_contour(ief, col = "red", lwd = 2) }if (interactive()) { library(pliman) plot_polygon(contours, aspect_ratio = 1) # without alignment ef <- efourier(contours, nharm = 10, align = FALSE) ief <- efourier_inv(ef) plot_contour(ief, col = "red", lwd = 2) }
The first harmonic defines an ellipse that best fits the outlines. One can
use the parameters of the first harmonic to "normalize" the data so that they
can be invariant to size, rotation, and starting position of the outline
trace. This approach is referred to in the literature as the normalized
elliptic Fourier. efourier_norm() calculates a new set of Fourier
coefficients An, Bn, Cn, Dn that one can use for further multivariate
analyses (Claude, 2008).
efourier_norm(x, start = FALSE)efourier_norm(x, start = FALSE)
x |
An object computed with |
start |
Logical value telling whether the position of the starting point has to be preserved or not. |
Adapted from Claude (2008). pp. 226.
A list with the following components:
A, B, C, D for harmonic coefficients.
size the magnitude of the semi-major axis of the first fitting ellipse.
theta angle, in radians, between the starting and the semi-major axis of
the first fitting ellipse.
psi orientation of the first fitting ellipse
a0 and c0, harmonic coefficients.
lnef the concatenation of coefficients.
nharm the number of harmonics used.
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
if (interactive()) { library(pliman) leaf1 <- contours[[4]] plot_polygon(leaf1) # compute the Fourier coefficients ef <- efourier(leaf1) efourier_coefs(ef) # Normalized Fourier coefficients efn <- efourier_norm(ef) efourier_coefs(efn) }if (interactive()) { library(pliman) leaf1 <- contours[[4]] plot_polygon(leaf1) # compute the Fourier coefficients ef <- efourier(leaf1) efourier_coefs(ef) # Normalized Fourier coefficients efn <- efourier_norm(ef) efourier_coefs(efn) }
Computes an spectrum of harmonic Fourier power. The power is proportional to the harmonic amplitude and can be considered as a measure of shape information. As the rank of harmonic increases, the power decreases and adds less and less information. We can evaluate the number of harmonics that we must select, so their cumulative power gathers 99% of the total cumulative power (Claude, 2008).
efourier_power( x, first = TRUE, thresh = c(0.8, 0.85, 0.9, 0.95, 0.99, 0.999), plot = TRUE, ncol = NULL, nrow = NULL )efourier_power( x, first = TRUE, thresh = c(0.8, 0.85, 0.9, 0.95, 0.99, 0.999), plot = TRUE, ncol = NULL, nrow = NULL )
x |
An object of class |
first |
Logical argument indicating whether to include the first
harmonic for computing the power. See |
thresh |
A numeric vector indicating the threshold power. The number of harmonics needed for such thresholds will then be computed. |
plot |
Logical argument indicating whether to produce a plot. |
ncol, nrow
|
The number of rows or columns in the plot grid. Defaults to
|
Most of the shape "information" is contained in the first harmonic.
This is not surprising because this is the harmonic that best fits the
outline, and the size of ellipses decreases as for explaining successive
residual variation. However, one may think that the first ellipse does not
contain relevant shape information, especially when differences one wants
to investigate concern complex outlines. By using first = FALSE it is
possible to remove the first harmonic for this computation. When working on
a set of outlines, high-rank-harmonics can contain information that may
allow groups to be distinguished (Claude, 2008).
Adapted from Claude (2008). pp. 229.
A list with the objects:
cum_power, a data.frame object with the accumulated power depending on
the number of harmonics
min_harm The minimum number of harmonics to achieve a given power.
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
if (interactive()) { library(pliman) pw <- efourier(contours) |> efourier_power() }if (interactive()) { library(pliman) pw <- efourier(contours) |> efourier_power() }
Calculates a 'Fourier elliptical shape' given Fourier coefficients
efourier_shape( an = NULL, bn = NULL, cn = NULL, dn = NULL, n = 1, nharm = NULL, npoints = 150, alpha = 4, plot = TRUE )efourier_shape( an = NULL, bn = NULL, cn = NULL, dn = NULL, n = 1, nharm = NULL, npoints = 150, alpha = 4, plot = TRUE )
an |
The |
bn |
The |
cn |
The |
dn |
The |
n |
The number of shapes to generate. Defaults to 1. If more than one shape is used, a list of coordinates is returned. |
nharm |
The number of harmonics to use. It must be less than or equal to
the length of |
npoints |
The number of points to calculate. |
alpha |
The power coefficient associated with the (usually decreasing) amplitude of the Fourier coefficients. |
plot |
Logical indicating Whether to plot the shape. Defaults to |
efourier_shape can be used by specifying nharm and
alpha. The coefficients are then sampled in an uniform distribution
and this amplitude is then divided by . If alpha is lower than 1, consecutive coefficients will thus
increase. See Claude (2008) pp.223 for the maths behind inverse ellipitical
Fourier
Adapted from Claude (2008). pp. 223.
A list with components:
x vector of x-coordrdinates
y vector of y-coordrdinates.
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
if (interactive()) { library(pliman) # approximation of the third leaf's perimeter # 4 harmonics image_pliman("potato_leaves.jpg", plot = TRUE) efourier_shape(an = c(-7.34, 1.81, -1.32, 0.50), bn = c(-113.88, 21.90, -0.31, -6.14), cn = c(-147.51, -20.89, 0.66, -14.06), dn = c(-0.48, 2.36, -4.36, 3.03)) }if (interactive()) { library(pliman) # approximation of the third leaf's perimeter # 4 harmonics image_pliman("potato_leaves.jpg", plot = TRUE) efourier_shape(an = c(-7.34, 1.81, -1.32, 0.50), bn = c(-113.88, 21.90, -0.31, -6.14), cn = c(-147.51, -20.89, 0.66, -14.06), dn = c(-0.48, 2.36, -4.36, 3.03)) }
Produces a confidence ellipse that is an iso-contour of the Gaussian distribution, allowing to visualize a 2D confidence interval.
ellipse( x, conf = 0.95, np = 100, plot = TRUE, fill = "green", alpha = 0.3, random_fill = TRUE )ellipse( x, conf = 0.95, np = 100, plot = TRUE, fill = "green", alpha = 0.3, random_fill = TRUE )
x |
A |
conf |
The confidence level. Defaults to |
np |
Number of sampled points on the ellipse. |
plot |
Create a plot? Defaults to |
fill |
The color to fill the ellipse. Defaults to |
alpha |
The alpha value to define the opacity of ellipse. Defaults to
|
random_fill |
Fill multiple ellipses with random colors? Defaults to
|
A matrix with coordinates of points sampled on the ellipse.
Borrowed from Claude (2008), pp. 85
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
if (interactive()) { library(pliman) ellipse(contours) }if (interactive()) { library(pliman) ellipse(contours) }
This function calculates the Shannon entropy of a numeric vector.
entropy(x)entropy(x)
x |
A numeric vector containing the values for which entropy will be computed. |
A numeric value representing the entropy.
library(pliman) x <- c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4) entropy(x)library(pliman) x <- c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4) entropy(x)
Standard morphological erosion
erode_cpp(img, raio = 3L, forma = "disc")erode_cpp(img, raio = 3L, forma = "disc")
img |
A logical matrix representing the binary image. |
raio |
Radius of the structuring element (integer >= 1). |
forma |
Shape of the structuring element ("disc" or "square"). |
Fast external erosion
erode_external_cpp(img, raio = 3L, forma = "disc")erode_external_cpp(img, raio = 3L, forma = "disc")
img |
A logical matrix representing the binary image. |
raio |
Radius of the structuring element (integer >= 1). |
forma |
Shape of the structuring element ("disc" or "square"). |
Fast conservative erosion pipeline
erosao_conservativa(img, raio_erosao = 3L, raio_dilatacao = 3L, forma = "disc")erosao_conservativa(img, raio_erosao = 3L, raio_dilatacao = 3L, forma = "disc")
img |
A logical matrix representing the binary image. |
raio_erosao |
Radius for erosion step (integer >= 1). |
raio_dilatacao |
Radius for dilation step (integer >= 1). |
forma |
Shape of the structuring element ("disc" or "square"). |
Fast internal hole filling (with optional maximum hole size and neck distance check)
fill_holes_cpp(img, max_size = -1, min_neck_dist = 0)fill_holes_cpp(img, max_size = -1, min_neck_dist = 0)
img |
A logical matrix representing the binary image. |
max_size |
Maximum area (in pixels) of internal holes to fill. If <= 0 (default), fills all holes. |
min_neck_dist |
Minimum foreground thickness (distance to background) surrounding a hole to allow filling. Default = 0.0 (fill all internal holes). |
High-performance native tools for focus stacking in digital imaging and microscopy:
align_stack(): Sub-pixel image alignment and registration implemented natively
in C++ using multi-scale Gaussian pyramid Enhanced Correlation Coefficient (ECC)
maximization (affine motion or translation) to eliminate focus breathing, translation,
and rotation, with optional automatic border cropping. Zero external Python/OpenCV dependencies.
fuse_multifocus(): Multi-Focus Image Fusion (MFIF) supporting:
Deep learning ONNX models (e.g., IFCNN) with either hierarchical tournament tree
(strategy = "pyramid") or linear (strategy = "sequential") fusion.
Ultra-fast native C++ Modified Laplacian Extended Depth of Field (method = "laplacian"),
ideal for massive stacks of 50-500 images in < 1 second.
process_focus_stack(): Orchestrates the complete end-to-end focus stacking pipeline,
taking raw images, performing alignment, keyframe subsampling (max_frames), and fusion.
align_stack( images, reference_index = NULL, method = c("ecc", "translation", "orb"), crop = TRUE, levels = 3, max_iter = 50, eps = 1e-04, max_frames = NULL, verbose = TRUE, ... ) image_align_stack( images, reference_index = NULL, method = c("ecc", "translation", "orb"), crop = TRUE, levels = 3, max_iter = 50, eps = 1e-04, max_frames = NULL, verbose = TRUE, ... ) fuse_multifocus( images, method = c("ifcnn", "laplacian"), strategy = c("pyramid", "sequential"), blend = c("soft", "hard"), radius = 3, power = 6, max_frames = NULL, model = "ifcnn", engine = c("gpu", "cpu"), threads = 0L, device_id = -1L, verbose = TRUE, ... ) image_fuse_multifocus( images, method = c("ifcnn", "laplacian"), strategy = c("pyramid", "sequential"), blend = c("soft", "hard"), radius = 3, power = 6, max_frames = NULL, model = "ifcnn", engine = c("gpu", "cpu"), threads = 0L, device_id = -1L, verbose = TRUE, ... ) process_focus_stack( images, align = TRUE, align_method = c("ecc", "translation", "orb"), reference_index = NULL, crop = TRUE, levels = 3, max_iter = 50, eps = 1e-04, max_frames = NULL, method = NULL, fusion_method = c("ifcnn", "laplacian"), strategy = c("pyramid", "sequential"), blend = c("soft", "hard"), radius = 3, power = 6, model = "ifcnn", engine = c("gpu", "cpu"), threads = 0L, device_id = -1L, return_aligned = FALSE, verbose = TRUE, ... ) image_focus_stack( images, align = TRUE, align_method = c("ecc", "translation", "orb"), reference_index = NULL, crop = TRUE, levels = 3, max_iter = 50, eps = 1e-04, max_frames = NULL, method = NULL, fusion_method = c("ifcnn", "laplacian"), strategy = c("pyramid", "sequential"), blend = c("soft", "hard"), radius = 3, power = 6, model = "ifcnn", engine = c("gpu", "cpu"), threads = 0L, device_id = -1L, return_aligned = FALSE, verbose = TRUE, ... )align_stack( images, reference_index = NULL, method = c("ecc", "translation", "orb"), crop = TRUE, levels = 3, max_iter = 50, eps = 1e-04, max_frames = NULL, verbose = TRUE, ... ) image_align_stack( images, reference_index = NULL, method = c("ecc", "translation", "orb"), crop = TRUE, levels = 3, max_iter = 50, eps = 1e-04, max_frames = NULL, verbose = TRUE, ... ) fuse_multifocus( images, method = c("ifcnn", "laplacian"), strategy = c("pyramid", "sequential"), blend = c("soft", "hard"), radius = 3, power = 6, max_frames = NULL, model = "ifcnn", engine = c("gpu", "cpu"), threads = 0L, device_id = -1L, verbose = TRUE, ... ) image_fuse_multifocus( images, method = c("ifcnn", "laplacian"), strategy = c("pyramid", "sequential"), blend = c("soft", "hard"), radius = 3, power = 6, max_frames = NULL, model = "ifcnn", engine = c("gpu", "cpu"), threads = 0L, device_id = -1L, verbose = TRUE, ... ) process_focus_stack( images, align = TRUE, align_method = c("ecc", "translation", "orb"), reference_index = NULL, crop = TRUE, levels = 3, max_iter = 50, eps = 1e-04, max_frames = NULL, method = NULL, fusion_method = c("ifcnn", "laplacian"), strategy = c("pyramid", "sequential"), blend = c("soft", "hard"), radius = 3, power = 6, model = "ifcnn", engine = c("gpu", "cpu"), threads = 0L, device_id = -1L, return_aligned = FALSE, verbose = TRUE, ... ) image_focus_stack( images, align = TRUE, align_method = c("ecc", "translation", "orb"), reference_index = NULL, crop = TRUE, levels = 3, max_iter = 50, eps = 1e-04, max_frames = NULL, method = NULL, fusion_method = c("ifcnn", "laplacian"), strategy = c("pyramid", "sequential"), blend = c("soft", "hard"), radius = 3, power = 6, model = "ifcnn", engine = c("gpu", "cpu"), threads = 0L, device_id = -1L, return_aligned = FALSE, verbose = TRUE, ... )
images |
A list of |
reference_index |
Integer specifying the index of the base reference image
for alignment. If |
method |
Character specifying the method:
|
crop |
Logical. Should black/empty borders introduced by affine warping
be automatically cropped out? Defaults to |
levels |
Integer specifying number of pyramid levels for coarse-to-fine ECC alignment (default: 3). |
max_iter |
Integer specifying maximum iterations per pyramid level for ECC convergence (default: 50). |
eps |
Numeric threshold for ECC convergence (default: 1e-4). |
max_frames |
Optional integer. If provided and the image stack exceeds this number of frames,
automatically subsamples the stack to |
verbose |
Logical. If |
... |
Additional arguments passed to underlying functions. |
strategy |
Multi-image fusion strategy for deep learning ( |
blend |
Character specifying blending mode for Laplacian fusion: |
radius |
Integer specifying the local window radius for Laplacian sharpness aggregation (default: 3). |
power |
Numeric exponent for soft Laplacian blending weights (default: 6.0). |
model |
Character specifying the fusion ONNX model. Defaults to |
engine |
Execution engine: |
threads |
Integer number of threads for ONNX inference (0 for auto). |
device_id |
GPU device ID (-1 for default best detected GPU). |
align |
Logical. Should the image stack be aligned before fusion? Defaults to |
align_method |
Alignment method for |
fusion_method |
Multi-focus fusion method for |
return_aligned |
Logical. If |
align_stack(): A list of aligned Image objects with identical spatial dimensions.
fuse_multifocus(): An all-in-focus Image object.
process_focus_stack(): The fused Image object (or a list containing fused and aligned if return_aligned = TRUE).
Tiago Olivoto [email protected]
Zhang, Y., Liu, Y., Sun, P., Yan, H., Zhao, X., & Zhang, L. (2020). IFCNN: A general image fusion framework based on convolutional neural network. Information Fusion, 54, 99-118.
Evangelidis, G. D., & Psarakis, E. Z. (2008). Parametric image alignment using enhanced correlation coefficient maximization. IEEE Transactions on Pattern Analysis and Machine Intelligence, 30(10), 1858-1865.
## Not run: library(pliman) # Load or read a stack of multi-focus images imgs <- list( image_read("focus_frame1.jpg"), image_read("focus_frame2.jpg"), image_read("focus_frame3.jpg") ) # Fast automated pipeline with native C++ Modified Laplacian (zero-AI, ultra-fast) fused_lap <- process_focus_stack(imgs, fusion_method = "laplacian", blend = "soft") plot(fused_lap) # Deep learning IFCNN with hierarchical tournament pyramid reduction fused_dl <- process_focus_stack(imgs, fusion_method = "ifcnn", strategy = "pyramid") plot(fused_dl) # Handling large stacks (e.g. 200 frames from a focus rack video) # Automatically extract 25 key focal planes for alignment and fusion: fused_rack <- process_focus_stack(imgs, max_frames = 25, fusion_method = "laplacian") ## End(Not run)## Not run: library(pliman) # Load or read a stack of multi-focus images imgs <- list( image_read("focus_frame1.jpg"), image_read("focus_frame2.jpg"), image_read("focus_frame3.jpg") ) # Fast automated pipeline with native C++ Modified Laplacian (zero-AI, ultra-fast) fused_lap <- process_focus_stack(imgs, fusion_method = "laplacian", blend = "soft") plot(fused_lap) # Deep learning IFCNN with hierarchical tournament pyramid reduction fused_dl <- process_focus_stack(imgs, fusion_method = "ifcnn", strategy = "pyramid") plot(fused_dl) # Handling large stacks (e.g. 200 frames from a focus rack video) # Automatically extract 25 key focal planes for alignment and fusion: fused_rack <- process_focus_stack(imgs, max_frames = 25, fusion_method = "laplacian") ## End(Not run)
Ultra-fast analytical multi-focus image fusion using spatial Modified Laplacian (ML) energy maps. Ideal for large image stacks (50-500 images) where deep learning networks are computationally heavy.
fuse_laplacian_cpp(images, blend = "soft", radius = 3L, power = 6)fuse_laplacian_cpp(images, blend = "soft", radius = 3L, power = 6)
images |
List of aligned |
blend |
Character: |
radius |
Integer: smoothing window radius for local sharpness aggregation (default: 3). |
power |
Numeric: exponent weight for soft blending (default: 6.0). |
A fused Image object.
Automatically detects a ColorChecker chart in an image (or uses user-specified corners), maps each color patch using perspective-aware bilinear homography, and extracts pure nucleus color statistics using a dynamic negative buffer.
get_card_colors( img, reference = "colorchecker24", nrow = NULL, ncol = NULL, buffer = 0.45, margin_x = 0.05, margin_y = 0.07, corners = NULL, auto_orient = TRUE, index = "GRAY", erode = NULL, fill_hull = TRUE, stat = c("mean", "median"), plot = TRUE, verbose = TRUE, ... )get_card_colors( img, reference = "colorchecker24", nrow = NULL, ncol = NULL, buffer = 0.45, margin_x = 0.05, margin_y = 0.07, corners = NULL, auto_orient = TRUE, index = "GRAY", erode = NULL, fill_hull = TRUE, stat = c("mean", "median"), plot = TRUE, verbose = TRUE, ... )
img |
An |
reference |
Reference chart standard for comparison. Default |
nrow |
The number of rows of color patches. If |
ncol |
The number of columns of color patches. If |
buffer |
Negative buffer shrinkage fraction (0 to 1, default |
margin_x |
Outer horizontal border margin fraction (default |
margin_y |
Outer vertical border margin fraction (default |
corners |
Optional quadrilateral corners. Can be |
auto_orient |
Logical. If |
index |
Segmentation index used for auto-detecting the card (default |
erode |
Erosion kernel size for segmentation mask. If |
fill_hull |
Logical. Fill holes in the segmentation mask (default |
stat |
Primary statistic assigned to |
plot |
Logical. If |
verbose |
Logical. If |
... |
Legacy arguments ( |
The extraction employs a bilinear interpolation mapping:
Outer card margins (margin_x, margin_y) exclude the surrounding plastic/cardboard
frame. A dynamic negative buffer (buffer, default 45%) shrinks each nominal cell
inwards towards its center, ensuring pixel sampling is strictly restricted to the
homogeneous nucleus of the color chip, immune to edge glare, shadows, and plastic borders.
An object of class c("pliman_card_colors", "data.frame") containing:
id: Patch identifier (1 to nrow * ncol).
row, col: Grid row and column positions.
center_x, center_y: Pixel center coordinates.
R, G, B: Sampled primary RGB values (0-255 scale).
R_med, G_med, B_med: Median RGB values.
R_sd, G_sd, B_sd: Standard deviations per channel.
n_pixels: Number of pixels sampled in the nucleus.
If reference comparison is active: code, name, ref_R, ref_G, ref_B,
Delta_R, Delta_G, Delta_B, Delta_E, and Delta_E_Calib.
The object also stores attributes:
attr(res, "patches"): List of patch bounding boxes and polygon vertices.
attr(res, "corners"): Sorted corner coordinates (TL, TR, BR, BL).
attr(res, "wb_gains"): Calculated White Balance gains.
attr(res, "ccm"): Calculated 3x3 Color Correction Matrix.
attr(res, "avg_delta_raw"): Mean Euclidean color error () before calibration.
attr(res, "avg_delta_calib"): Mean after CCM 3x3 calibration.
if(interactive()){ library(pliman) img <- image_pliman("colorcheck.jpg") # Auto-detect card, auto-orient, and extract 24 patches with 45% negative buffer card <- get_card_colors(img) head(card) # View patch overlay plot(card) }if(interactive()){ library(pliman) img <- image_pliman("colorcheck.jpg") # Auto-detect card, auto-orient, and extract 24 patches with 45% negative buffer card <- get_card_colors(img) head(card) # View patch overlay plot(card) }
get_free_ram() retrieves the current available physical RAM of the system in real-time
using native OS system calls in C++ (GlobalMemoryStatusEx on Windows, sysconf on Linux,
and Mach Kernel host_statistics on macOS). It executes in microseconds with zero memory allocation.
get_free_ram(unit = c("GB", "MB", "KB", "B"))get_free_ram(unit = c("GB", "MB", "KB", "B"))
unit |
Character string specifying memory unit: |
A numeric value representing available system physical memory in the specified unit.
## Not run: library(pliman) # Get free RAM in GB get_free_ram() # Get free RAM in MB get_free_ram("MB") ## End(Not run)## Not run: library(pliman) # Get free RAM in GB get_free_ram() # Get free RAM in MB get_free_ram("MB") ## End(Not run)
Fast C++ retrieval of available system physical RAM in bytes (Windows, Linux, macOS)
get_free_ram_cpp()get_free_ram_cpp()
Retrieves the current value of the pliman_viewer option used in the package.
get_pliman_viewer()get_pliman_viewer()
The current value of the pliman_viewer option.
This function extracts a UUID (Universal Unique Identifier) from the filename, using a regular expression that specifically identifies the standard UUID format.
get_uuid(filename)get_uuid(filename)
filename |
A character vector containing filenames or strings |
A character vector with extracted UUIDs (or NA if none found)
library(pliman) file <- "Grãos - contagem_f68bca60-c8cf-4272-9448-3f28891a97cd.jpg" file2 <- "Grãos - contagem_f68bca60-c8cf-4272-9448-3f8891a97cd.jpg" get_uuid(file)library(pliman) file <- "Grãos - contagem_f68bca60-c8cf-4272-9448-3f28891a97cd.jpg" file2 <- "Grãos - contagem_f68bca60-c8cf-4272-9448-3f8891a97cd.jpg" get_uuid(file)
Generate ggplot2
ggplot_color(n = 1)ggplot_color(n = 1)
n |
The number of colors. This works well for up to about eight colours, but after that it becomes hard to tell the different colours apart. |
library(pliman) ggplot_color(n = 3)library(pliman) ggplot_color(n = 3)
Performs Generalized Procrustes Analysis (GPA) to align a set of shapes.
gpa(x, tol = 1e-05, max_iter = 100)gpa(x, tol = 1e-05, max_iter = 100)
x |
A list of coordinate matrices (e.g., from |
tol |
Tolerance for convergence. |
max_iter |
Maximum number of iterations. |
A list with components:
aligned: A list of the aligned shapes.
consensus: The consensus (mean) shape.
centroid_sizes: The centroid sizes of the original shapes.
iterations: The number of iterations until convergence.
image ObjectComputes an ultra-fast C++ pixel intensity histogram for image objects
of any storage mode (raw, logical, double, integer).
## S3 method for class 'image' hist( x, nbins = 256, plot = TRUE, col = NULL, main = NULL, xlab = "Pixel Value", ... )## S3 method for class 'image' hist( x, nbins = 256, plot = TRUE, col = NULL, main = NULL, xlab = "Pixel Value", ... )
x |
An |
nbins |
Integer specifying the number of bins (default 256 for uint8/normalized data). |
plot |
Logical; if |
col |
Color(s) used to fill the histogram bars. |
main |
Main title for the plot. |
xlab |
X-axis label. |
... |
Additional graphical arguments passed to |
A histogram S3 object (or list of histogram objects for multi-channel images) invisibly.
image class constructor and utilitiesimage creates or coerces objects into a memory-optimized image S3 object
in pliman. Storing pixel data efficiently (using 8-bit raw vectors by default)
provides up to 8x memory reduction compared to standard float64 double arrays.
image( data = raw(), colormode = NULL, colspace = "RGB", gamma = 1, storage = c("raw", "double", "integer", "logical"), ... ) as_image( data, colormode = NULL, colspace = "RGB", gamma = 1, storage = c("raw", "double", "integer", "logical"), dim = NULL, ... ) is_image(x)image( data = raw(), colormode = NULL, colspace = "RGB", gamma = 1, storage = c("raw", "double", "integer", "logical"), ... ) as_image( data, colormode = NULL, colspace = "RGB", gamma = 1, storage = c("raw", "double", "integer", "logical"), dim = NULL, ... ) is_image(x)
data |
An array, matrix, raw vector, or existing image object. |
colormode |
Character specifying color mode: |
colspace |
Character specifying color space (default |
gamma |
Numeric gamma value (default |
storage |
Character specifying storage type: |
... |
Additional arguments. |
dim |
Optional dimensions vector to reshape data. |
x |
An object to check if it inherits from class |
An S3 object of class c("image", "array").
## Not run: img <- image(array(as.raw(sample(0:255, 300, replace = TRUE)), dim = c(10, 10, 3))) print(img) summary(img) is_image(img) ## End(Not run)## Not run: img <- image(array(as.raw(sample(0:255, 300, replace = TRUE)), dim = c(10, 10, 3))) print(img) summary(img) is_image(img) ## End(Not run)
image object by handimage_align() rotate an image given a line of desired aligment along the y
axis that corresponds to the alignment of the objects (e.g., field plots). By
default, the aligment will be to the vertical, which means that if the drawed
line have an angle < 90 degrees parallel to the x axis, the rotation angle wil be
negative (anticlocwise rotation).
image_align( img, align = c("vertical", "horizontal"), viewer = get_pliman_viewer(), plot = TRUE )image_align( img, align = c("vertical", "horizontal"), viewer = get_pliman_viewer(), plot = TRUE )
img |
An |
align |
The desired alignment. Either |
viewer |
The viewer option. If not provided, the value is retrieved
using |
plot |
Plots the aligned image? Defaults to |
The image_align function aligns an image along the vertical or horizontal
axis based on user-selected points. The alignment can be performed in either
the base plotting system or using the mapview package for interactive
visualization. If the viewer option is set to "base", the function prompts
the user to select two points on the image to define the alignment line. If
the viewer option is set to "mapview", the function opens an interactive map
where the user can draw a polyline to define the alignment line. The
alignment angle is calculated based on the selected points, and the image is
rotated accordingly using the image_rotate function. The function returns
the aligned image object.
The img aligned
if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot = TRUE) aligned <- image_align(flax) }if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot = TRUE) aligned <- image_align(flax) }
This function adds an alpha (transparency) layer to an RGB image. The alpha layer can be specified as a single numeric value for uniform transparency or as a matrix/array matching the dimensions of the image for varying transparency.
image_alpha(img, mask)image_alpha(img, mask)
img |
An RGB image of class |
mask |
A numeric value or matrix/array specifying the alpha layer:
|
An image object with an added alpha layer, maintaining the RGBA format.
if (interactive()) { library(pliman) # Load a sample RGB image img <- image_pliman("soybean_touch.jpg") # 50% transparency image_alpha(img, 0.5) |> plot() # transparent background mask <- image_binary(img, "NB")[[1]] img_tb <- image_alpha(img, mask) plot(img_tb) }if (interactive()) { library(pliman) # Load a sample RGB image img <- image_pliman("soybean_touch.jpg") # 50% transparency image_alpha(img, 0.5) |> plot() # transparent background mask <- image_binary(img, "NB")[[1]] img_tb <- image_alpha(img, mask) plot(img_tb) }
This function takes an image and augments it by rotating it multiple times.
image_augment( img, pattern = NULL, times = 12, type = "export", dir_original = NULL, dir_processed = NULL, parallel = FALSE, verbose = TRUE, workers = NULL )image_augment( img, pattern = NULL, times = 12, type = "export", dir_original = NULL, dir_processed = NULL, parallel = FALSE, verbose = TRUE, workers = NULL )
img |
An |
pattern |
A regular expression pattern to select multiple images from a directory. |
times |
The number of times to rotate the image. |
type |
The type of output: "export" to save images or "return" to return a list of augmented images. |
dir_original |
The directory where original images are located. |
dir_processed |
The directory where processed images will be saved. |
parallel |
Whether to perform image augmentation in parallel. |
verbose |
Whether to display progress messages. |
workers |
Number of parallel processes. |
If type is "export," augmented images are saved. If type is "return," a list of augmented images is returned.
if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") imgs <- image_augment(img, type = "return", times = 4) image_combine(imgs) }if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") imgs <- image_augment(img, type = "return", times = 4) image_combine(imgs) }
Reduce a color, color near-infrared, or grayscale images to a binary image using a given color channel (red, green blue) or even color indexes. The Otsu's thresholding method (Otsu, 1979) is used to automatically perform clustering-based image thresholding.
image_binary( img, index = "R", r = 1, g = 2, b = 3, re = 4, nir = 5, return_class = "image", threshold = c("Otsu", "adaptive"), k = 0.15, windowsize = NULL, has_white_bg = FALSE, resize = FALSE, fill_hull = FALSE, max_size = NULL, remove_reflection = FALSE, erode = FALSE, dilate = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), invert = FALSE, return_exact = FALSE, plot = TRUE, nrow = NULL, ncol = NULL, parallel = FALSE, workers = NULL, verbose = TRUE )image_binary( img, index = "R", r = 1, g = 2, b = 3, re = 4, nir = 5, return_class = "image", threshold = c("Otsu", "adaptive"), k = 0.15, windowsize = NULL, has_white_bg = FALSE, resize = FALSE, fill_hull = FALSE, max_size = NULL, remove_reflection = FALSE, erode = FALSE, dilate = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), invert = FALSE, return_exact = FALSE, plot = TRUE, nrow = NULL, ncol = NULL, parallel = FALSE, workers = NULL, verbose = TRUE )
img |
An image object. |
index |
A character value (or a vector of characters) specifying the
target mode for conversion to binary image. See the available indexes with
|
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands of the image, respectively. Defaults to 1, 2, 3, 4, and 5, respectively. If a multispectral image is provided (5 bands), check the order of bands, which are frequently presented in the 'BGR' format. |
return_class |
The class of object to be returned. If |
threshold |
The theshold method to be used.
|
k |
a numeric in the range 0-1. when |
windowsize |
windowsize controls the number of local neighborhood in
adaptive thresholding. By default it is set to |
has_white_bg |
Logical indicating whether a white background is present.
If |
resize |
Resize the image before processing? Defaults to |
fill_hull |
Fill holes in the objects? Defaults to |
max_size |
Maximum size of objects to keep. Larger objects are removed. Default is |
remove_reflection |
Logical or numeric. If |
erode, dilate, opening, closing, filter
|
Morphological operations (brush size)
Hierarchically, the operations are performed as opening > closing > filter. The value declared in each argument will define the brush size. |
filter_order |
A character vector indicating the order in which morphological
operations are applied. Defaults to |
invert |
Inverts the binary image, if desired. |
return_exact |
Logical. If |
plot |
Show image after processing? |
nrow, ncol
|
The number of rows or columns in the plot grid. Defaults to
|
parallel |
Processes the images asynchronously (in parallel) in separate
R sessions running in the background on the same machine. It may speed up
the processing time when |
workers |
A positive numeric scalar or a function specifying the maximum number of parallel processes that can be active at the same time. |
verbose |
If |
A list containing binary images. The length will depend on the number of indexes used.
Tiago Olivoto [email protected]
Otsu, N. 1979. Threshold selection method from gray-level histograms. IEEE Trans Syst Man Cybern SMC-9(1): 62-66. doi:10.1109/tsmc.1979.4310076
Shafait, F., D. Keysers, and T.M. Breuel. 2008. Efficient implementation of local adaptive thresholding techniques using integral images. Document Recognition and Retrieval XV. SPIE. p. 317-322 doi:10.1117/12.767755
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") image_binary(img, index = c("R, G")) }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") image_binary(img, index = c("R, G")) }
Extracts a pixel-accurate binary mask (foreground = 1, background = 0) from an image using state-of-the-art Deep Learning neural networks executed in ONNX format via native C++ bindings. Supports salient object detection, dichotomous image segmentation, high-resolution boundary matting, foundation segmentation models (SAM 2.1 / SAM 3.1), zero-shot text-prompted instance segmentation (Grounded-SAM), and one-shot visual exemplar segmentation (PerSAM).
image_binary_dl( img, model = c("u2netp", "ben2", "grounded-sam", "sam2.1", "persam", "rmbg-1.4", "rmbg-2.0", "withoutbg", "birefnet-lite", "sam3.1", "isnet-general-use", "silueta", "u2net"), threshold = 0.5, fill_hull = TRUE, filter = 0, erode = 0, dilate = 0, opening = 0, closing = 0, min_area = 0, invert = FALSE, pick_object = FALSE, prompt = NULL, exemplar = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )image_binary_dl( img, model = c("u2netp", "ben2", "grounded-sam", "sam2.1", "persam", "rmbg-1.4", "rmbg-2.0", "withoutbg", "birefnet-lite", "sam3.1", "isnet-general-use", "silueta", "u2net"), threshold = 0.5, fill_hull = TRUE, filter = 0, erode = 0, dilate = 0, opening = 0, closing = 0, min_area = 0, invert = FALSE, pick_object = FALSE, prompt = NULL, exemplar = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )
img |
An |
model |
Character string specifying the pre-trained neural network architecture to use:
|
threshold |
Numeric value in |
fill_hull |
Logical. If |
filter |
Integer specifying the window radius for binary median filtering ( |
erode |
Integer specifying the radius for morphological erosion ( |
dilate |
Integer specifying the radius for morphological dilation ( |
opening |
Integer specifying the radius for morphological opening (erosion followed by dilation).
Default is |
closing |
Integer specifying the radius for morphological closing (dilation followed by erosion).
Default is |
min_area |
Integer minimum object size in pixels evaluated via connected component labeling ( |
invert |
Logical. If |
pick_object |
Logical. If |
prompt |
Flexible prompt specification for SAM, Grounded-SAM, and PerSAM models:
|
exemplar |
Logical. If |
threads |
Integer specifying the number of threads for parallel ONNX Runtime execution. Default is |
engine |
Character specifying the backend execution engine: |
device_id |
Integer GPU device adapter index. Default is |
verbose |
Logical. If |
plot |
Logical. If |
dir |
Character string specifying the local directory where ONNX model files are stored and cached.
Defaults to |
... |
Additional arguments passed down to internal plotting methods. |
A binary image object (Grayscale, values 0 and 1) or a list of binary image objects.
## Not run: library(pliman) img <- image_import("leaf.png") # Fast binarization on CPU (ultra-lightweight, 4.6 MB) mask <- image_binary_dl(img, model = "u2netp") # Sub-pixel boundary segmentation for fine veins and serrations mask_ben <- image_binary_dl(img, model = "ben2") # Interactive prompt: click directly on objects of interest mask_interactive <- image_binary_dl(img, model = "sam2.1", pick_object = TRUE) # Open-vocabulary text-prompted binarization mask_weed <- image_binary_dl(img, model = "grounded-sam", prompt = "weed") # One-shot visual exemplar segmentation (PerSAM) mask_exemplar <- image_binary_dl(img, model = "persam", prompt = c(150, 200)) ## End(Not run)## Not run: library(pliman) img <- image_import("leaf.png") # Fast binarization on CPU (ultra-lightweight, 4.6 MB) mask <- image_binary_dl(img, model = "u2netp") # Sub-pixel boundary segmentation for fine veins and serrations mask_ben <- image_binary_dl(img, model = "ben2") # Interactive prompt: click directly on objects of interest mask_interactive <- image_binary_dl(img, model = "sam2.1", pick_object = TRUE) # Open-vocabulary text-prompted binarization mask_weed <- image_binary_dl(img, model = "grounded-sam", prompt = "weed") # One-shot visual exemplar segmentation (PerSAM) mask_exemplar <- image_binary_dl(img, model = "persam", prompt = c(150, 200)) ## End(Not run)
This function performs Connected Component Labeling (CCL) on a binary image. It implements a highly optimized 2-pass Union-Find algorithm, providing lightning-fast execution even for massive images.
image_bwlabel(binary)image_bwlabel(binary)
binary |
A binary |
A grayscale image object containing the labels, where each isolated
object is assigned a unique integer value. Background pixels are 0.
## Not run: library(pliman) bin <- image_pliman("soybean_touch.jpg") |> image_binary(index = "B") labels <- image_bwlabel(bin$B) ## End(Not run)## Not run: library(pliman) bin <- image_pliman("soybean_touch.jpg") |> image_binary(index = "B") labels <- image_bwlabel(bin$B) ## End(Not run)
Canny Edge Detector for Images. Adapted from https://github.com/bnosac/image/tree/master/image.CannyEdges.
image_canny_edge(img, index = "GRAY", s = 5, low_thr = 10, high_thr = 20)image_canny_edge(img, index = "GRAY", s = 5, low_thr = 10, high_thr = 20)
img |
An |
index |
A character string with the index to be used. Defaults to |
s |
sigma, the Gaussian filter variance. Defaults to 5. |
low_thr |
lower threshold value of the algorithm. Defaults to 10. |
high_thr |
upper threshold value of the algorithm. Defaults to 20 |
a list with an image object with values 0 or 255, and the number of
pixels which have value 255 (pixels_nonzero).
if(interactive()){ library(pliman) img <- image_pliman("sev_leaf.jpg") conts <- image_canny_edge(img, index = "B") image_combine(img, conts$edges) }if(interactive()){ library(pliman) img <- image_pliman("sev_leaf.jpg") conts <- image_canny_edge(img, index = "B") image_combine(img, conts$edges) }
Classifies images using pre-trained YOLO26 classification models across 1,000 ImageNet categories, or open-vocabulary text candidates using OpenAI CLIP (ViT-B/32) cross-modal embeddings and cosine similarity softmax.
image_classify_dl( img, candidates = NULL, model = NULL, top_k = NULL, labels = NULL, format_prompt = TRUE, plot = FALSE, col = "#2b5c8f", threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, dir = pliman_model_dir(), ... )image_classify_dl( img, candidates = NULL, model = NULL, top_k = NULL, labels = NULL, format_prompt = TRUE, plot = FALSE, col = "#2b5c8f", threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, dir = pliman_model_dir(), ... )
img |
An |
candidates |
An optional character vector of candidate class names or natural language descriptions.
When supplied, performs zero-shot open-vocabulary classification using CLIP. Defaults to |
model |
Model name or path to a custom ONNX file. Defaults to |
top_k |
Integer. Number of top class predictions to return (defaults to 5 for YOLO models,
or |
labels |
Optional character vector of class names (defaults to 1,000 standard ImageNet classes). |
format_prompt |
Logical. If |
plot |
Logical. Whether to display the image with top predicted class labels (or horizontal bar chart for CLIP). |
col |
Fill color for probability bar chart when |
threads |
Number of CPU threads (default 0 for auto-tuning). |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
verbose |
Logical. Whether to show progress messages. |
dir |
Model directory (default |
... |
Additional arguments passed to |
A data frame containing top predictions.
## Not run: library(pliman) img <- image_import("sample.png") # YOLO classification image_classify_dl(img) # CLIP zero-shot classification res <- image_classify_dl(img, candidates = c("healthy leaf", "rust lesion", "insect damage")) print(res) ## End(Not run)## Not run: library(pliman) img <- image_import("sample.png") # YOLO classification image_classify_dl(img) # CLIP zero-shot classification res <- image_classify_dl(img, candidates = c("healthy leaf", "rust lesion", "insect damage")) print(res) ## End(Not run)
Colorizes a labeled image by allocating a different color to each object. Background pixels (value 0) are colorized with black.
image_color_labels(labels)image_color_labels(labels)
labels |
A labeled image (an |
A color image object.
## Not run: library(pliman) bin <- image_pliman("soybean_touch.jpg") |> image_binary(index = "B") lbl <- image_bwlabel(bin$B) color_lbl <- image_color_labels(lbl) plot(color_lbl) ## End(Not run)## Not run: library(pliman) bin <- image_pliman("soybean_touch.jpg") |> image_binary(index = "B") lbl <- image_bwlabel(bin$B) color_lbl <- image_color_labels(lbl) plot(color_lbl) ## End(Not run)
Combines several images to a grid
image_combine( ..., labels = NULL, nrow = NULL, ncol = NULL, col = "black", verbose = TRUE, mar = c(1.5, 1.5, 1.5, 1.5), oma = c(0, 0, 0, 0) )image_combine( ..., labels = NULL, nrow = NULL, ncol = NULL, col = "black", verbose = TRUE, mar = c(1.5, 1.5, 1.5, 1.5), oma = c(0, 0, 0, 0) )
... |
a comma-separated name of image objects or a list containing image objects. |
labels |
A character vector with the same length of the number of
objects in |
nrow, ncol
|
The number of rows or columns in the plot grid. Defaults to
|
col |
The color for the plot labels. Defaults to |
verbose |
Shows the name of objects declared in |
mar, oma
|
Margins for each panel and outer margins for the combined plot.
Defaults to |
A grid with the images in ...
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) img1 <- image_pliman("sev_leaf.jpg") img2 <- image_pliman("sev_leaf_nb.jpg") image_combine(img1, img2) # Remove margins to optimize plotting area: image_combine(img1, img2, mar = 0) }if (interactive()) { library(pliman) img1 <- image_pliman("sev_leaf.jpg") img2 <- image_pliman("sev_leaf_nb.jpg") image_combine(img1, img2) # Remove margins to optimize plotting area: image_combine(img1, img2, mar = 0) }
Smooth Contour Line Detection
image_contour_line(img, index = "GRAY", Q = 2)image_contour_line(img, index = "GRAY", Q = 2)
img |
An |
index |
A character string with the index to be used. Defaults to |
Q |
numeric value with the pixel quantization step |
A list with the contour lines.
if(interactive()){ library(pliman) img <- image_pliman("sev_leaf.jpg") conts <- image_contour_line(img, index = "B") plot(img) plot_contour(conts, col = "black") }if(interactive()){ library(pliman) img <- image_pliman("sev_leaf.jpg") conts <- image_contour_line(img, index = "B") plot(img) plot_contour(conts, col = "black") }
Calibrates the color of an image using a set of known color references (e.g., from a color checker) by implementing multiple calibration models including industry-standard CCM (Color Correction Matrix 3x3), Affine (4x3), White Balance, Cubic (9-term polynomial), and Root-Polynomial (20-term).
image_correction( img, card_colors = NULL, known_colors = NULL, k_mat = NULL, model = c("ccm", "affine", "white_balance", "cubic", "root_polynomial"), reference = "colorchecker24", lambda = 1e-04, plot = FALSE, verbose = TRUE )image_correction( img, card_colors = NULL, known_colors = NULL, k_mat = NULL, model = c("ccm", "affine", "white_balance", "cubic", "root_polynomial"), reference = "colorchecker24", lambda = 1e-04, plot = FALSE, verbose = TRUE )
img |
An |
card_colors |
A data frame of observed colors from the color checker
(typically output directly from |
known_colors |
A data frame of known reference colors. Must contain |
k_mat |
A pre-calculated transformation matrix ( |
model |
The calibration model to use:
|
reference |
Reference chart standard to use when |
lambda |
Ridge regularization factor for matrix inversion (default |
plot |
Logical. If |
verbose |
Logical. If |
Color calibration finds an optimal transformation matrix mapping observed
colors to reference target colors :
"ccm" (default): Linear 3x3 Color Correction Matrix computed via Ridge-regularized
least squares:
"affine": 4x3 linear transformation with translation offset (intercept) .
"white_balance": Channel-wise gain correction derived from neutral/white patches.
"cubic": 9-term polynomial mapping ().
"root_polynomial": 20-term root-polynomial mapping with cross-channel interactions.
If card_colors or known_colors are provided, returns a list containing:
img: An image object with the color correction applied.
k: The calculated transformation matrix ().
model: The model used.
avg_delta_raw: Mean Euclidean color error () before calibration.
avg_delta_calib: Mean after calibration.
wb_gains: White balance channel gains.
df: Comparison data frame with observed, calibrated, and reference colors.
If only img and a pre-calculated k_mat are supplied, returns the corrected image directly.
if(interactive()){ library(pliman) img <- image_pliman("colorcheck.jpg") # 1. Extract card colors card <- get_card_colors(img) # 2. Calibrate image using default CCM 3x3 model calib <- image_correction(img, card, model = "ccm", plot = TRUE) # 3. Or using polynomial models calib_poly <- image_correction(img, card, model = "root_polynomial") }if(interactive()){ library(pliman) img <- image_pliman("colorcheck.jpg") # 1. Extract card colors card <- get_card_colors(img) # 2. Calibrate image using default CCM 3x3 model calib <- image_correction(img, card, model = "ccm", plot = TRUE) # 3. Or using polynomial models calib_poly <- image_correction(img, card, model = "root_polynomial") }
Interactively calibrates the color of an image by prompting the user to
sample color patches. It calls pliman::pick_rgb_area() to pause and
prompt the user to click on color_chips patches in the image. These
sampled colors are then mapped to known_colors using the specified model.
image_correction_pick( img, known_colors = NULL, color_chips = 24, model = c("ccm", "affine", "white_balance", "cubic", "root_polynomial"), lambda = 1e-04 )image_correction_pick( img, known_colors = NULL, color_chips = 24, model = c("ccm", "affine", "white_balance", "cubic", "root_polynomial"), lambda = 1e-04 )
img |
An |
known_colors |
A |
color_chips |
The number of color patches to sample interactively (default |
model |
The calibration model to use ( |
lambda |
Ridge regularization factor (default |
An image object with corrected colors.
if(interactive()){ library(pliman) # Sample 4 known chips (e.g. blue, red, yellow, white) known_colors <- data.frame( id = c(1, 2, 3, 4), R = c(25, 186, 245, 249), G = c(55, 26, 205, 242), B = c(135, 51, 0, 238) ) img <- image_pliman("colorcheck.jpg") img_cor <- image_correction_pick(img, known_colors, color_chips = 4) image_combine(img, img_cor) }if(interactive()){ library(pliman) # Sample 4 known chips (e.g. blue, red, yellow, white) known_colors <- data.frame( id = c(1, 2, 3, 4), R = c(25, 186, 245, 249), G = c(55, 26, 205, 242), B = c(135, 51, 0, 238) ) img <- image_pliman("colorcheck.jpg") img_cor <- image_correction_pick(img, known_colors, color_chips = 4) image_combine(img, img_cor) }
image object of a given colorimage_create() can be used to create an image object with a desired color and size.
image_create(color, width = 200, heigth = 200, plot = FALSE)image_create(color, width = 200, heigth = 200, plot = FALSE)
color |
either a color name (as listed by |
width, heigth
|
The width and heigth of the image in pixel units. |
plot |
Plots the image after creating it? Defaults to |
An object of class image.
if (interactive()) { image_create("red") image_create("#009E73", width = 300, heigth = 100) }if (interactive()) { image_create("red") image_create("#009E73", width = 300, heigth = 100) }
Extract raw or numeric image data array/matrix
image_data(x, ...) ## S3 method for class 'image' image_data(x, type = c("same", "numeric", "normalized", "raw"), ...)image_data(x, ...) ## S3 method for class 'image' image_data(x, type = c("same", "numeric", "normalized", "raw"), ...)
x |
An |
... |
Additional arguments passed to methods. |
type |
Storage format to extract:
|
Estimates a metric-aligned relative 3D depth map from any 2D RGB image using the state-of-the-art Depth Anything V2 foundation model running purely via ONNX Runtime.
image_depth_dl( img, model = "depth-anything-v2", col_palette = "magma", invert = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )image_depth_dl( img, model = "depth-anything-v2", col_palette = "magma", invert = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )
img |
An |
model |
Model name or path to a custom ONNX file. Defaults to |
col_palette |
Color palette used to visualize the depth map when |
invert |
Logical. If |
threads |
Number of CPU threads (default 0 for auto-tuning). |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
verbose |
Logical. Whether to show progress messages. |
plot |
Logical. Whether to plot the resulting depth heatmap. |
dir |
Model directory (default |
... |
Additional arguments passed to |
An Image object representing the colorized depth map, with the raw normalized
depth matrix stored in the "depth" attribute (attr(res, "depth")).
## Not run: library(pliman) img <- image_import("leaf.png") depth <- image_depth_dl(img) ## End(Not run)## Not run: library(pliman) img <- image_import("leaf.png") depth <- image_depth_dl(img) ## End(Not run)
Performs real-time object detection using YOLO26 (or custom YOLO ONNX models) with bounding box regression and End-to-End detection.
image_detect_dl( img, model = "yolo26n", conf_threshold = 0.25, iou_threshold = 0.45, labels = NULL, col = NULL, rainbow = TRUE, lwd = 2, cex = 1, pad = 1, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, badge = TRUE, return_features = FALSE, feature_model = c("yolo", "clip-vit-b32", "dinov2"), plot_features = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )image_detect_dl( img, model = "yolo26n", conf_threshold = 0.25, iou_threshold = 0.45, labels = NULL, col = NULL, rainbow = TRUE, lwd = 2, cex = 1, pad = 1, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, badge = TRUE, return_features = FALSE, feature_model = c("yolo", "clip-vit-b32", "dinov2"), plot_features = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )
img |
An |
model |
Model name or path to a custom ONNX file. Defaults to |
conf_threshold |
Minimum confidence score for candidate boxes (default 0.25). |
iou_threshold |
IoU threshold for Non-Maximum Suppression (default 0.45). |
labels |
Optional character vector of class names (defaults to standard 80 COCO classes). |
col |
Optional color or palette for bounding boxes. |
rainbow |
Logical. If |
lwd |
Line width for bounding boxes (default 2). |
cex |
Size factor for label text (default |
pad |
Padding multiplier controlling the area/background badge size around label text (default |
show_text |
Logical. Whether to display text labels on bounding boxes (default |
show_conf |
Logical. Whether to display confidence scores in labels (default |
show_class |
Logical. Whether to display class names in labels (default |
show_id |
Logical. Whether to display object IDs ( |
badge |
Logical. Whether to draw a solid background badge behind label text (default |
return_features |
Logical. If |
feature_model |
Foundation model used for feature representation when |
plot_features |
Logical. If |
threads |
Number of CPU threads (default 0 for auto-tuning). |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
verbose |
Logical. Whether to show progress messages. |
plot |
Logical. Whether to plot the original image with bounding boxes. |
dir |
Model directory (default |
... |
Additional arguments passed to |
A data frame containing detected bounding boxes (id, xmin, ymin, xmax, ymax, label, score),
with summary and counts stored as attributes. If return_features = TRUE, features (an matrix)
and feature_map (dense spatial PCA Image) are also attached as attributes.
## Not run: library(pliman) img <- image_import("objects.png") boxes <- image_detect_dl(img) # Rainbow coloring per box: boxes_rb <- image_detect_dl(img, rainbow = TRUE) ## End(Not run)## Not run: library(pliman) img <- image_import("objects.png") boxes <- image_detect_dl(img) # Rainbow coloring per box: boxes_rb <- image_detect_dl(img, rainbow = TRUE) ## End(Not run)
image_detect_sahi() performs high-resolution sliding-window hyper inference
on ultra-large images, drone orthomosaics, and macro scans. Large images (e.g. 20–50 Megapixels)
are dynamically sliced into overlapping tiles of size slice_width x slice_height.
Deep learning inference is executed per slice, and all bounding boxes are transformed to global coordinates and merged using Global Cross-Slice Non-Maximum Suppression (NMS). This prevents small objects (seeds, aphids, stomata, seedlings) from vanishing when downscaled.
image_detect_sahi( img, model = "yolo26n", slice_height = 640, slice_width = 640, overlap_height_ratio = 0.2, overlap_width_ratio = 0.2, conf_threshold = 0.25, iou_threshold = 0.45, full_image_inference = TRUE, rainbow = TRUE, plot = TRUE, verbose = TRUE, ... )image_detect_sahi( img, model = "yolo26n", slice_height = 640, slice_width = 640, overlap_height_ratio = 0.2, overlap_width_ratio = 0.2, conf_threshold = 0.25, iou_threshold = 0.45, full_image_inference = TRUE, rainbow = TRUE, plot = TRUE, verbose = TRUE, ... )
img |
An |
model |
YOLO ONNX model name or file path (e.g., |
slice_height |
Integer. Height of sliding window slices. Defaults to |
slice_width |
Integer. Width of sliding window slices. Defaults to |
overlap_height_ratio |
Numeric scalar between 0 and 0.5. Height overlap fraction. Defaults to |
overlap_width_ratio |
Numeric scalar between 0 and 0.5. Width overlap fraction. Defaults to |
conf_threshold |
Numeric scalar between 0 and 1. Minimum detection confidence. Defaults to |
iou_threshold |
Numeric scalar between 0 and 1. IoU threshold for cross-slice NMS. Defaults to |
full_image_inference |
Logical. If |
rainbow |
Logical. If |
plot |
Logical. Display global detections overlaid on the full image. Defaults to |
verbose |
Logical. Show progress bar and tile metrics. Defaults to |
... |
Additional arguments passed to |
A data.frame of global bounding boxes with attributes image, counts, and summary.
## Not run: library(pliman) # Run SAHI on a 4000x3000 drone orthophoto res <- image_detect_sahi("drone_field.jpg", model = "seedlings.onnx", slice_width = 640) ## End(Not run)## Not run: library(pliman) # Run SAHI on a 4000x3000 drone orthophoto res <- image_detect_sahi("drone_field.jpg", model = "seedlings.onnx", slice_width = 640) ## End(Not run)
Detects arbitrary objects described in natural language without any model retraining, powered by YOLO-World (v8s) and Ultralytics.
image_detect_world( img, classes = c("object"), conf_threshold = 0.25, iou_threshold = 0.45, model = "yolov8s-world", rainbow = TRUE, col = NULL, lwd = 2, cex = 1, pad = 1, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, badge = TRUE, return_features = FALSE, feature_model = c("yolo", "clip-vit-b32", "dinov2"), plot_features = FALSE, plot = TRUE, auto_install = TRUE, verbose = TRUE, dir = pliman_model_dir(), ... )image_detect_world( img, classes = c("object"), conf_threshold = 0.25, iou_threshold = 0.45, model = "yolov8s-world", rainbow = TRUE, col = NULL, lwd = 2, cex = 1, pad = 1, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, badge = TRUE, return_features = FALSE, feature_model = c("yolo", "clip-vit-b32", "dinov2"), plot_features = FALSE, plot = TRUE, auto_install = TRUE, verbose = TRUE, dir = pliman_model_dir(), ... )
img |
An |
classes |
A character vector of object classes or a comma-separated string (e.g. |
conf_threshold |
Minimum confidence threshold (default 0.25). |
iou_threshold |
IoU threshold for NMS (default 0.45). |
model |
Model name or weights path (default |
rainbow |
Logical. If |
col |
Optional color or palette for bounding boxes. |
lwd |
Bounding box line width (default 2). |
cex |
Size factor for bounding box label text (default |
pad |
Padding multiplier controlling the background badge size around label text (default |
show_text |
Logical. Whether to display text labels on bounding boxes (default |
show_conf |
Logical. Whether to display confidence scores in labels (default |
show_class |
Logical. Whether to display class names in labels (default |
show_id |
Logical. Whether to display object IDs ( |
badge |
Logical. Whether to draw a solid background badge behind label text (default |
return_features |
Logical. If |
feature_model |
Foundation model used for feature representation when |
plot_features |
Logical. If |
plot |
Logical. If |
auto_install |
Logical. If |
verbose |
Logical. Whether to display progress messages. |
dir |
Directory where models are stored (default |
... |
Additional plotting parameters. |
A data frame containing detected bounding boxes (id, xmin, ymin, xmax, ymax, class, score).
If return_features = TRUE, features (an matrix) and feature_map (dense spatial PCA Image)
are attached as attributes.
## Not run: library(pliman) img <- image_import("field.jpg") dets <- image_detect_world(img, classes = c("corn plant", "weed", "soil"), rainbow = TRUE) ## End(Not run)## Not run: library(pliman) img <- image_import("field.jpg") dets <- image_detect_world(img, classes = c("corn plant", "weed", "soil"), rainbow = TRUE) ## End(Not run)
Computes L2-normalized 512-dimensional semantic embeddings for one or more images using OpenAI's CLIP (ViT-B/32) vision encoder directly via C++ ONNX Runtime.
image_embed_dl( img, model = "clip-vit-b32", threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = FALSE, dir = pliman_model_dir(), ... )image_embed_dl( img, model = "clip-vit-b32", threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = FALSE, dir = pliman_model_dir(), ... )
img |
An |
model |
Model name or path to a custom ONNX vision model file (default |
threads |
Number of CPU threads (default 0 for auto-tuning). |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
verbose |
Logical. Whether to show progress messages. |
dir |
Directory where models are stored (default |
... |
Additional arguments. |
A numeric vector (if single image) or numeric matrix of dimensions N x 512
containing the L2-normalized image embeddings.
## Not run: library(pliman) img <- image_import("leaf.png") emb <- image_embed_dl(img) length(emb) # 512 ## End(Not run)## Not run: library(pliman) img <- image_import("leaf.png") emb <- image_embed_dl(img) length(emb) # 512 ## End(Not run)
Expands an image towards the left, top, right, or bottom by sampling pixels from the image edge. Users can choose how many pixels (rows or columns) are sampled and how many pixels the expansion will have.
image_expand( img, left = NULL, top = NULL, right = NULL, bottom = NULL, edge = NULL, sample_left = 10, sample_top = 10, sample_right = 10, sample_bottom = 10, random = FALSE, filter = NULL, plot = TRUE )image_expand( img, left = NULL, top = NULL, right = NULL, bottom = NULL, edge = NULL, sample_left = 10, sample_top = 10, sample_right = 10, sample_bottom = 10, random = FALSE, filter = NULL, plot = TRUE )
img |
An |
left, top, right, bottom
|
The number of pixels to expand in the left, top, right, and bottom directions, respectively. |
edge |
The number of pixels to expand in all directions. This can be used to avoid calling all the above arguments |
sample_left, sample_top, sample_right, sample_bottom
|
The number of pixels to sample from each side. Defaults to 20. |
random |
Randomly sampling of the edge's pixels? Defaults to |
filter |
Apply a median filter in the sampled pixels? Defaults to
|
plot |
Plots the extended image? defaults to |
An image object
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") image_expand(img, left = 200) image_expand(img, right = 150, bottom = 250, filter = 5) }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") image_expand(img, left = 200) image_expand(img, right = 150, bottom = 250, filter = 5) }
Extracts dense patch embeddings and global representation vectors from DINOv2 (Vision Transformer ViT-S/14), and computes top-3 PCA false-color semantic segmentation without any labels or supervised training.
image_features_dl( img, model = "dinov2", patch_size = 14, return_pca = TRUE, interpolate = TRUE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )image_features_dl( img, model = "dinov2", patch_size = 14, return_pca = TRUE, interpolate = TRUE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )
img |
An |
model |
Model name or path to a custom ONNX file. Defaults to |
patch_size |
Size of ViT patches in pixels (default 14). |
return_pca |
Logical. If |
interpolate |
Logical. If |
threads |
Number of CPU threads (default 0 for auto-tuning). |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
verbose |
Logical. Whether to show progress messages. |
plot |
Logical. Whether to plot the PCA false-color semantic image. |
dir |
Model directory (default |
... |
Additional arguments passed to |
A list containing:
cls_token: 384-dimensional global semantic representation vector.
pca_image: An Image object representing the 3-component PCA false-color semantic map.
pca_r, pca_g, pca_b: Matrices of normalized PCA coordinates.
num_patches: Total number of spatial patches.
embed_dim: Dimensionality of patch embeddings.
## Not run: library(pliman) img <- image_import("leaf.png") feats <- image_features_dl(img) ## End(Not run)## Not run: library(pliman) img <- image_import("leaf.png") feats <- image_features_dl(img) ## End(Not run)
Generates photo-realistic synthetic images from natural language text prompts in 1-2 inference steps using Stability AI's SD-Turbo (or LCM), enhanced to high resolution with Real-ESRGAN super-resolution.
image_generate_dl( prompt, negative_prompt = NULL, aspect = c("square", "portrait", "landscape"), n_steps = 1, guidance_scale = 0, superres = TRUE, scale = 4, seed = NULL, plot = TRUE, output_dir = NULL, auto_install = TRUE, verbose = TRUE, ... )image_generate_dl( prompt, negative_prompt = NULL, aspect = c("square", "portrait", "landscape"), n_steps = 1, guidance_scale = 0, superres = TRUE, scale = 4, seed = NULL, plot = TRUE, output_dir = NULL, auto_install = TRUE, verbose = TRUE, ... )
prompt |
Character text prompt describing the image to generate. |
negative_prompt |
Optional negative prompt specifying elements to avoid. |
aspect |
Aspect ratio of the generated image: |
n_steps |
Number of diffusion inference steps (default 1 for SD-Turbo, or 2-4 for LCM). |
guidance_scale |
Classifier-Free Guidance scale (default 0.0 for SD-Turbo). |
superres |
Logical. If |
scale |
Upscaling factor when |
seed |
Optional integer seed for reproducible generation. |
plot |
Logical. If |
output_dir |
Optional directory to save generated image file. |
auto_install |
Logical. Whether to automatically configure environment if needed. |
verbose |
Logical. Whether to show progress messages. |
... |
Additional arguments passed to |
A pliman Image object.
## Not run: library(pliman) img <- image_generate_dl("macro photo of a healthy soybean leaf with morning dew") ## End(Not run)## Not run: library(pliman) img <- image_generate_dl("macro photo of a healthy soybean leaf with morning dew") ## End(Not run)
image_index() Builds image indexes using Red, Green, Blue, Red-Edge, and
NIR bands. See this page for a
detailed list of available indexes.
The S3 method plot() can be used to generate a raster or density plot of
the index values computed with image_index()
image_index( img, index = NULL, r = 1, g = 2, b = 3, re = 4, nir = 5, return_class = c("image", "terra"), resize = FALSE, has_white_bg = FALSE, plot = TRUE, nrow = NULL, ncol = NULL, max_pixels = 5e+05, parallel = FALSE, workers = NULL, verbose = TRUE, ... ) ## S3 method for class 'image_index' plot(x, type = c("raster", "density"), nrow = NULL, ncol = NULL, ...)image_index( img, index = NULL, r = 1, g = 2, b = 3, re = 4, nir = 5, return_class = c("image", "terra"), resize = FALSE, has_white_bg = FALSE, plot = TRUE, nrow = NULL, ncol = NULL, max_pixels = 5e+05, parallel = FALSE, workers = NULL, verbose = TRUE, ... ) ## S3 method for class 'image_index' plot(x, type = c("raster", "density"), nrow = NULL, ncol = NULL, ...)
img |
An |
index |
A character value (or a vector of characters) specifying the
target mode for conversion to a binary image. Use |
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands of the image, respectively. Defaults to 1, 2, 3, 4, and 5, respectively. If a multispectral image is provided (5 bands), check the order of bands, which are frequently presented in the 'BGR' format. |
return_class |
The class of object to be returned. If |
resize |
Resize the image before processing? Defaults to |
has_white_bg |
Logical indicating whether a white background is present. If TRUE, pixels that have R, G, and B values equals to 1 will be considered as NA. This may be useful to compute an image index for objects that have, for example, a white background. In such cases, the background will not be considered for the threshold computation. |
plot |
Show image after processing? |
nrow, ncol
|
The number of rows or columns in the plot grid. Defaults to
|
max_pixels |
integer > 0. Maximum number of cells to plot the index. If
|
parallel |
Processes the images asynchronously (in parallel) in separate
R sessions running in the background on the same machine. It may speed up
the processing time when |
workers |
A positive numeric scalar or a function specifying the maximum number of parallel processes that can be active at the same time. |
verbose |
If |
... |
Additional arguments passed to |
x |
An object of class |
type |
The type of plot. Use |
When type = "raster" (default), the function calls plot_index()
to create a raster plot for each index present in x. If type = "density",
a for loop is used to create a density plot for each index. Both types of
plots can be arranged in a grid controlled by the ncol and nrow
arguments.
A list containing Grayscale images. The length will depend on the number of indexes used.
A NULL object
Tiago Olivoto [email protected]
Nobuyuki Otsu, "A threshold selection method from gray-level histograms". IEEE Trans. Sys., Man., Cyber. 9 (1): 62-66. 1979. doi:10.1109/TSMC.1979.4310076
Karcher, D.E., and M.D. Richardson. 2003. Quantifying Turfgrass Color Using Digital Image Analysis. Crop Science 43(3): 943-951. doi:10.2135/cropsci2003.9430
Bannari, A., D. Morin, F. Bonn, and A.R. Huete. 1995. A review of vegetation indices. Remote Sensing Reviews 13(1-2): 95-120. doi:10.1080/02757259509532298
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") image_index(img, index = c("R, NR")) } if (interactive()) { # Example for S3 method plot() library(pliman) img <- image_pliman("sev_leaf.jpg") # compute the index ind <- image_index(img, index = c("R, G, B, NGRDI"), plot = FALSE) plot(ind) # density plot plot(ind, type = "density") }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") image_index(img, index = c("R, NR")) } if (interactive()) { # Example for S3 method plot() library(pliman) img <- image_pliman("sev_leaf.jpg") # compute the index ind <- image_index(img, index = c("R, G, B, NGRDI"), plot = FALSE) plot(ind) # density plot plot(ind, type = "density") }
Modifies or replaces masked regions of an image based on a natural language text prompt using SD-Turbo inpainting.
image_inpaint_dl( img, mask, prompt, negative_prompt = NULL, n_steps = 2, guidance_scale = 0, seed = NULL, plot = TRUE, output_dir = NULL, auto_install = TRUE, verbose = TRUE, ... )image_inpaint_dl( img, mask, prompt, negative_prompt = NULL, n_steps = 2, guidance_scale = 0, seed = NULL, plot = TRUE, output_dir = NULL, auto_install = TRUE, verbose = TRUE, ... )
img |
An |
mask |
An |
prompt |
Text prompt describing what to synthesize inside the masked area. |
negative_prompt |
Optional negative prompt. |
n_steps |
Number of inference steps (default 2). |
guidance_scale |
CFG scale (default 0.0). |
seed |
Optional random seed. |
plot |
Logical. If |
output_dir |
Optional directory to save the inpainted image. |
auto_install |
Logical. Whether to automatically configure environment if needed. |
verbose |
Logical. Whether to show progress messages. |
... |
Additional arguments passed to |
A pliman Image object containing the inpainted result.
## Not run: library(pliman) inpainted <- image_inpaint_dl(img, mask, "a fresh green sprout") ## End(Not run)## Not run: library(pliman) inpainted <- image_inpaint_dl(img, mask, "a fresh green sprout") ## End(Not run)
This function labels connected components in a binary image while allowing for a specified maximum gap between pixels to still be considered part of the same object.
image_label(img, max_gap = 0)image_label(img, max_gap = 0)
img |
A binary image matrix where |
max_gap |
An integer specifying the maximum allowable gap (in pixels)
between connected components to be considered as part of the same object.
Default is |
An object of class image, where each
connected component is assigned a unique integer label.
if(interactive()){ library(pliman) img <- matrix(c( 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ), nrow = 4, byrow = TRUE) image_label(img, max_gap = 1) |> plot() image_label(img, max_gap = 2) image_label(img, max_gap = 3) }if(interactive()){ library(pliman) img <- matrix(c( 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ), nrow = 4, byrow = TRUE) image_label(img, max_gap = 1) |> plot() image_label(img, max_gap = 2) image_label(img, max_gap = 3) }
Detects line segments in a digital image using the Line Segment Detector (LSD), a linear-time method that controls false detections and requires no parameter tuning. Based on Burns, Hanson, and Riseman's method with an a-contrario validation approach.
image_line_segment( img, index = "GRAY", scale = 0.8, sigma_scale = 0.6, quant = 2, ang_th = 22.5, log_eps = 0, density_th = 0.7, n_bins = 1024, union = FALSE, union_min_length = 5, union_max_distance = 5, union_ang_th = 7, union_use_NFA = FALSE, union_log_eps = 0 )image_line_segment( img, index = "GRAY", scale = 0.8, sigma_scale = 0.6, quant = 2, ang_th = 22.5, log_eps = 0, density_th = 0.7, n_bins = 1024, union = FALSE, union_min_length = 5, union_max_distance = 5, union_ang_th = 7, union_use_NFA = FALSE, union_log_eps = 0 )
img |
An |
index |
A character string with the index to be used. Defaults to |
scale |
A positive numeric value. Scales the input image before detection using Gaussian filtering. A value <1 downscales, >1 upscales. Default is 0.8. |
sigma_scale |
A positive numeric value determining the Gaussian filter sigma. If scale <1, sigma = sigma_scale / scale; otherwise, sigma = sigma_scale. Default is 0.6. |
quant |
A positive numeric value controlling gradient quantization error. Default is 2.0. |
ang_th |
A numeric value (0-180) defining the gradient angle tolerance in degrees. Default is 22.5. |
log_eps |
A numeric detection threshold. Larger values make detection stricter. Default is 0.0. |
density_th |
A numeric value (0-1) defining the minimum proportion of supporting points in a rectangle. Default is 0.7. |
n_bins |
A positive integer specifying the number of bins for pseudo-ordering gradient modulus. Default is 1024. |
union |
Logical. If TRUE, merges close line segments. Default is FALSE. |
union_min_length |
Numeric. Minimum segment length to merge. Default is 5. |
union_max_distance |
Numeric. Maximum distance between segments to merge. Default is 5. |
union_ang_th |
Numeric. Angle threshold for merging segments. Default is 7. |
union_use_NFA |
Logical. If TRUE, uses NFA in merging. Default is FALSE. |
union_log_eps |
Numeric. Detection threshold for merging. Default is 0.0. |
A list of class lsd containing:
n - Number of detected line segments.
lines - A matrix with detected segments (columns: x1, y1, x2, y2, width, p, -log_nfa).
pixels - A matrix assigning each pixel to a detected segment (0 = unused pixels).
Grompone von Gioi, R., Jakubowicz, J., Morel, J.-M., & Randall, G. (2010). LSD: A Fast Line Segment Detector with a False Detection Control. IEEE Transactions on Pattern Analysis and Machine Intelligence, 32(4), 722-732.doi:10.5201/ipol.2012.gjmr-lsd
library(pliman)library(pliman)
Performs real-time human pose estimation and 17 keypoint detection using YOLO26
(e.g., yolo26n-pose, yolo26s-pose, etc.) with bounding box regression and
anatomical skeleton visualization.
image_pose_dl( img, model = "yolo26n-pose", conf_threshold = 0.25, iou_threshold = 0.45, kpt_threshold = 0.3, col = NULL, lwd = 2, cex = 1, pad = 1, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, badge = TRUE, kpt_radius = 4, bbox = TRUE, skeleton = TRUE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )image_pose_dl( img, model = "yolo26n-pose", conf_threshold = 0.25, iou_threshold = 0.45, kpt_threshold = 0.3, col = NULL, lwd = 2, cex = 1, pad = 1, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, badge = TRUE, kpt_radius = 4, bbox = TRUE, skeleton = TRUE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )
img |
An |
model |
Model name or path to a custom ONNX file. Defaults to |
conf_threshold |
Minimum confidence score for candidate person detections (default 0.25). |
iou_threshold |
IoU threshold for Non-Maximum Suppression (default 0.45). |
kpt_threshold |
Minimum confidence threshold for rendering individual keypoints and skeleton limbs (default 0.3). |
col |
Optional color or palette for bounding boxes and keypoint markers. |
lwd |
Line width for bounding boxes and skeleton limbs (default 2). |
cex |
Size factor for bounding box label text (default |
pad |
Padding multiplier controlling the background badge size around label text (default |
show_text |
Logical. Whether to display text labels on bounding boxes (default |
show_conf |
Logical. Whether to display confidence scores in labels (default |
show_class |
Logical. Whether to display class names in labels (default |
show_id |
Logical. Whether to display object IDs ( |
badge |
Logical. Whether to draw a solid background badge behind label text (default |
kpt_radius |
Radius/size for keypoint markers (default 4). |
bbox |
Logical. Whether to draw bounding boxes around detected persons (default |
skeleton |
Logical. Whether to render the 17-keypoint anatomical skeleton (default |
threads |
Number of CPU threads (default 0 for auto-tuning). |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
verbose |
Logical. Whether to show progress messages. |
plot |
Logical. Whether to plot the image with pose overlays. |
dir |
Model directory (default |
... |
Additional arguments passed to |
A list with class pliman_pose containing:
boxes: Data frame containing detected person bounding boxes (id, xmin, ymin, xmax, ymax, label, score).
keypoints: List of data frames (one per person) containing the 17 COCO keypoints (keypoint, x, y, conf).
summary: Human-readable detection summary string.
counts: Data frame of instance counts.
## Not run: library(pliman) img <- image_import("person.png") res <- image_pose_dl(img) res$boxes res$keypoints[[1]] ## End(Not run)## Not run: library(pliman) img <- image_import("person.png") res <- image_pose_dl(img) res$boxes res$keypoints[[1]] ## End(Not run)
This function aligns and crops the image using either base or mapview
visualization. This is useful to prepare the images to be analyzed with
analyze_objects_shp()
image_prepare( img, viewer = get_pliman_viewer(), downsample = NULL, max_pixels = 1e+06 )image_prepare( img, viewer = get_pliman_viewer(), downsample = NULL, max_pixels = 1e+06 )
img |
An optional |
viewer |
The viewer option. If not provided, the value is retrieved
using |
downsample |
integer; for each dimension the number of
pixels/lines/bands etc that will be skipped; Defaults to |
max_pixels |
integer > 0. Maximum number of cells to use for the plot.
If |
The alighed/cropped image for further visualization or analysis.
# Example usage: if (interactive()) { img <- image_pliman("mult_leaves.jpg") image_prepare(img, viewer = "mapview") }# Example usage: if (interactive()) { img <- image_pliman("mult_leaves.jpg") image_prepare(img, viewer = "mapview") }
Removes the background of an image using pre-trained Deep Learning models, producing a 4-channel RGBA image with a transparent background by default, or replacing the background with a solid color.
image_remove_bg_dl( img, model = c("u2netp", "ben2", "grounded-sam", "sam2.1", "persam", "rmbg-1.4", "rmbg-2.0", "withoutbg", "birefnet-lite", "sam3.1", "isnet-general-use", "silueta", "u2net"), threshold = 0.5, fill_hull = TRUE, filter = 0, erode = 0, dilate = 0, opening = 0, closing = 0, min_area = 0, invert = FALSE, pick_object = FALSE, prompt = NULL, exemplar = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, transparent = TRUE, bg_color = "black", plot = TRUE, dir = pliman_model_dir(), ... ) image_remove_bg( img, model = c("u2netp", "ben2", "grounded-sam", "sam2.1", "persam", "rmbg-1.4", "rmbg-2.0", "withoutbg", "birefnet-lite", "sam3.1", "isnet-general-use", "silueta", "u2net"), threshold = 0.5, fill_hull = TRUE, filter = 0, erode = 0, dilate = 0, opening = 0, closing = 0, min_area = 0, invert = FALSE, pick_object = FALSE, prompt = NULL, exemplar = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, transparent = TRUE, bg_color = "black", plot = TRUE, dir = pliman_model_dir(), ... )image_remove_bg_dl( img, model = c("u2netp", "ben2", "grounded-sam", "sam2.1", "persam", "rmbg-1.4", "rmbg-2.0", "withoutbg", "birefnet-lite", "sam3.1", "isnet-general-use", "silueta", "u2net"), threshold = 0.5, fill_hull = TRUE, filter = 0, erode = 0, dilate = 0, opening = 0, closing = 0, min_area = 0, invert = FALSE, pick_object = FALSE, prompt = NULL, exemplar = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, transparent = TRUE, bg_color = "black", plot = TRUE, dir = pliman_model_dir(), ... ) image_remove_bg( img, model = c("u2netp", "ben2", "grounded-sam", "sam2.1", "persam", "rmbg-1.4", "rmbg-2.0", "withoutbg", "birefnet-lite", "sam3.1", "isnet-general-use", "silueta", "u2net"), threshold = 0.5, fill_hull = TRUE, filter = 0, erode = 0, dilate = 0, opening = 0, closing = 0, min_area = 0, invert = FALSE, pick_object = FALSE, prompt = NULL, exemplar = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, transparent = TRUE, bg_color = "black", plot = TRUE, dir = pliman_model_dir(), ... )
img |
An |
model |
Character string specifying the pre-trained neural network architecture to use:
|
threshold |
Numeric value in |
fill_hull |
Logical. If |
filter |
Integer specifying the window radius for binary median filtering ( |
erode |
Integer specifying the radius for morphological erosion ( |
dilate |
Integer specifying the radius for morphological dilation ( |
opening |
Integer specifying the radius for morphological opening (erosion followed by dilation).
Default is |
closing |
Integer specifying the radius for morphological closing (dilation followed by erosion).
Default is |
min_area |
Integer minimum object size in pixels evaluated via connected component labeling ( |
invert |
Logical. If |
pick_object |
Logical. If |
prompt |
Flexible prompt specification for SAM, Grounded-SAM, and PerSAM models:
|
exemplar |
Logical. If |
threads |
Integer specifying the number of threads for parallel ONNX Runtime execution. Default is |
engine |
Character specifying the backend execution engine: |
device_id |
Integer GPU device adapter index. Default is |
verbose |
Logical. If |
transparent |
Logical. If |
bg_color |
Optional background color to fill when |
plot |
Logical. If |
dir |
Character string specifying the local directory where ONNX model files are stored and cached.
Defaults to |
... |
Additional arguments passed down to internal plotting methods. |
An image object (4-channel RGBA if transparent = TRUE, 3-channel RGB otherwise) or a list of images.
## Not run: library(pliman) img <- image_import("leaf.png") # Fast background removal with transparent alpha channel (CPU friendly) img_trans <- image_remove_bg_dl(img, model = "u2netp") # Razor-sharp plant boundary cutout (leaf margins, serrations, petioles) img_ben <- image_remove_bg_dl(img, model = "ben2") # Robust background removal under complex studio shadows and reflections img_rmbg <- image_remove_bg_dl(img, model = "rmbg-1.4") # Replace background with solid white img_white <- image_remove_bg_dl(img, model = "u2netp", transparent = FALSE, bg_color = "white") # Extract specific object via natural language prompt (Grounded-SAM) img_fruit <- image_remove_bg_dl(img, model = "grounded-sam", prompt = "red fruit") # Extract instances matching a visual exemplar click (PerSAM) img_exemplar <- image_remove_bg_dl(img, model = "persam", prompt = c(120, 150)) ## End(Not run)## Not run: library(pliman) img <- image_import("leaf.png") # Fast background removal with transparent alpha channel (CPU friendly) img_trans <- image_remove_bg_dl(img, model = "u2netp") # Razor-sharp plant boundary cutout (leaf margins, serrations, petioles) img_ben <- image_remove_bg_dl(img, model = "ben2") # Robust background removal under complex studio shadows and reflections img_rmbg <- image_remove_bg_dl(img, model = "rmbg-1.4") # Replace background with solid white img_white <- image_remove_bg_dl(img, model = "u2netp", transparent = FALSE, bg_color = "white") # Extract specific object via natural language prompt (Grounded-SAM) img_fruit <- image_remove_bg_dl(img, model = "grounded-sam", prompt = "red fruit") # Extract instances matching a visual exemplar click (PerSAM) img_exemplar <- image_remove_bg_dl(img, model = "persam", prompt = c(120, 150)) ## End(Not run)
Removes specular light reflections from grayscale index images prior to thresholding.
image_remove_reflection(img, radius = 5, has_white_bg = TRUE)image_remove_reflection(img, radius = 5, has_white_bg = TRUE)
img |
Grayscale |
radius |
Radius of structuring window for specular peak removal (default = 5). |
has_white_bg |
Logical indicating whether the background is white/light (default = TRUE). |
A filtered Image object or matrix.
Resizes a 2D (grayscale) or 3D (RGB) image or a list of images. It supports three reconstruction filters: Lanczos-3 (highest quality), Bilinear, and Nearest-Neighbor.
image_resize( img, rel_size = 100, width, height, filter = c("lanczos", "bilinear", "nearest"), parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE )image_resize( img, rel_size = 100, width, height, filter = c("lanczos", "bilinear", "nearest"), parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE )
img |
An |
rel_size |
The relative size of the resized image (as a percentage of the
original size). Defaults to 100. For example, |
width |
The target width (number of rows in the output matrix) in pixels.
If missing, it is computed automatically to preserve the aspect ratio based
on |
height |
The target height (number of columns in the output matrix) in pixels. If missing, it is computed automatically to preserve the aspect ratio. |
filter |
The interpolation filter to use. Options are:
|
parallel |
Logical value indicating whether to process lists of images in parallel. |
workers |
The maximum number of parallel processes to run when |
verbose |
Logical value. If |
plot |
Logical value. If |
A modified Image object or a list of modified Image objects.
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) # Load example image img <- image_pliman("sev_leaf.jpg") # Resize to 50% using high-quality Lanczos filter img_half <- image_resize(img, rel_size = 50, filter = "lanczos", plot = TRUE) # Resize specifying custom width and height img_custom <- image_resize(img, width = 400, height = 300, filter = "bilinear") # Resize a list of images img_list <- list(img, img) resized_list <- image_resize(img_list, rel_size = 25, parallel = FALSE) }if (interactive()) { library(pliman) # Load example image img <- image_pliman("sev_leaf.jpg") # Resize to 50% using high-quality Lanczos filter img_half <- image_resize(img, rel_size = 50, filter = "lanczos", plot = TRUE) # Resize specifying custom width and height img_custom <- image_resize(img, width = 400, height = 300, filter = "bilinear") # Resize a list of images img_list <- list(img, img) resized_list <- image_resize(img_list, rel_size = 25, parallel = FALSE) }
image_segment() reduces a color, color near-infrared, or grayscale images
to a segmented image using a given color channel (red, green blue) or even
color indexes (See image_index() for more details). The Otsu's thresholding
method (Otsu, 1979) is used to automatically perform clustering-based image
thresholding.
image_segment_iter() Provides an iterative image segmentation, returning
the proportions of segmented pixels.
image_segment( img, index = NULL, r = 1, g = 2, b = 3, re = 4, nir = 5, threshold = c("Otsu", "adaptive"), k = 0.1, windowsize = NULL, col_background = NULL, na_background = FALSE, has_white_bg = FALSE, fill_hull = FALSE, erode = FALSE, dilate = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, invert = FALSE, plot = TRUE, nrow = NULL, ncol = NULL, parallel = FALSE, workers = NULL, verbose = TRUE ) image_segment_iter( img, nseg = 2, index = NULL, invert = NULL, threshold = NULL, k = 0.1, windowsize = NULL, has_white_bg = FALSE, plot = TRUE, verbose = TRUE, nrow = NULL, ncol = NULL, parallel = FALSE, workers = NULL, ... )image_segment( img, index = NULL, r = 1, g = 2, b = 3, re = 4, nir = 5, threshold = c("Otsu", "adaptive"), k = 0.1, windowsize = NULL, col_background = NULL, na_background = FALSE, has_white_bg = FALSE, fill_hull = FALSE, erode = FALSE, dilate = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, invert = FALSE, plot = TRUE, nrow = NULL, ncol = NULL, parallel = FALSE, workers = NULL, verbose = TRUE ) image_segment_iter( img, nseg = 2, index = NULL, invert = NULL, threshold = NULL, k = 0.1, windowsize = NULL, has_white_bg = FALSE, plot = TRUE, verbose = TRUE, nrow = NULL, ncol = NULL, parallel = FALSE, workers = NULL, ... )
img |
An image object or a list of image objects. |
index |
|
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands of the image, respectively. Defaults to 1, 2, 3, 4, and 5, respectively. If a multispectral image is provided (5 bands), check the order of bands, which are frequently presented in the 'BGR' format. |
threshold |
The theshold method to be used.
|
k |
a numeric in the range 0-1. when |
windowsize |
windowsize controls the number of local neighborhood in
adaptive thresholding. By default it is set to |
col_background |
The color of the segmented background. Defaults to
|
na_background |
Consider the background as NA? Defaults to FALSE. |
has_white_bg |
Logical indicating whether a white background is present.
If |
fill_hull |
Fill holes in the objects? Defaults to |
erode, dilate, opening, closing, filter
|
Morphological operations (brush size)
Hierarchically, the operations are performed as opening > closing > filter. The value declared in each argument will define the brush size. |
invert |
Inverts the binary image, if desired. For
|
plot |
Show image after processing? |
nrow, ncol
|
The number of rows or columns in the plot grid. Defaults to
|
parallel |
Processes the images asynchronously (in parallel) in separate
R sessions running in the background on the same machine. It may speed up
the processing time when |
workers |
A positive numeric scalar or a function specifying the maximum number of parallel processes that can be active at the same time. |
verbose |
If |
nseg |
The number of iterative segmentation steps to be performed. |
... |
Additional arguments passed on to |
image_segment() returns list containing n objects where n is the
number of indexes used. Each objects contains:
image an image with the RGB bands (layers) for the segmented object.
mask A mask with logical values of 0 and 1 for the segmented image.
image_segment_iter() returns a list with (1) a data frame with the
proportion of pixels in the segmented images and (2) the segmented images.
Tiago Olivoto [email protected]
Nobuyuki Otsu, "A threshold selection method from gray-level histograms". IEEE Trans. Sys., Man., Cyber. 9 (1): 62-66. 1979. doi:10.1109/TSMC.1979.4310076
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg", plot = TRUE) image_segment(img, index = c("R, G, B")) }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg", plot = TRUE) image_segment(img, index = c("R, G, B")) }
Segments foreground objects (such as leaves, fruits, seeds, grains, roots, animals, or plants) from complex, textured, or out-of-focus backgrounds using pre-trained Deep Learning models in ONNX format.
image_segment_dl( img, type = c("segment", "mask", "highlight"), col_background = "white", col_highlight = "salmon", alpha = 0.4, border = NA, lwd = 1, bbox = FALSE, mask = TRUE, cex = 1, pad = 1, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, badge = TRUE, rainbow = TRUE, model = c("u2netp", "ben2", "yolo26n-seg", "stardist", "grounded-sam", "sam2.1", "persam", "rmbg-1.4", "rmbg-2.0", "withoutbg", "birefnet-lite", "sam3.1", "isnet-general-use", "silueta", "u2net"), threshold = 0.5, box_threshold = 0.25, text_threshold = 0.25, iou_threshold = 0.5, exemplar = FALSE, sim_threshold = 0.5, min_dist = 16, feat_res = 256, max_objects = NULL, superres_map = FALSE, return_features = FALSE, feature_model = c("yolo", "clip-vit-b32", "dinov2"), plot_features = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, fill_hull = TRUE, filter = 0, erode = 0, dilate = 0, opening = 0, closing = 0, min_area = 0, invert = FALSE, pick_object = FALSE, prompt = NULL, show_mask = FALSE, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )image_segment_dl( img, type = c("segment", "mask", "highlight"), col_background = "white", col_highlight = "salmon", alpha = 0.4, border = NA, lwd = 1, bbox = FALSE, mask = TRUE, cex = 1, pad = 1, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, badge = TRUE, rainbow = TRUE, model = c("u2netp", "ben2", "yolo26n-seg", "stardist", "grounded-sam", "sam2.1", "persam", "rmbg-1.4", "rmbg-2.0", "withoutbg", "birefnet-lite", "sam3.1", "isnet-general-use", "silueta", "u2net"), threshold = 0.5, box_threshold = 0.25, text_threshold = 0.25, iou_threshold = 0.5, exemplar = FALSE, sim_threshold = 0.5, min_dist = 16, feat_res = 256, max_objects = NULL, superres_map = FALSE, return_features = FALSE, feature_model = c("yolo", "clip-vit-b32", "dinov2"), plot_features = FALSE, threads = 0, engine = c("gpu", "cpu"), device_id = -1, fill_hull = TRUE, filter = 0, erode = 0, dilate = 0, opening = 0, closing = 0, min_area = 0, invert = FALSE, pick_object = FALSE, prompt = NULL, show_mask = FALSE, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )
img |
An |
type |
Character specifying the visual and output modality:
|
col_background |
Character string or hex code specifying the solid background color when
|
col_highlight |
Fill color for the semi-transparent overlay polygon when |
alpha |
Numeric transparency value in |
border |
Color for the border stroke of the highlight polygon when |
lwd |
Numeric line width for the bounding boxes and highlight polygon contours. Default is |
bbox |
Logical. If |
mask |
Logical. If |
cex |
Size factor for bounding box label text (default |
pad |
Padding multiplier controlling the background badge size around label text (default |
show_text |
Logical. Whether to display text labels on bounding boxes (default |
show_conf |
Logical. Whether to display confidence scores in labels (default |
show_class |
Logical. Whether to display class names in labels (default |
show_id |
Logical. If |
badge |
Logical. Whether to draw a solid background badge behind label text (default |
rainbow |
Logical. If |
model |
Model architecture or path to a custom ONNX file. Built-in choices:
|
threshold |
Numeric value in |
box_threshold |
Numeric confidence threshold in |
text_threshold |
Numeric token logit confidence threshold in |
iou_threshold |
Numeric Non-Maximum Suppression (NMS) Intersection over Union (IoU) threshold in |
exemplar |
Logical. If |
sim_threshold |
Numeric cosine similarity threshold in |
min_dist |
Numeric minimum spatial distance in pixels (within the 1024x1024 embedding space) between candidate
peaks to prevent duplicate instance detections of the same object. Default is |
feat_res |
Spatial resolution / algorithm for exemplar matching. Options:
|
max_objects |
Maximum number of instances to detect and segment. Default is |
superres_map |
Logical. If |
return_features |
Logical. If |
feature_model |
Foundation model used for feature representation when |
plot_features |
Logical. If |
threads |
Integer specifying the number of threads for parallel ONNX Runtime execution. Default is |
engine |
Character specifying the backend execution engine: |
device_id |
Integer GPU device adapter index. Default is |
fill_hull |
Logical. If |
filter |
Integer specifying the window radius for binary median filtering ( |
erode |
Integer specifying the radius for morphological erosion ( |
dilate |
Integer specifying the radius for morphological dilation ( |
opening |
Integer specifying the radius for morphological opening (erosion followed by dilation).
Default is |
closing |
Integer specifying the radius for morphological closing (dilation followed by erosion).
Default is |
min_area |
Integer minimum object size in pixels evaluated via connected component labeling ( |
invert |
Logical. If |
pick_object |
Logical. If |
prompt |
Flexible prompt specification for SAM, Grounded-SAM, and PerSAM models:
|
show_mask |
Deprecated. If |
verbose |
Logical. If |
plot |
Logical. If |
dir |
Character string specifying the local directory where ONNX model files are stored and cached.
Defaults to |
... |
Additional arguments passed down to internal plotting methods. |
This unified function supports five major computer vision workflows:
Salient Foreground Segmentation & Background Removal: Semantic cutout using architectures such as U2-Net, BEN2, BRIA RMBG 1.4/2.0, IS-Net, withoutBG, BiRefNet, and Silueta.
Real-Time YOLO26 Instance Segmentation (yolo26n-seg): Real-time instance segmentation
combining bounding box detection with 32 prototype mask channels and continuous bilinear sub-pixel
interpolation. Returns a single multi-label mask image (type = "mask"), smooth polygon overlays
(type = "highlight"), or background cutouts (type = "segment"), accompanied by per-instance
morphological measurements (area, perimeter, circularity, etc.).
Star-Convex Object Detection & Segmentation (stardist): Predicts 48 radial star-convex
distance rays and object probability, specifically tailored for densely packed, touching, or convex
structures such as seeds, grains, nuclei, and cells.
Zero-Shot Text-Prompted Detection & Instance Segmentation (Grounded-SAM): Combines Grounding DINO
with SAM 2.1 to locate, outline, and count arbitrary concepts described in natural language (e.g., prompt = "leaf, fruit, insect").
One-Shot Visual Exemplar Segmentation & Counting (PerSAM): Personalize Segment Anything via SAM 2.1. The user clicks on 1 or more exemplar objects (or provides coordinates), and the algorithm automatically searches, segments, and counts all visually similar objects across the entire image using Multi-Prototype Max-Pooling.
If mask = FALSE and bbox = TRUE: A data frame containing the bounding box coordinates
(id, xmin, ymin, xmax, ymax, score, label).
If type = "segment": An image object containing the segmented image.
If type = "mask": A single multi-label or binary image object (colormode = "Grayscale").
If type = "highlight": Invisibly returns a list with:
"boxes": Data frame of detected bounding boxes and scores.
"labels": Single multi-label integer mask image where each pixel value corresponds to instance id.
"summary": Text summary of detected objects and counts.
"counts": Data frame of instance counts per class label.
"contours": List of polygon contour coordinate matrices.
"features": If return_features = TRUE, numeric matrix of per-object deep feature embeddings.
"feature_map": If return_features = TRUE, dense spatial 3-component PCA false-color Image.
"similarity_map": Continuous cosine similarity image object (when exemplar = TRUE).
If img is a list: A list of the corresponding outputs.
## Not run: library(pliman) img <- image_import("leaf.png") # 1. Basic salient foreground segmentation with white background (CPU-friendly) seg <- image_segment_dl(img, model = "u2netp") # 2. Razor-sharp plant boundary extraction (leaf margins, serrations, roots) seg_ben <- image_segment_dl(img, model = "ben2") # 3. Semi-transparent polygon overlay for visual inspection image_segment_dl(img, model = "u2netp", type = "highlight") # 4. Zero-shot text-prompted instance segmentation (Grounded-SAM) # Segments leaves and lesions, displaying bounding boxes and summary res_gs <- image_segment_dl( img, model = "grounded-sam", prompt = "plant leaf, lesion", type = "highlight", bbox = TRUE ) # Inspect counts and morphological measures print(attr(res_gs, "counts")) print(head(attr(res_gs, "features"))) # 5. Ultra-fast pure object detection without mask generation # (Skips SAM 2.1 completely for 10x faster execution) boxes <- image_segment_dl( img, model = "grounded-sam", prompt = "insect, leaf", mask = FALSE, bbox = TRUE ) # 6. One-shot visual exemplar segmentation (PerSAM): # Click on 1 or more representative items (e.g. seeds, logs, grains, cells) # to automatically find, outline, and count all matching instances: res_persam <- image_segment_dl( img, exemplar = TRUE, sim_threshold = 0.48, type = "highlight", bbox = TRUE ) # 7. Multi-prototype visual exemplar segmentation with predefined coordinates: # Passing coordinates of distinct log types (light, dark, weathered) pts <- rbind(c(65, 380), c(425, 380), c(630, 380)) res_logs <- image_segment_dl( img, exemplar = TRUE, prompt = pts, sim_threshold = 0.45, type = "highlight", engine = "gpu" ) # 8. YOLO26 instance segmentation (real-time polygon mask & box detection) res_yolo <- image_segment_dl( img, model = "yolo26n-seg", type = "highlight", bbox = TRUE ) ## End(Not run)## Not run: library(pliman) img <- image_import("leaf.png") # 1. Basic salient foreground segmentation with white background (CPU-friendly) seg <- image_segment_dl(img, model = "u2netp") # 2. Razor-sharp plant boundary extraction (leaf margins, serrations, roots) seg_ben <- image_segment_dl(img, model = "ben2") # 3. Semi-transparent polygon overlay for visual inspection image_segment_dl(img, model = "u2netp", type = "highlight") # 4. Zero-shot text-prompted instance segmentation (Grounded-SAM) # Segments leaves and lesions, displaying bounding boxes and summary res_gs <- image_segment_dl( img, model = "grounded-sam", prompt = "plant leaf, lesion", type = "highlight", bbox = TRUE ) # Inspect counts and morphological measures print(attr(res_gs, "counts")) print(head(attr(res_gs, "features"))) # 5. Ultra-fast pure object detection without mask generation # (Skips SAM 2.1 completely for 10x faster execution) boxes <- image_segment_dl( img, model = "grounded-sam", prompt = "insect, leaf", mask = FALSE, bbox = TRUE ) # 6. One-shot visual exemplar segmentation (PerSAM): # Click on 1 or more representative items (e.g. seeds, logs, grains, cells) # to automatically find, outline, and count all matching instances: res_persam <- image_segment_dl( img, exemplar = TRUE, sim_threshold = 0.48, type = "highlight", bbox = TRUE ) # 7. Multi-prototype visual exemplar segmentation with predefined coordinates: # Passing coordinates of distinct log types (light, dark, weathered) pts <- rbind(c(65, 380), c(425, 380), c(630, 380)) res_logs <- image_segment_dl( img, exemplar = TRUE, prompt = pts, sim_threshold = 0.45, type = "highlight", engine = "gpu" ) # 8. YOLO26 instance segmentation (real-time polygon mask & box detection) res_yolo <- image_segment_dl( img, model = "yolo26n-seg", type = "highlight", bbox = TRUE ) ## End(Not run)
Segments image objects using clustering by the k-means clustering algorithm
image_segment_kmeans( img, bands = 1:3, nclasses = 2, invert = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, fill_hull = FALSE, plot = TRUE )image_segment_kmeans( img, bands = 1:3, nclasses = 2, invert = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, fill_hull = FALSE, plot = TRUE )
img |
An |
bands |
A numeric integer/vector indicating the RGB band used in the
segmentation. Defaults to |
nclasses |
The number of desired classes after image segmentation. |
invert |
Invert the segmentation? Defaults to |
erode, dilate, opening, closing, filter
|
Morphological operations (brush size)
Hierarchically, the operations are performed as opening > closing > filter. The value declared in each argument will define the brush size. |
fill_hull |
Fill holes in the objects? Defaults to |
plot |
Plot the segmented image? |
A list with the following values:
image The segmented image considering only two classes (foreground and
background)
clusters The class of each pixel. For example, if ncluster = 3,
clusters will be a two-way matrix with values ranging from 1 to 3.
masks A list with the binary matrices showing the segmentation.
Hartigan, J. A. and Wong, M. A. (1979). Algorithm AS 136: A K-means clustering algorithm. Applied Statistics, 28, 100-108. doi:10.2307/2346830
if (interactive()) { img <- image_pliman("la_leaves.jpg", plot = TRUE) seg <- image_segment_kmeans(img) seg <- image_segment_kmeans(img, fill_hull = TRUE, invert = TRUE, filter = 10) }if (interactive()) { img <- image_pliman("la_leaves.jpg", plot = TRUE) seg <- image_segment_kmeans(img) seg <- image_segment_kmeans(img, fill_hull = TRUE, invert = TRUE, filter = 10) }
This R code is a function that allows the user to manually segment an image based on the parameters provided. This only works in an interactive section.
image_segment_manual( img, shape = c("free", "circle", "rectangle"), type = c("select", "remove"), viewer = get_pliman_viewer(), resize = TRUE, edge = 5, plot = TRUE )image_segment_manual( img, shape = c("free", "circle", "rectangle"), type = c("select", "remove"), viewer = get_pliman_viewer(), resize = TRUE, edge = 5, plot = TRUE )
img |
An |
shape |
The type of shape to use. Defaults to "free". Other possible values are "circle" and "rectangle". Partial matching is allowed. |
type |
The type of segmentation. By default ( |
viewer |
The viewer option. If not provided, the value is retrieved
using |
resize |
By default, the segmented object is resized to fill the
original image size. Use |
edge |
Number of pixels to add in the edge of the segmented object when
|
plot |
Plot the segmented object? Defaults to |
If the shape is "free", it allows the user to draw a perimeter to select/remove objects. If the shape is "circle", it allows the user to click on the center and edge of the circle to define the desired area. If the shape is "rectangle", it allows the user to select two points to define the area.
A list with the segmented image and the mask used for segmentation.
if (interactive()) { img <- image_pliman("la_leaves.jpg") seg <- image_segment_manual(img) plot(seg$mask) }if (interactive()) { img <- image_pliman("la_leaves.jpg") seg <- image_segment_manual(img) plot(seg$mask) }
image object using a brush maskIt combines make_mask() and make_brush() to segment an image object
using a brush of desired size, shape, and position.
image_segment_mask( img, size, shape = "disc", rel_pos_x = 0.5, rel_pos_y = 0.5, type = c("binary", "shadow"), col_background = "white", plot = TRUE, ... )image_segment_mask( img, size, shape = "disc", rel_pos_x = 0.5, rel_pos_y = 0.5, type = c("binary", "shadow"), col_background = "white", plot = TRUE, ... )
img |
A |
size |
A numeric containing the size of the brush in pixels. This should be an odd number; even numbers are rounded to the next odd one. |
shape |
A character vector indicating the shape of the brush. Can be
|
rel_pos_x, rel_pos_y
|
A relative position to include the brush in the image. Defaults to 0.5. This means that the brush will be centered in the original image. Smaller values move the brush toward the left and top, respectively. |
type |
Defines the type of the mask. By default, a binary mask is
applied. This results in white pixels in the original image that matches
the 0s pixels in the brush. If |
col_background |
Background color after image segmentation. Defaults to
|
plot |
Plots the generated mask? Defaults to |
... |
Additional arguments passed to |
A color image object
if (interactive()) { img <- image_pliman("soybean_touch.jpg") plot(img) image_segment_mask(img, size = 601) image_segment_mask(img, size = 401, shape = "diamond", rel_pos_x = 0, rel_pos_y = 0, type = "shadow") }if (interactive()) { img <- image_pliman("soybean_touch.jpg") plot(img) image_segment_mask(img, size = 601) image_segment_mask(img, size = 401, shape = "diamond", rel_pos_x = 0, rel_pos_y = 0, type = "shadow") }
Performs high-resolution sliding-window hyper inference for instance segmentation
using image_segment_dl(). Slices large canvases, predicts masks per tile,
shifts polygon contours to global coordinates, and applies cross-slice NMS.
image_segment_sahi( img, model = "yolo26n-seg", slice_height = 640, slice_width = 640, overlap_height_ratio = 0.2, overlap_width_ratio = 0.2, conf_threshold = 0.25, iou_threshold = 0.45, full_image_inference = TRUE, type = c("highlight", "segment", "mask"), col_background = "white", col_highlight = "salmon", alpha = 0.4, border = NA, lwd = 1, show_id = TRUE, rainbow = TRUE, plot = TRUE, verbose = TRUE, ... )image_segment_sahi( img, model = "yolo26n-seg", slice_height = 640, slice_width = 640, overlap_height_ratio = 0.2, overlap_width_ratio = 0.2, conf_threshold = 0.25, iou_threshold = 0.45, full_image_inference = TRUE, type = c("highlight", "segment", "mask"), col_background = "white", col_highlight = "salmon", alpha = 0.4, border = NA, lwd = 1, show_id = TRUE, rainbow = TRUE, plot = TRUE, verbose = TRUE, ... )
img |
An |
model |
YOLO ONNX model name or file path (e.g., |
slice_height |
Integer. Height of sliding window slices. Defaults to |
slice_width |
Integer. Width of sliding window slices. Defaults to |
overlap_height_ratio |
Numeric scalar between 0 and 0.5. Height overlap fraction. Defaults to |
overlap_width_ratio |
Numeric scalar between 0 and 0.5. Width overlap fraction. Defaults to |
conf_threshold |
Numeric scalar between 0 and 1. Minimum detection confidence. Defaults to |
iou_threshold |
Numeric scalar between 0 and 1. IoU threshold for cross-slice NMS. Defaults to |
full_image_inference |
Logical. If |
type |
Type of presentation: |
col_background |
Color of background when |
col_highlight |
Base color for highlighted instances when |
alpha |
Numeric transparency factor (0 = fully transparent, 1 = fully opaque) for highlight fill. Defaults to |
border |
Color for instance polygon borders. Defaults to |
lwd |
Numeric border line width. Defaults to |
show_id |
Logical. Display instance index number at centroid. Defaults to |
rainbow |
Logical. If |
plot |
Logical. Display global detections overlaid on the full image. Defaults to |
verbose |
Logical. Show progress bar and tile metrics. Defaults to |
... |
Additional arguments passed to |
A data.frame of detections with attached global contours, counts, and summaries.
Creates a list of object coordinates given the desired number of nrow and
columns. It starts by selecting 4 points at the corners of objects of
interest in the plot space. Then, given nrow and ncol, a grid is drawn
and the objects' coordinates are returned.
image_shp( img, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, interactive = FALSE, viewer = get_pliman_viewer(), col_line = "red", size_line = 2, col_text = "red", size_text = 1, plot = TRUE )image_shp( img, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, interactive = FALSE, viewer = get_pliman_viewer(), col_line = "red", size_line = 2, col_text = "red", size_text = 1, plot = TRUE )
img |
An object of class |
nrow |
The number of desired rows in the grid. Defaults to |
ncol |
The number of desired columns in the grid. Defaults to |
buffer_x, buffer_y
|
Buffering factor for the width and height, respectively, of each individual shape's side. A value between 0 and 0.5 where 0 means no buffering and 0.5 means complete buffering (default: 0). A value of 0.25 will buffer the shape by 25% on each side. |
interactive |
If |
viewer |
The viewer option. If not provided, the value is retrieved
using |
col_line, col_text
|
The color of the line/text in the grid. Defaults to
|
size_line, size_text
|
The size of the line/text in the grid. Defaults to
|
plot |
Plots the grid on the image? Defaults to |
A list with row * col objects containing the plot coordinates.
if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg") shape <- image_shp(flax, nrow = 3, ncol = 5) }if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg") shape <- image_shp(flax, nrow = 3, ncol = 5) }
image_skeleton_mat() performs noise-resistant, topological Medial Axis Tree (MAT)
skeletonization. Unlike conventional morphological erosion or iterative thinning algorithms
(e.g., Guo-Hall, Zhang-Suen) which are prone to internal "ladder rungs", loops, and surface
hair spurs on thick or textured objects, this algorithm:
Solidifies the binary mask by filling small cavities and applying morphological closing.
Computes the Exact Euclidean Distance Transform (EDT) for sub-pixel centerline tracing.
Applies fast thinning followed by radius-adaptive spur pruning (filtering boundary hairs proportional to local thickness).
Converts the skeleton to a topological graph and applies Maximum Spanning Forest (Kruskal's algorithm) to dissolve 100% of internal loops and ladder rungs.
Smooths centerlines along the medial ridge.
image_skeleton_mat( img, index = "GRAY", closing = 1, fill_size = 200, prune_length = 8, radius_prune = 1.2, dissolve_cycles = TRUE, smooth = TRUE, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE, ... )image_skeleton_mat( img, index = "GRAY", closing = 1, fill_size = 200, prune_length = 8, radius_prune = 1.2, dissolve_cycles = TRUE, smooth = TRUE, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE, ... )
img |
An |
index |
The index to use to binarize the image if |
closing |
Integer radius (in pixels) for morphological closing before skeletonization (default: 1). Smooths bark roughness and bridges boundary fissures. |
fill_size |
Integer maximum area (in pixels) of enclosed cavities to fill (default: 200). |
prune_length |
Minimum branch length (in pixels) to retain (default: 8). |
radius_prune |
Numeric factor multiplied by local radius for adaptive spur pruning (default: 1.2). |
dissolve_cycles |
Logical. If |
smooth |
Logical. If |
parallel |
Logical. If |
workers |
Number of workers for parallel execution. |
verbose |
Logical. If |
plot |
Logical. If |
... |
Additional arguments passed to |
A binary Image object (or list of Image objects) with values 0 and 1.
## Not run: library(pliman) img <- image_import(image_pliman("root.jpg")) skel <- image_skeleton_mat(img, plot = TRUE) ## End(Not run)## Not run: library(pliman) img <- image_import(image_pliman("root.jpg")) skel <- image_skeleton_mat(img, plot = TRUE) ## End(Not run)
Converts a rectangular image into a square image by expanding the
rows/columns using image_expand().
image_square(img, plot = TRUE, ...)image_square(img, plot = TRUE, ...)
img |
An |
plot |
Plots the extended image? defaults to |
... |
Further arguments passed on to |
The modified image object.
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") dim(img) square <- image_square(img) dim(square) }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") dim(img) square <- image_square(img) dim(square) }
Detects round, convex, and overlapping objects (e.g. seeds, cells, nuclei, spores) by predicting radial star-convex polygons and object probability using StarDist.
image_stardist_dl( img, model = "stardist", prob_threshold = 0.5, nms_threshold = 0.3, type = c("segment", "mask", "polygons"), col_highlight = "salmon", border = "white", lwd = 2, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )image_stardist_dl( img, model = "stardist", prob_threshold = 0.5, nms_threshold = 0.3, type = c("segment", "mask", "polygons"), col_highlight = "salmon", border = "white", lwd = 2, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )
img |
An |
model |
Model name or path to a custom ONNX file. Defaults to |
prob_threshold |
Probability threshold for detecting object centers (default 0.5). |
nms_threshold |
Polygon IoU threshold for Non-Maximum Suppression (default 0.3). |
type |
Output type: |
col_highlight |
Fill color for overlay polygons (default |
border |
Border color for polygon contours (default |
lwd |
Line width for polygon contours (default 2). |
threads |
Number of CPU threads (default 0 for auto-tuning). |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
verbose |
Logical. Whether to show progress messages. |
plot |
Logical. Whether to plot the results. |
dir |
Model directory (default |
... |
Additional arguments passed to |
A list containing:
boxes: Bounding boxes data frame with centers and scores.
polygons_x, polygons_y: Coordinates of radial polygon vertices for each object.
labels: Integer matrix with instance IDs.
mask: Logical foreground mask.
## Not run: library(pliman) img <- image_import("grains.png") res <- image_stardist_dl(img) ## End(Not run)## Not run: library(pliman) img <- image_import("grains.png") res <- image_stardist_dl(img) ## End(Not run)
image_stitch() merges multiple overlapping planar images (e.g. root scanner tiles,
oversized plant leaves, bench scans, or drone orthomosaic patches) into a single
seamless composite without requiring OpenCV, Python, or external software.
The native pipeline performs:
Multi-Scale Normalized Cross-Correlation (NCC): Coarse-to-fine registration finding the exact sub-pixel horizontal and vertical shifts between adjacent tiles.
Cosine-Smooth Seam Feathering: Eliminates visible seam lines and exposure steps by applying non-linear cosine weighted transitions across the overlap zone.
Dynamic Canvas Expansion: Recursively chains two or more images into a single composite image array.
image_stitch( images, direction = c("horizontal", "vertical", "auto"), blend = TRUE, overlap_hint = 0.2, plot = FALSE, return_details = FALSE, verbose = TRUE )image_stitch( images, direction = c("horizontal", "vertical", "auto"), blend = TRUE, overlap_hint = 0.2, plot = FALSE, return_details = FALSE, verbose = TRUE )
images |
A list of |
direction |
Stitching direction: |
blend |
Logical. If |
overlap_hint |
Expected fractional overlap between adjacent images (default: 0.2 = 20%). |
plot |
Logical. If |
return_details |
Logical. If |
verbose |
Logical. If |
An Image object (or a named list if return_details = TRUE).
Tiago Olivoto [email protected]
## Not run: library(pliman) # Stitch two overlapping leaf scans imgs <- list( image_read("leaf_left.jpg"), image_read("leaf_right.jpg") ) stitched <- image_stitch(imgs, direction = "horizontal") plot(stitched) ## End(Not run)## Not run: library(pliman) # Stitch two overlapping leaf scans imgs <- list( image_read("leaf_left.jpg"), image_read("leaf_right.jpg") ) stitched <- image_stitch(imgs, direction = "horizontal") plot(stitched) ## End(Not run)
Upscales images by 4x using generative convolutional super-resolution with intelligent tiled overlapping to prevent GPU/CPU memory exhaustion.
image_superres_dl( img, model = "realesrgan-compact", scale = 4, tile_size = 256, tile_pad = 16, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )image_superres_dl( img, model = "realesrgan-compact", scale = 4, tile_size = 256, tile_pad = 16, threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = TRUE, plot = TRUE, dir = pliman_model_dir(), ... )
img |
An |
model |
Model name or path to a custom ONNX file. Defaults to |
scale |
Upscaling factor (default 4). |
tile_size |
Processing tile size in pixels (default 256). |
tile_pad |
Overlap margin in pixels for seamless blending (default 16). |
threads |
Number of CPU threads (default 0 for auto-tuning). |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
verbose |
Logical. Whether to show progress messages. |
plot |
Logical. Whether to plot the super-resolved image. |
dir |
Model directory (default |
... |
Additional arguments passed to |
An Image object with dimensions (orig_w * 4) x (orig_h * 4) x 3.
## Not run: library(pliman) img <- image_import("low_res.png") img_hr <- image_superres_dl(img) ## End(Not run)## Not run: library(pliman) img <- image_import("low_res.png") img_hr <- image_superres_dl(img) ## End(Not run)
This function performs the Guo-Hall thinning algorithm (Guo and Hall, 1989) on a binary image or a list of binary images.
image_thinning_guo_hall( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE, ... )image_thinning_guo_hall( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE, ... )
img |
The binary image or a list of binary images to be thinned. It can be either a single binary image of class 'Image' or a list of binary images. |
parallel |
Logical, whether to perform thinning using multiple cores (parallel processing). If TRUE, the function will use multiple cores for processing if available. Default is FALSE. |
workers |
Integer, the number of workers (cores) to use for parallel processing. If NULL (default), it will use 40% of available cores. |
verbose |
Logical, whether to display progress messages during parallel processing. Default is TRUE. |
plot |
Logical, whether to plot the thinned images. Default is FALSE. |
... |
Additional arguments to be passed to |
If img is a single binary image, the function returns the
thinned binary image. If img is a list of binary images, the
function returns a list containing the thinned binary images.
Guo, Z., and R.W. Hall. 1989. Parallel thinning with two-subiteration algorithms. Commun. ACM 32(3): 359-373. doi:10.1145/62065.62074
if (interactive()) { library(pliman) img <- image_pliman("potato_leaves.jpg", plot = TRUE) image_thinning_guo_hall(img, index = "R", plot = TRUE) }if (interactive()) { library(pliman) img <- image_pliman("potato_leaves.jpg", plot = TRUE) image_thinning_guo_hall(img, index = "R", plot = TRUE) }
Given an object image, converts it into a data frame where each row corresponds to the intensity values of each pixel in the image.
image_to_mat(img, parallel = FALSE, workers = NULL, verbose = TRUE)image_to_mat(img, parallel = FALSE, workers = NULL, verbose = TRUE)
img |
An image object. |
parallel |
Processes the images asynchronously (in parallel) in separate
R sessions running in the background on the same machine. It may speed up
the processing time when |
workers |
A positive numeric scalar or a function specifying the maximum number of parallel processes that can be active at the same time. |
verbose |
If |
A list containing three matrices (R, G, and B), and a data frame
containing four columns: the name of the image in image and the R, G, B
values.
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") dim(img) mat <- image_to_mat(img) dim(mat[[1]]) }if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") dim(img) mat <- image_to_mat(img) dim(mat[[1]]) }
Transposes the spatial dimensions (width and height) of an image while preserving multi-channel spatial structure, color modes, and metadata attributes.
image_transpose(img) ## S3 method for class 'image' t(x)image_transpose(img) ## S3 method for class 'image' t(x)
img, x
|
An |
A transposed image object with swapped row/column dimensions.
This function allows users to interactively edit and analyze an image using mapview and mapedit packages.
image_view( img, object = NULL, r = 1, g = 2, b = 3, edit = FALSE, alpha = 0.7, attribute = "area", title = "Edit the image", show = c("rgb", "index"), index = "B", max_pixels = 1e+06, downsample = NULL, color_regions = custom_palette(), quantiles = c(0, 1), ... )image_view( img, object = NULL, r = 1, g = 2, b = 3, edit = FALSE, alpha = 0.7, attribute = "area", title = "Edit the image", show = c("rgb", "index"), index = "B", max_pixels = 1e+06, downsample = NULL, color_regions = custom_palette(), quantiles = c(0, 1), ... )
img |
An |
object |
(Optional). An object computed with |
r, g, b
|
The layer for the Red, Green and Blue band, respectively.
Defaults to |
edit |
If |
alpha |
The transparency level of the rectangles' color (between 0 and 1). |
attribute |
The name of the quantitative variable in the
|
title |
The title of the map view. Use to provide short orientations to the user. |
show |
The display option for the map view. Options are "rgb" for RGB view and "index" for index view. |
index |
The index to use for the index view. Defaults to "B". |
max_pixels |
integer > 0. Maximum number of cells to use for the plot.
If |
downsample |
integer; for each dimension the number of
pixels/lines/bands etc that will be skipped; Defaults to |
color_regions |
The color palette for displaying index values. Default
is |
quantiles |
the upper and lower quantiles used for color stretching. Set
to |
... |
Additional arguments to be passed to |
An sf object, the same object returned by mapedit::editMap().
if (interactive()) { # Example usage: img <- image_pliman("sev_leaf.jpg") image_view(img) }if (interactive()) { # Example usage: img <- image_pliman("sev_leaf.jpg") image_view(img) }
This function performs a morphological watershed segmentation on a binary image. It implements a highly optimized Spanning Forest algorithm coupled with a Disjoint-Set (Union-Find) data structure. This approach eliminates the need for slow iterative scans ($O(N^2)$ complexity), allowing the algorithm to execute in milliseconds even when resolving tens of thousands of distinct objects. It also features a mechanism to merge highly connected objects, effectively preventing over-segmentation.
image_watershed( img, sensitivity = "medium", tolerance = NULL, ext = 1, min_size = NULL, rel_size = NULL, fill_hull = FALSE, max_size = NULL )image_watershed( img, sensitivity = "medium", tolerance = NULL, ext = 1, min_size = NULL, rel_size = NULL, fill_hull = FALSE, max_size = NULL )
img |
A binary |
sensitivity |
Text ("low", "medium", "high", "extreme") or Number (e.g. 2.5). Automatically defines the best parameters for optimal precision. (Overrides manual adjustment of tolerance). |
tolerance |
Manual Fine-Tuning. If provided, overrides |
ext |
Pixel neighborhood radius (default = 1). Specifies the extension radius used during the regional maxima calculation and watershed flooding. |
min_size |
Minimum area (in pixels) for an object segment retained after watershed. |
rel_size |
Relative threshold as a fraction of the mean segment area (e.g. |
fill_hull |
Logical. Fill holes in the binary mask before watershed segmentation. Default is |
max_size |
Maximum area (in pixels) for an object segment retained after watershed. Default is |
A grayscale image object containing the labels.
## Not run: library(pliman) bin <- image_pliman("soybean_touch.jpg") |> image_binary(index = "B") w_med <- image_watershed(bin$B) ## End(Not run)## Not run: library(pliman) bin <- image_pliman("soybean_touch.jpg") |> image_binary(index = "B") w_med <- image_watershed(bin$B) ## End(Not run)
An interactive section where the user will be able to click on the image to
select landmarks manually is open. With each mouse click, a point is drawn
and an upward counter is shown in the console. After n counts or after the
user press Esc, the interactive process is interrupted and a data.frame
with the x and y coordinates for the landmarks is returned.
landmarks( img, n = Inf, viewer = get_pliman_viewer(), scale = NULL, calibrate = FALSE )landmarks( img, n = Inf, viewer = get_pliman_viewer(), scale = NULL, calibrate = FALSE )
img |
An |
n |
The number of landmarks to produce. Defaults to |
viewer |
The viewer option. If not provided, the value is retrieved
using |
scale |
A known scale of the coordinate values. If |
calibrate |
A logical argument indicating whether a calibration step
must be performed before picking up the landmarks. If so, |
A data.frame with the x and y-coordinates from the landmarks.
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
if(isTRUE(interactive())){ library(pliman) img <- image_pliman("potato_leaves.jpg") x <- landmarks(img) }if(isTRUE(interactive())){ library(pliman) img <- image_pliman("potato_leaves.jpg") x <- landmarks(img) }
Interpolates supplementary landmarks that correspond to the mean coordinates of two adjacent landmarks.
landmarks_add(x, n = 3, smooth_iter = 0, plot = TRUE, nrow = NULL, ncol = NULL)landmarks_add(x, n = 3, smooth_iter = 0, plot = TRUE, nrow = NULL, ncol = NULL)
x |
A |
n |
The number of iterations. Defaults to 3. |
smooth_iter |
The number of smoothing iterations to perform. This will
smooth the perimeter of the interpolated landmarks using |
plot |
Creates a plot? Defaults to |
ncol, nrow
|
The number of rows or columns in the plot grid when a |
A Matrix of interpolated coordinates.
library(pliman) # equally spaced landmarks plot_polygon(contours[[4]]) ldm <- landmarks_regradi(contours[[4]], plot = FALSE) points(ldm$coords, pch = 16) segments(mean(ldm$coords[,1]), mean(ldm$coords[,2]), ldm$coords[,1], ldm$coords[,2]) ldm_add <- landmarks_add(ldm, plot = FALSE) points(ldm_add, col = "red") points(ldm$coords, pch = 16) # smoothed version ldm_add_smo <- landmarks_add(ldm, plot = FALSE, smooth_iter = 10) lines(ldm_add_smo, col = "blue", lwd = 3)library(pliman) # equally spaced landmarks plot_polygon(contours[[4]]) ldm <- landmarks_regradi(contours[[4]], plot = FALSE) points(ldm$coords, pch = 16) segments(mean(ldm$coords[,1]), mean(ldm$coords[,2]), ldm$coords[,1], ldm$coords[,2]) ldm_add <- landmarks_add(ldm, plot = FALSE) points(ldm_add, col = "red") points(ldm$coords, pch = 16) # smoothed version ldm_add_smo <- landmarks_add(ldm, plot = FALSE, smooth_iter = 10) lines(ldm_add_smo, col = "blue", lwd = 3)
Computes the angle from two interlandmark vectors using the difference of their arguments using complex vectors (Claude, 2008).
landmarks_angle(x, unit = c("rad", "deg"))landmarks_angle(x, unit = c("rad", "deg"))
x |
An object computed with |
unit |
The unit of the angle. Defaults to radian (rad). Use |
A matrix with the angles for each landmark combination.
Borrowed from Claude (2008), pp. 50
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
if(isTRUE(interactive())){ library(pliman) img <- image_pliman("potato_leaves.jpg") x <- landmarks(img) landmarks_angle(x) }if(isTRUE(interactive())){ library(pliman) img <- image_pliman("potato_leaves.jpg") x <- landmarks(img) landmarks_angle(x) }
Computes the distance between two landmarks as the square root of the sum of the squared differences between each coordinate (Claude, 2008).
landmarks_dist(x)landmarks_dist(x)
x |
An object computed with |
A matrix with the distances for each landmark combination.
Borrowed from Claude (2008), pp. 49
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
if(isTRUE(interactive())){ library(pliman) img <- image_pliman("potato_leaves.jpg") x <- landmarks(img) landmarks_dist(x) }if(isTRUE(interactive())){ library(pliman) img <- image_pliman("potato_leaves.jpg") x <- landmarks(img) landmarks_dist(x) }
Select n landmarks that are spaced with a regular sequence of angles taken
between the outline coordinates and the centroid.
landmarks_regradi( x, n = 50, close = TRUE, plot = TRUE, ncol = NULL, nrow = NULL )landmarks_regradi( x, n = 50, close = TRUE, plot = TRUE, ncol = NULL, nrow = NULL )
x |
A |
n |
Number of points to be sampled. Defaults to 50. |
close |
Return a closed polygon? Defaults to |
plot |
Create a plot? Defaults to |
ncol, nrow
|
The number of rows or columns in the plot grid when a |
A list with the following objects:
pixindices: Vector of radius indices.
radii: Vector of sampled radii lengths.
Xc: The centroid coordinate of x axis.
Yc: The centroid coordinate of y axis.
coords: Coordinates of sampled points arranged in a two-column matrix.
If x is a list, a list of objects described above is returned.
Borrowed from Claude (2008), pp. 53
Claude, J. (2008) Morphometrics with R, Use R! series, Springer 316 pp.
library(pliman) plot_polygon(contours[[1]]) ldm <- landmarks_regradi(contours)library(pliman) plot_polygon(contours[[1]]) ldm <- landmarks_regradi(contours)
Add n leading zeros to a numeric sequence. This is useful to create a
character vector to rename files in a folder.
leading_zeros(x, n = 3)leading_zeros(x, n = 3)
x |
A numeric vector or a list of numeric vectors. |
n |
The number of leading zeros to add. Defaults to |
A character vector or a list of character vectors.
library(pliman) leading_zeros(1:5) leading_zeros(list(a = 1:3, b = 1:5), n = 2)library(pliman) leading_zeros(1:5) leading_zeros(list(a = 1:3, b = 1:5), n = 2)
For each polygon in an sf object, computes the line segment joining
the midpoints of the longer pair of opposite edges (the “half‐plot line”).
line_on_halfplot(shapefile)line_on_halfplot(shapefile)
shapefile |
An |
A SpatVector (from the terra package) of line geometries
representing the half‐plot midlines.
if(interactive()){ library(pliman) shp <- shapefile_input( paste0(image_pliman(), "/soy_shape.rds")) mosaic <- mosaic_input( paste0(image_pliman(), "/soy_dsm.tif")) mosaic_plot(mosaic) half <- line_on_halfplot(shp) shapefile_plot(half, add = TRUE, col = "blue") }if(interactive()){ library(pliman) shp <- shapefile_input( paste0(image_pliman(), "/soy_shape.rds")) mosaic <- mosaic_input( paste0(image_pliman(), "/soy_dsm.tif")) mosaic_plot(mosaic) half <- line_on_halfplot(shp) shapefile_plot(half, add = TRUE, col = "blue") }
Scans and lists all video capture devices (webcams, USB cameras, capture cards) available on the system, indicating device IDs and native camera names.
list_cameras(details = FALSE)list_cameras(details = FALSE)
details |
Logical. If |
A data frame containing camera id and friendly name, invisibly.
## Not run: # List available cameras list_cameras() # View detailed resolutions and formats list_cameras(details = TRUE) ## End(Not run)## Not run: # List available cameras list_cameras() # View detailed resolutions and formats list_cameras(details = TRUE) ## End(Not run)
Generates brushes of various sizes and shapes that can be used as structuring elements.
make_brush(size, shape = "disc", step = TRUE, sigma = 0.3, angle = 45)make_brush(size, shape = "disc", step = TRUE, sigma = 0.3, angle = 45)
size |
A numeric containing the size of the brush in pixels. This should be an odd number; even numbers are rounded to the next odd one. |
shape |
A character vector indicating the shape of the brush. Can be
|
step |
Logical. Creates a binary brush if |
sigma |
Standard deviation for Gaussian brush shape. |
angle |
Angle (in degrees) for line brush shape. |
A 2D matrix of 0s and 1s containing the desired brush.
if (interactive()) { make_brush(size = 51) |> image() make_brush(size = 51, shape = "diamond") |> image() }if (interactive()) { make_brush(size = 51) |> image() make_brush(size = 51, shape = "diamond") |> image() }
Make a mask using an image object and a brush.
make_mask(img, brush, rel_pos_x = 0.5, rel_pos_y = 0.5, plot = TRUE)make_mask(img, brush, rel_pos_x = 0.5, rel_pos_y = 0.5, plot = TRUE)
img |
A |
brush |
An object created with |
rel_pos_x, rel_pos_y
|
A relative position to include the brush in the image. Defaults to 0.5. This means that the brush will be centered in the original image. Smaller values move the brush toward the left and top, respectively. |
plot |
Plots the generated mask? Defaults to |
It applies a brush to an Image, selecting the image pixels that match the
brush values equal to 1. The position of the brush in the original image is
controlled by the relative positions x (rel_pos_x) and y (rel_pos_y)
arguments. The size of the brush must be smaller or equal to the smaller
dimension of image.
A binary image with 0s and 1s.
if (interactive()) { img <- image_pliman("soybean_touch.jpg") make_mask(img, brush = make_brush(size = 201)) make_mask(img, brush = make_brush(size = 401, shape = "diamond"), rel_pos_x = 0.1, rel_pos_y = 0.8) }if (interactive()) { img <- image_pliman("soybean_touch.jpg") make_mask(img, brush = make_brush(size = 201)) make_mask(img, brush = make_brush(size = 401, shape = "diamond"), rel_pos_x = 0.1, rel_pos_y = 0.8) }
image objectsMean method for image objects
## S3 method for class 'image' mean(x, ..., na.rm = FALSE)## S3 method for class 'image' mean(x, ..., na.rm = FALSE)
x |
An |
... |
Additional arguments. |
na.rm |
Logical; should NAs be removed? |
measure_disease() computes the percentage of symptomatic leaf area and
(optionally) counts and compute shapes (area, perimeter, radius, etc.) of
lesions in a sample or entire leaf using color palettes. See more at
Details.
measure_disease_iter() provides an iterative section for
measure_disease(), where the user picks up samples in the image to create
the needed color palettes.
measure_disease( img, img_healthy = NULL, img_symptoms = NULL, img_background = NULL, pattern = NULL, opening = c(10, 0), closing = c(0, 0), filter = c(0, 0), erode = c(0, 0), dilate = c(0, 0), parallel = FALSE, workers = NULL, resize = FALSE, fill_hull = TRUE, index_lb = NULL, index_dh = "GLI", has_white_bg = FALSE, threshold = NULL, invert = FALSE, lower_noise = 0.1, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, randomize = TRUE, nsample = 3000, watershed = FALSE, lesion_size = "medium", tolerance = NULL, extension = NULL, show_features = FALSE, show_segmentation = FALSE, plot = TRUE, show_original = TRUE, show_background = TRUE, show_contour = TRUE, contour_col = "white", contour_size = 1, col_leaf = NULL, col_lesions = NULL, col_background = NULL, marker = FALSE, marker_col = NULL, marker_size = NULL, save_image = FALSE, prefix = "proc_", name = NULL, dir_original = NULL, dir_processed = NULL, return_masks = FALSE, verbose = TRUE ) measure_disease_iter( img, has_background = TRUE, r = 3, by_leaf = FALSE, viewer = get_pliman_viewer(), opening = c(10, 0), closing = c(0, 0), filter = c(0, 0), erode = c(0, 0), dilate = c(0, 0), show = "rgb", index = "NGRDI", ... )measure_disease( img, img_healthy = NULL, img_symptoms = NULL, img_background = NULL, pattern = NULL, opening = c(10, 0), closing = c(0, 0), filter = c(0, 0), erode = c(0, 0), dilate = c(0, 0), parallel = FALSE, workers = NULL, resize = FALSE, fill_hull = TRUE, index_lb = NULL, index_dh = "GLI", has_white_bg = FALSE, threshold = NULL, invert = FALSE, lower_noise = 0.1, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, randomize = TRUE, nsample = 3000, watershed = FALSE, lesion_size = "medium", tolerance = NULL, extension = NULL, show_features = FALSE, show_segmentation = FALSE, plot = TRUE, show_original = TRUE, show_background = TRUE, show_contour = TRUE, contour_col = "white", contour_size = 1, col_leaf = NULL, col_lesions = NULL, col_background = NULL, marker = FALSE, marker_col = NULL, marker_size = NULL, save_image = FALSE, prefix = "proc_", name = NULL, dir_original = NULL, dir_processed = NULL, return_masks = FALSE, verbose = TRUE ) measure_disease_iter( img, has_background = TRUE, r = 3, by_leaf = FALSE, viewer = get_pliman_viewer(), opening = c(10, 0), closing = c(0, 0), filter = c(0, 0), erode = c(0, 0), dilate = c(0, 0), show = "rgb", index = "NGRDI", ... )
img |
The image to be analyzed. |
img_healthy |
A color palette of healthy tissues. |
img_symptoms |
A color palette of lesioned tissues. |
img_background |
A color palette of the background (if exists). These
arguments can be either an |
pattern |
A pattern of file name used to identify images to be
processed. For example, if |
erode, dilate, opening, closing, filter
|
Morphological operations (brush size)
Hierarchically, the operations are performed as opening > closing > filter. The value declared in each argument will define the brush size. |
parallel |
Processes the images asynchronously (in parallel) in separate
R sessions running in the background on the same machine. It may speed up
the processing time, especially when |
workers |
A positive numeric scalar or a function specifying the maximum number of parallel processes that can be active at the same time. |
resize |
Resize the image before processing? Defaults to |
fill_hull |
Fill holes in the image? Defaults to |
index_lb |
The index used to segment the foreground (e.g., leaf) from the background. If not declared, the entire image area (pixels) will be considered in the computation of the severity. |
index_dh |
The index used to segment diseased from healthy tissues when
|
has_white_bg |
Logical indicating whether a white background is present.
If |
threshold |
By default ( |
invert |
Inverts the binary image if desired. This is useful to process
images with black background. Defaults to |
lower_noise |
By default, lesions with lesser than 10% of the mean area
of all lesions are removed ( |
lower_size |
Lower limit for size for the image analysis. Leaf images
often contain dirt and dust. To prevent dust from affecting the image
analysis, the lower limit of analyzed size is set to 0.1, i.e., objects
with lesser than 10% of the mean of all objects are removed. One can set a
known area or use |
upper_size |
Upper limit for size for the image analysis. Defaults to
|
topn_lower, topn_upper
|
Select the top |
randomize |
Randomize the lines before training the model? Defaults to
|
nsample |
The number of sample pixels to be used in training step.
Defaults to |
watershed |
If |
lesion_size |
The size of the lesion. Used to automatically tune
|
tolerance |
The minimum height of the object in the units of image
intensity between its highest point (seed) and the point where it contacts
another object (checked for every contact pixel). If the height is smaller
than the tolerance, the object will be combined with one of its neighbors,
which is the highest. Defaults to |
extension |
Radius of the neighborhood in pixels for the detection of neighboring objects. Defaults to 20. Higher value smooths out small objects. |
show_features |
If |
show_segmentation |
Shows the object segmentation colored with random
permutations. Defaults to |
plot |
Show image after processing? Defaults to |
show_original |
Show the symptoms in the original image? |
show_background |
Show the background? Defaults to |
show_contour |
Show a contour line around the lesions? Defaults
to |
contour_col, contour_size
|
The color and size for the contour line
around objects. Defaults to |
col_leaf |
Leaf color after image processing. Defaults to |
col_lesions |
Symptoms color after image processing. Defaults to
|
col_background |
Background color after image processing. Defaults to
|
marker, marker_col, marker_size
|
The type, color and size of the object
marker. Defaults to |
save_image |
Save the image after processing? The image is saved in the
current working directory named as |
prefix |
The prefix to be included in the processed images. Defaults to
|
name |
The name of the image to save. Use this to overwrite the name of
the image in |
dir_original, dir_processed
|
The directory containing the original and
processed images. Defaults to |
return_masks |
Returns the leaf/disease masks? Defaults to |
verbose |
If |
has_background |
A logical indicating if the image has a background to be segmented before processing. |
r |
The radius of neighborhood pixels. Defaults to |
by_leaf |
Compute the severity by leaf? If |
viewer |
The viewer option. If not provided, the value is retrieved
using |
show |
The show option for the mapview viewer, either |
index |
The index to be shown when |
... |
Further parameters passed on to |
In measure_disease(), a general linear model (binomial family) fitted to
the RGB values is used to segment the lesions from the healthy leaf. If a
pallet of background is provided, the function takes care of the details to
isolate it before computing the number and area of lesions. By using pattern
it is possible to process several images with common pattern names that are
stored in the current working directory or in the subdirectory informed in
dir_original.
If img_healthy and img_symptoms are not declared, RGB-based phenotyping of
foliar disease severity is performed using the index informed in index_lb to
first segment leaf from background and index_dh to segment diseased from
healthy tissues.
measure_disease_iter() only run in an interactive section. In this function,
users will be able to pick up samples of images to iteratively create the
needed color palettes. This process calls pick_palette() internally. If
has_background is TRUE (default) the color palette for the background is
first created. The sample of colors is performed in each left-button mouse
click and continues until the user press Esc. Then, a new sampling process is
performed to sample the color of healthy tissues and then diseased tissues.
The generated palettes are then passed on to measure_disease(). All the
arguments of such function can be passed using the ... (three dots).
When show_features = TRUE, the function computes a total of 36 lesion
features (23 shape features and 13 texture features). The Haralick texture
features for each object based on a gray-level co-occurrence matrix (Haralick
et al. 1979). See more details in analyze_objects().
measure_disease() returns a list with the following objects:
severity A data frame with the percentage of healthy and symptomatic
areas.
shape,statistics If show_features = TRUE is used, returns the shape
(area, perimeter, etc.) for each lesion and a summary statistic of the
results.
measure_disease_iter() returns a list with the following objects:
results A list with the objects returned by measure_disease().
leaf The color palettes for the healthy leaf.
disease The color palettes for the diseased leaf.
background The color palettes for the background.
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) img <- image_pliman("sev_leaf_nb.jpg") healthy <- image_pliman("sev_healthy.jpg") lesions <- image_pliman("sev_sympt.jpg") image_combine(img, healthy, lesions, ncol = 3) sev <- measure_disease(img = img, img_healthy = healthy, img_symptoms = lesions, plot = TRUE) # an interactive section measure_disease_iter(img) }if (interactive()) { library(pliman) img <- image_pliman("sev_leaf_nb.jpg") healthy <- image_pliman("sev_healthy.jpg") lesions <- image_pliman("sev_sympt.jpg") image_combine(img, healthy, lesions, ncol = 3) sev <- measure_disease(img = img, img_healthy = healthy, img_symptoms = lesions, plot = TRUE) # an interactive section measure_disease_iter(img) }
Computes the percentage of symptomatic leaf area using color palettes or RGB
indexes by each leaf of an image. This allows, for example, processing
replicates of the same treatment and obtaining the results for each
replication with a single image. To do that, leaf samples are first splitten
with object_split() and then, measure_disease() is applied to the list of
leaves.
measure_disease_byl( img, index = "B", index_lb = "B", index_dh = "NGRDI", lower_size = NULL, watershed = TRUE, invert = FALSE, fill_hull = FALSE, opening = c(10, 0), closing = c(0, 0), filter = c(0, 0), erode = c(0, 0), dilate = c(0, 0), threshold = "Otsu", extension = NULL, tolerance = NULL, object_size = "large", img_healthy = NULL, img_symptoms = NULL, plot = TRUE, save_image = FALSE, dir_original = NULL, dir_processed = NULL, pattern = NULL, parallel = FALSE, workers = NULL, show_features = FALSE, verbose = TRUE, ... )measure_disease_byl( img, index = "B", index_lb = "B", index_dh = "NGRDI", lower_size = NULL, watershed = TRUE, invert = FALSE, fill_hull = FALSE, opening = c(10, 0), closing = c(0, 0), filter = c(0, 0), erode = c(0, 0), dilate = c(0, 0), threshold = "Otsu", extension = NULL, tolerance = NULL, object_size = "large", img_healthy = NULL, img_symptoms = NULL, plot = TRUE, save_image = FALSE, dir_original = NULL, dir_processed = NULL, pattern = NULL, parallel = FALSE, workers = NULL, show_features = FALSE, verbose = TRUE, ... )
img |
The image to be analyzed. |
index |
A character value specifying the target mode for
conversion to binary to segment the leaves from background. Defaults to "B"
(blue). See |
index_lb |
The index used to segment the foreground (e.g., leaf) from the background. If not declared, the entire image area (pixels) will be considered in the computation of the severity. |
index_dh |
The index used to segment diseased from healthy tissues when
|
lower_size |
To prevent dust from affecting object segmentation, objects
with lesser than |
watershed |
If |
invert |
Inverts the binary image if desired. |
fill_hull |
Fill holes in the binary image? Defaults to |
opening, closing, filter, erode, dilate
|
Morphological operations (brush size), applied in hierarchical order. |
threshold |
The threshold method ( |
extension |
Neighborhood radius for watershed segmentation. |
tolerance |
Minimum height for watershed segmentation. |
object_size |
The size of the object ( |
img_healthy |
A color palette of healthy tissues. |
img_symptoms |
A color palette of lesioned tissues. |
plot |
Show image after processing? |
save_image |
Save the image after processing? The image is saved in the
current working directory named as |
dir_original, dir_processed
|
The directory containing the original and
processed images. Defaults to |
pattern |
A pattern of file name used to identify images to be
processed. For example, if |
parallel |
Processes the images asynchronously (in parallel) in separate
R sessions running in the background on the same machine. It may speed up
the processing time, especially when |
workers |
A positive numeric scalar or a function specifying the maximum number of parallel processes that can be active at the same time. |
show_features |
If |
verbose |
If |
... |
Additional arguments passed on to |
A list with the following objects:
severity A data frame with the percentage of healthy and symptomatic
areas for each leaf in the image(s).
shape,statistics If show_features = TRUE is used, returns the shape
(area, perimeter, etc.) for each lesion and a summary statistic of the
results.
if (interactive()) { library(pliman) img <- image_pliman("mult_leaves.jpg", plot = TRUE) sev <- measure_disease_byl(img = img, index_lb = "B", index_dh = "NGRDI", workers = 2) sev$severity }if (interactive()) { library(pliman) img <- image_pliman("mult_leaves.jpg", plot = TRUE) sev <- measure_disease_byl(img = img, index_lb = "B", index_dh = "NGRDI", workers = 2) sev$severity }
This function calls measure_disease() in each image polygon of a shapefile
object generated with image_shp() and bind the results into read-ready data
frames.
measure_disease_shp( img, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, prepare = FALSE, viewer = "mapview", index_lb = "HUE2", index_dh = "NGRDI", pattern = NULL, threshold = NULL, invert = FALSE, dir_original = NULL, show_features = FALSE, interactive = FALSE, plot = TRUE, parallel = FALSE, workers = NULL, verbose = TRUE, ... )measure_disease_shp( img, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, prepare = FALSE, viewer = "mapview", index_lb = "HUE2", index_dh = "NGRDI", pattern = NULL, threshold = NULL, invert = FALSE, dir_original = NULL, show_features = FALSE, interactive = FALSE, plot = TRUE, parallel = FALSE, workers = NULL, verbose = TRUE, ... )
img |
The image to be analyzed. Either an image of class |
nrow, ncol
|
The number of rows and columns to generate the shapefile.
Defaults to |
buffer_x, buffer_y
|
Buffering factor for the width and height, respectively, of each individual shape's side. A value between 0 and 0.5 where 0 means no buffering and 0.5 means complete buffering (default: 0). A value of 0.25 will buffer the shape by 25% on each side. |
prepare |
Logical value indicating whether to prepare the image for
analysis using |
viewer |
The viewer option. If not provided, the value is retrieved
using |
index_lb |
The index used to segment the foreground (e.g., leaf) from the background. If not declared, the entire image area (pixels) will be considered in the computation of the severity. |
index_dh |
The index used to segment diseased from healthy tissues when
|
pattern |
A pattern of file name used to identify images to be
processed. For example, if |
threshold |
By default ( |
invert |
Inverts the binary image if desired. This is useful to process
images with black background. Defaults to |
dir_original |
The directory containing the original and processed images.
Defaults to |
show_features |
If |
interactive |
If |
plot |
Show image after processing? Defaults to |
parallel |
Processes the images asynchronously (in parallel) in separate
R sessions running in the background on the same machine. It may speed up
the processing time, especially when |
workers |
A positive numeric scalar or a function specifying the maximum number of parallel processes that can be active at the same time. |
verbose |
If |
... |
Aditional arguments passed on to measure_disease. |
An object of class plm_disease_byl. See more details in the Value
section of measure_disease().
if (interactive()) { # severity for the three leaflets (from left to right) img <- image_pliman("mult_leaves.jpg", plot = TRUE) sev <- measure_disease_shp(img = img, nrow = 1, ncol = 3, index_lb = "B", index_dh = "NGRDI") sev$severity }if (interactive()) { # severity for the three leaflets (from left to right) img <- image_pliman("mult_leaves.jpg", plot = TRUE) sev <- measure_disease_shp(img = img, nrow = 1, ncol = 3, index_lb = "B", index_dh = "NGRDI") sev$severity }
The measures_injury function calculates the percentage of injury in images
by performing binary segmentation and identifying lesions. It processes
either a single image or a batch of images specified by a pattern in a
directory.
measure_injury( img = NULL, pattern = NULL, index = "GRAY", threshold = "Otsu", invert = FALSE, opening = 5, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), plot = TRUE, dir_original = NULL, parallel = FALSE, workers = NULL, verbose = TRUE )measure_injury( img = NULL, pattern = NULL, index = "GRAY", threshold = "Otsu", invert = FALSE, opening = 5, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), plot = TRUE, dir_original = NULL, parallel = FALSE, workers = NULL, verbose = TRUE )
img |
The image to be analyzed. |
pattern |
A pattern of file name used to identify images to be imported. |
index |
A character value specifying the index for conversion to binary image. |
threshold |
The threshold method ( |
invert |
Inverts the binary image if desired. |
opening, closing, filter, erode, dilate
|
Morphological operations (brush size), applied in hierarchical order. |
filter_order |
Hierarchical order of morphological operations. |
plot |
Show image after processing? |
dir_original |
The directory containing the original and processed images. Defaults to NULL. In this case, the function will search for the image img in the current working directory. |
parallel |
If |
workers |
Number of parallel processes. |
verbose |
If |
The function processes each image by reading it, applying binary segmentation to detect lesions, filling the segmented areas, calculating the injury percentage, and optionally saving the processed image with highlighted lesions. In batch mode, it uses the provided pattern to identify images in the specified directory and can utilize parallel processing for efficiency.
A numeric value representing the injury percentage for a single image, or a data frame with injury percentages for batch processing.
model_to_int8() converts installed or custom ONNX neural network models to 8-bit integer
(INT8) precision. Dynamic quantization reduces model disk size by up to 75% and accelerates
CPU inference by 2–3x with virtually no loss in detection or segmentation accuracy.
When model = NULL (default), model_to_int8() scans the pliman model directory
(pliman_model_dir()) and converts all installed FP32 .onnx models into _int8.onnx models.
Existing INT8 models are skipped unless overwrite = TRUE.
model_to_int8( model = NULL, dir = pliman_model_dir(), weight_type = c("QUInt8", "QInt8"), overwrite = FALSE, verbose = TRUE ) models_to_int8( model = NULL, dir = pliman_model_dir(), weight_type = c("QUInt8", "QInt8"), overwrite = FALSE, verbose = TRUE )model_to_int8( model = NULL, dir = pliman_model_dir(), weight_type = c("QUInt8", "QInt8"), overwrite = FALSE, verbose = TRUE ) models_to_int8( model = NULL, dir = pliman_model_dir(), weight_type = c("QUInt8", "QInt8"), overwrite = FALSE, verbose = TRUE )
model |
Optional character vector of model name(s) or file path(s) to quantize.
If |
dir |
Directory where installed models are located. Defaults to |
weight_type |
Precision type: |
overwrite |
Logical. If |
verbose |
Logical. Show progress messages and compression summary. Defaults to |
A data.frame of class pliman_quantize_summary listing each model, original size,
INT8 size, reduction percentage, and conversion status.
## Not run: library(pliman) # Convert a specific installed model model_to_int8("capsulas_det.onnx") # Convert all installed models in pliman_model_dir() summary <- model_to_int8() print(summary) ## End(Not run)## Not run: library(pliman) # Convert a specific installed model model_to_int8("capsulas_det.onnx") # Convert all installed models in pliman_model_dir() summary <- model_to_int8() print(summary) ## End(Not run)
Aggregate a SpatRaster to create a new SpatRaster with a lower resolution (larger cells), using the GDAL's gdal_translate utility https://gdal.org/programs/gdal_translate.html
mosaic_aggregate( mosaic, pct = 50, fun = "nearest", file = NULL, overwrite = FALSE, in_memory = TRUE )mosaic_aggregate( mosaic, pct = 50, fun = "nearest", file = NULL, overwrite = FALSE, in_memory = TRUE )
mosaic |
SpatRaster |
pct |
The size as a fraction (percentage) of the input image size. Either a scalar (eg., 50), or a length-two numeric vector. In the last, different percentage reduction/expansion can be used for columns, and rows, respectively. |
fun |
The resampling function. Defaults to |
file |
The file path (including filename and extension) where the
aggregated raster should be saved. Defaults to |
overwrite |
Logical. If |
in_memory |
Wheter to return an 'in-memory' |
SpatRaster
if (interactive()) { library(pliman) library(terra) r <- rast() values(r) <- 1:ncell(r) r2 <- mosaic_aggregate(r, pct = 10) opar <- par(no.readonly = TRUE) par(mfrow=c(1,2)) mosaic_plot(r) mosaic_plot(r2) par(opar) }if (interactive()) { library(pliman) library(terra) r <- rast() values(r) <- 1:ncell(r) r2 <- mosaic_aggregate(r, pct = 10) opar <- par(no.readonly = TRUE) par(mfrow=c(1,2)) mosaic_plot(r) mosaic_plot(r2) par(opar) }
This function analyzes a mosaic of remote sensing data (UVAs or satellite imagery), extracting information from specified regions of interest (ROIs) defined in a shapefile or interactively drawn on the mosaic. It allows counting and measuring individuals (eg., plants), computing canopy coverage, and statistical summaries (eg., mean, coefficient of variation) for vegetation indices (eg, NDVI) at a block, plot, individual levels or even extract the raw results at pixel level.
mosaic_analyze( mosaic, r = 3, g = 2, b = 1, re = NA, nir = NA, swir = NA, tir = NA, crop_to_shape_ext = TRUE, grid = TRUE, nrow = 1, ncol = 1, plot_width = NULL, plot_height = NULL, layout = "lrtb", indexes = NULL, shapefile = NULL, basemap = NULL, build_shapefile = TRUE, check_shapefile = TRUE, buffer_edge = 1, buffer_col = 0, buffer_row = 0, segment_plot = FALSE, segment_individuals = FALSE, segment_pick = FALSE, mask = NULL, dsm = NULL, dsm_lower = 0.2, dsm_upper = NULL, dsm_window_size = c(5, 5), simplify = FALSE, map_individuals = FALSE, map_direction = c("horizontal", "vertical"), watershed = TRUE, tolerance = 1, extension = 1, include_if = "centroid", plot_index = "GLI", segment_index = NULL, in_memory = TRUE, threshold = "Otsu", opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, lower_noise = 0.15, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, summarize_fun = "mean", summarize_quantiles = NULL, attribute = NULL, invert = FALSE, color_regions = rev(grDevices::terrain.colors(50)), alpha = 1, max_pixels = 2e+06, downsample = NULL, quantiles = c(0, 1), plot = TRUE, verbose = TRUE )mosaic_analyze( mosaic, r = 3, g = 2, b = 1, re = NA, nir = NA, swir = NA, tir = NA, crop_to_shape_ext = TRUE, grid = TRUE, nrow = 1, ncol = 1, plot_width = NULL, plot_height = NULL, layout = "lrtb", indexes = NULL, shapefile = NULL, basemap = NULL, build_shapefile = TRUE, check_shapefile = TRUE, buffer_edge = 1, buffer_col = 0, buffer_row = 0, segment_plot = FALSE, segment_individuals = FALSE, segment_pick = FALSE, mask = NULL, dsm = NULL, dsm_lower = 0.2, dsm_upper = NULL, dsm_window_size = c(5, 5), simplify = FALSE, map_individuals = FALSE, map_direction = c("horizontal", "vertical"), watershed = TRUE, tolerance = 1, extension = 1, include_if = "centroid", plot_index = "GLI", segment_index = NULL, in_memory = TRUE, threshold = "Otsu", opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, lower_noise = 0.15, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, summarize_fun = "mean", summarize_quantiles = NULL, attribute = NULL, invert = FALSE, color_regions = rev(grDevices::terrain.colors(50)), alpha = 1, max_pixels = 2e+06, downsample = NULL, quantiles = c(0, 1), plot = TRUE, verbose = TRUE )
mosaic |
A mosaic of class |
r, g, b, re, nir, swir, tir
|
The red, green, blue, red-edge, near-infrared, shortwave Infrared, and thermal infrared bands of the image, respectively. By default, the function assumes a BGR as input (b = 1, g = 2, r = 3). If a multispectral image is provided up to seven bands can be used to compute built-in indexes. There are no limitation of band numbers if the index is computed using the band name. |
crop_to_shape_ext |
Crop the mosaic to the extension of shapefile?
Defaults to |
grid |
Logical, indicating whether to use a grid for segmentation (default: TRUE). |
nrow |
Number of rows for the grid (default: 1). |
ncol |
Number of columns for the grid (default: 1). |
plot_width, plot_height
|
The width and height of the plot shape (in the
mosaic unit). It is mutually exclusiv with |
layout |
Character: one of
|
indexes |
An optional |
shapefile |
An optional shapefile containing regions of interest (ROIs) for analysis. |
basemap |
An optional basemap generated with |
build_shapefile |
Logical, indicating whether to interactively draw ROIs
if the shapefile is |
check_shapefile |
Logical, indicating whether to validate the shapefile with an interactive map view (default: TRUE). This enables live editing of the drawn shapefile by deleting or changing the drawn grids. |
buffer_edge |
Width of the buffer around the shapefile (default: 5). |
buffer_col, buffer_row
|
Buffering factor for the columns and rows, respectively, of each individual plot's side. A value between 0 and 0.5 where 0 means no buffering and 0.5 means complete buffering (default: 0). A value of 0.25 will buffer the plot by 25% on each side. |
segment_plot |
Logical, indicating whether to segment plots (default:
FALSE). If |
segment_individuals |
Logical, indicating whether to segment individuals
within plots (default: FALSE). If |
segment_pick |
When |
mask |
An optional mask (SpatRaster) to mask the mosaic. |
dsm |
A SpatRaster object representing the digital surface model. Must
be a single-layer raster. If a DSM is informed, a mask will be derived from
it using |
dsm_lower |
A numeric value specifying the lower height threshold. All heights greater than this value are retained. |
dsm_upper |
An optional numeric value specifying the upper height threshold. If provided, only heights between lower and upper are retained. |
dsm_window_size |
An integer (meters) specifying the window size (rows and columns, respectively) for creating a DTM using a moving window. Default is c(5, 5). |
simplify |
Removes vertices in polygons to form simpler shapes. The
function implementation uses the Douglas-Peucker algorithm using
|
map_individuals |
If |
map_direction |
The direction for mapping individuals within plots.
Should be one of |
watershed |
If |
tolerance |
The minimum height of the object in the units of image intensity between its highest point (seed) and the point where it contacts another object (checked for every contact pixel). If the height is smaller than the tolerance, the object will be combined with one of its neighbors, which is the highest. Values < 1.0 are interpreted as relative tolerance (percentage of the peak height). Values >= 1.0 are interpreted as absolute tolerance in pixels (linear Euclidean distance). |
extension |
Radius of the neighborhood in pixels for the detection of neighboring objects. A higher value smooths out small objects. |
include_if |
Character vector specifying the type of intersection.
Defaults to "centroid" (individuals in which the centroid is included within
the drawn plot will be included in that plot). Other possible values include
|
plot_index |
The index(es) to be computed for the drawn plots. Either a
single vegetation index (e.g., |
segment_index |
The index used for segmentation. The same rule as
|
in_memory |
Logical, indicating whether the indexes should be computed
in memory. Defaults to |
threshold |
By default (threshold = "Otsu"), a threshold value based on Otsu's method is used to reduce the grayscale image to a binary image. If a numeric value is provided, this value will be used as a threshold. |
opening, closing, filter, erode, dilate
|
Morphological operations (brush size), applied in hierarchical order. |
lower_noise |
Objects with area less than |
lower_size, upper_size
|
Lower and upper size limits for object filtering. |
topn_lower, topn_upper
|
Select top |
summarize_fun |
The function to compute summaries for the pixel values. Defaults to "mean," i.e., the mean value of the pixels (either at a plot- or individual-level) is returned. |
summarize_quantiles |
quantiles to be computed when 'quantile' is on |
attribute |
The attribute to be shown at the plot when |
invert |
Logical, indicating whether to invert the mask. Defaults to
|
color_regions |
The color palette for regions (default: rev(grDevices::terrain.colors(50))). |
alpha |
opacity of the fill color of the raster layer(s). |
max_pixels |
Maximum number of pixels to render in the map or plot (default: 500000). |
downsample |
Downsampling factor to reduce the number of pixels
(default: NULL). In this case, if the number of pixels in the image (width
x height) is greater than |
quantiles |
the upper and lower quantiles used for color stretching. |
plot |
Logical, indicating whether to generate plots (default: TRUE). |
verbose |
Logical, indicating whether to display verbose output (default: TRUE). |
Since multiple blocks can be analyzed, the length of arguments grid,
nrow, ncol, buffer_edge, , buffer_col, buffer_row, segment_plot,
segment_i, ndividuals, includ_if, threshold, segment_index, invert,
filter, threshold, lower_size, upper_size, watershed, and
lower_noise, can be either an scalar (the same argument applied to all the
drawn blocks), or a vector with the same length as the number of drawn. In
the last, each block can be analyzed with different arguments.
When segment_individuals = TRUE is enabled, individuals are included within
each plot based on the include_if argument. The default value
('centroid') includes an object in a given plot if the centroid of that
object is within the plot. This makes the inclusion mutually exclusive (i.e.,
an individual is included in only one plot). If 'covered' is selected,
objects are included only if their entire area is covered by the plot. On the
other hand, selecting overlap is the complement of covered; in other
words, objects that overlap the plot boundary are included. Finally, when
intersect is chosen, objects that intersect the plot boundary are included.
This makes the inclusion ambiguous (i.e., an object can be included in more
than one plot).
A list containing the following objects:
result_plot: The results at a plot level.
result_plot_summ: The summary of results at a plot level. When
segment_individuals = TRUE, the number of individuals, canopy coverage,
and mean values of some shape statistics such as perimeter, length, width,
and diameter are computed.
result_individ: The results at an individual level.
map_plot: An object of class mapview showing the plot-level results.
map_individual: An object of class mapview showing the individual-level
results.
shapefile: The generated shapefile, with the drawn grids/blocks.
if (interactive()) { library(pliman) url <- "https://github.com/TiagoOlivoto/images/raw/master/pliman/rice_field/rice_ex.tif" mosaic <- mosaic_input(url) # Draw a polygon (top left, top right, bottom right, bottom left, top left) # include 8 rice lines and one column res <- mosaic_analyze(mosaic, r = 1, g = 2, b = 3, segment_individuals = TRUE, # segment the individuals segment_index = "(G-B)/(G+B-R)",# index for segmentation filter = 4, nrow = 8, map_individuals = TRUE) # map with individual results res$map_indiv }if (interactive()) { library(pliman) url <- "https://github.com/TiagoOlivoto/images/raw/master/pliman/rice_field/rice_ex.tif" mosaic <- mosaic_input(url) # Draw a polygon (top left, top right, bottom right, bottom left, top left) # include 8 rice lines and one column res <- mosaic_analyze(mosaic, r = 1, g = 2, b = 3, segment_individuals = TRUE, # segment the individuals segment_index = "(G-B)/(G+B-R)",# index for segmentation filter = 4, nrow = 8, map_individuals = TRUE) # map with individual results res$map_indiv }
High-resolution mosaics can take a significant amount of time to analyze,
especially when segment_individuals = TRUE is used in mosaic_analyze().
This is because the function needs to create in-memory arrays to segment
individual using the watershed algorithm. This process utilizes a for-loop
approach, iteratively analyzing each shape within the mosaic one at a time.
To speed up processing, the function crops the original mosaic to the extent
of the current shape before analyzing it. This reduces the resolution for
that specific analysis, sacrificing some detail for faster processing.
mosaic_analyze_iter( mosaic, shapefile, basemap = NULL, r = 3, g = 2, b = 1, re = NA, nir = NA, swir = NA, tir = NA, plot = TRUE, verbose = TRUE, max_pixels = 3e+06, attribute = NULL, summarize_fun = "mean", segment_plot = FALSE, segment_individuals = FALSE, segment_index = "VARI", plot_index = "VARI", color_regions = rev(grDevices::terrain.colors(50)), alpha = 0.75, quantiles = c(0, 1), parallel = FALSE, workers = NULL, ... )mosaic_analyze_iter( mosaic, shapefile, basemap = NULL, r = 3, g = 2, b = 1, re = NA, nir = NA, swir = NA, tir = NA, plot = TRUE, verbose = TRUE, max_pixels = 3e+06, attribute = NULL, summarize_fun = "mean", segment_plot = FALSE, segment_individuals = FALSE, segment_index = "VARI", plot_index = "VARI", color_regions = rev(grDevices::terrain.colors(50)), alpha = 0.75, quantiles = c(0, 1), parallel = FALSE, workers = NULL, ... )
mosaic |
A mosaic of class |
shapefile |
An optional shapefile containing regions of interest (ROIs) for analysis. |
basemap |
An optional basemap generated with |
r, g, b, re, nir, swir, tir
|
The red, green, blue, red-edge, near-infrared, shortwave Infrared, and thermal infrared bands of the image, respectively. By default, the function assumes a BGR as input (b = 1, g = 2, r = 3). If a multispectral image is provided up to seven bands can be used to compute built-in indexes. There are no limitation of band numbers if the index is computed using the band name. |
plot |
Logical, indicating whether to generate plots (default: TRUE). |
verbose |
Logical, indicating whether to display verbose output (default: TRUE). |
max_pixels |
Maximum number of pixels to render in the map or plot (default: 500000). |
attribute |
The attribute to be shown at the plot when |
summarize_fun |
The function to compute summaries for the pixel values. Defaults to "mean," i.e., the mean value of the pixels (either at a plot- or individual-level) is returned. |
segment_plot |
Logical, indicating whether to segment plots (default:
FALSE). If |
segment_individuals |
Logical, indicating whether to segment individuals
within plots (default: FALSE). If |
segment_index |
The index used for segmentation. The same rule as
|
plot_index |
The index(es) to be computed for the drawn plots. Either a
single vegetation index (e.g., |
color_regions |
The color palette for regions (default: rev(grDevices::terrain.colors(50))). |
alpha |
opacity of the fill color of the raster layer(s). |
quantiles |
the upper and lower quantiles used for color stretching. |
parallel |
If |
workers |
Number of parallel processes. |
... |
Further arguments passed on to |
A list containing the following objects:
result_plot: The results at a plot level.
result_plot_summ: The summary of results at a plot level. When
segment_individuals = TRUE, the number of individuals, canopy coverage,
and mean values of some shape statistics such as perimeter, length, width,
and diameter are computed.
result_individ: The results at an individual level.
map_plot: An object of class mapview showing the plot-level results.
map_individual: An object of class mapview showing the individual-level
results.
This function calculates the canopy height model (CHM) and the volume for a given digital surface model (DSM) raster layer. Optionally, a digital terrain model (DTM) can be provided or interpolated using a set of points or a moving window.
mosaic_chm( dsm, dtm = NULL, points = NULL, interpolation = c("Tps", "Kriging"), window_size = c(5, 5), ground_quantile = 0, mask = NULL, mask_soil = TRUE, verbose = TRUE )mosaic_chm( dsm, dtm = NULL, points = NULL, interpolation = c("Tps", "Kriging"), window_size = c(5, 5), ground_quantile = 0, mask = NULL, mask_soil = TRUE, verbose = TRUE )
dsm |
A |
dtm |
(optional) A |
points |
(optional) An |
interpolation |
(optional) A character string specifying the
interpolation method to use when |
window_size |
An integer (meters) specifying the window size (rows and columns, respectively) for creating a DTM using a moving window. Default is c(10, 10). |
ground_quantile |
Numeric value between |
mask |
(optional) A |
mask_soil |
Is |
verbose |
Return the progress messages. Default is TRUE. |
The function first checks if the input dsm is a valid single-layer
SpatRaster object. If dtm is not provided, The function generates a
Digital Terrain Model (DTM) from a Digital Surface Model (DSM) by
downsampling and smoothing the input raster data. It iterates over the DSM
matrix in windows of specified size, finds the minimum value within each
window, and assigns these values to a downsampled matrix. After downsampling,
the function applies a mean filter to smooth the matrix, enhancing the visual
and analytical quality of the DTM. Afterwards, DTM is resampled with the
original DSM.
If both dsm and dtm are provided, the function ensures they have the same
extent and number of cells, resampling dtm if necessary. The CHM is then
calculated as the difference between dsm and dtm, and the volume is
calculated by multiplying the CHM by the pixel size. The results are
optionally masked using the provided mask.
A SpatRaster object with three layers: dtm (digital terrain
model), height (canopy height model), and volume.
This function extracts height-related summary statistics from a CHM using a given shapefile.
mosaic_chm_extract( chm, shapefile, chm_threshold = NULL, quantiles = c(0, 0.05, 0.5, 0.95, 1) )mosaic_chm_extract( chm, shapefile, chm_threshold = NULL, quantiles = c(0, 0.05, 0.5, 0.95, 1) )
chm |
An object computed with |
shapefile |
An |
chm_threshold |
A numeric value representing the height threshold for
calculating coverage. If |
quantiles |
A numeric vector specifying the quantiles to be
extracted. Defaults to |
An sf object containing height summary statistics for each plot,
including:
min: Minimum height value.
q05: 5th percentile height value.
q50: Median height value.
q95: 95th percentile height value.
max: Maximum height value.
mean: Mean height value.
volume: Total sum of heights multiplied by CHM resolution.
coverage: If a mask is used in mosaic_chm() or chm_threshold is
informed, returns the proportion of pixels covered within the plot.
Otherwise, returns 1.
This function applies a height-based mask to a Canopy Height Model (CHM),
focusing on areas with heights above a specified lower threshold and,
optionally, below an upper threshold.
mosaic_chm_mask( dsm, lower, upper = NULL, window_size = c(5, 5), interpolation = "Tps" )mosaic_chm_mask( dsm, lower, upper = NULL, window_size = c(5, 5), interpolation = "Tps" )
dsm |
A |
lower |
A numeric value specifying the lower height threshold. All heights greater than this value are retained. |
upper |
An optional numeric value specifying the upper height threshold.
If provided, only heights between |
window_size |
An integer (meters) specifying the window size (rows and columns, respectively) for creating a DTM using a moving window. Default is c(10, 10). |
interpolation |
(optional) A character string specifying the
interpolation method to use when |
The mosaic_chm function, used internally, generates the DTM from the DSM by
downsampling and smoothing raster data, applying a moving window to extract
minimum values and then interpolating the results. The CHM is computed as the
height difference between the DSM and DTM. This function calculates and
applies a mask based on height thresholds.
An SpatRaster object representing the masked CHM.
This function classifies a given raster mosaic based on user-defined breaks. It provides an option to calculate the frequency and area of each class, as well as plot the classified mosaic.
mosaic_classify(mosaic, breaks, frequency = TRUE, plot = TRUE)mosaic_classify(mosaic, breaks, frequency = TRUE, plot = TRUE)
mosaic |
A |
breaks |
A numeric vector specifying the breakpoints for classification. |
frequency |
Logical. If |
plot |
Logical. If |
A list with two elements:
classified: A SpatRaster object containing the classified mosaic.
class_freq: A data frame containing class frequencies, areas (ha), and percentages (if frequency = TRUE).
if(interactive()){ library(pliman) library(terra) # Create an example raster r <- terra::rast(matrix(runif(100, min = 0, max = 1), nrow=10, ncol=10)) # Classify the raster result <- mosaic_classify(r, breaks = c(0.3, 0.6)) # View results result$classified result$class_freq }if(interactive()){ library(pliman) library(terra) # Create an example raster r <- terra::rast(matrix(runif(100, min = 0, max = 1), nrow=10, ncol=10)) # Classify the raster result <- mosaic_classify(r, breaks = c(0.3, 0.6)) # View results result$classified result$class_freq }
Quickly partition a large raster mosaic into individual tiles using a
polygon layer. Each tile is clipped by either the polygon's bounding box
or (optionally) the exact feature geometry, and written to disk as a separate
GeoTIFF named by the feature's unique_id.
mosaic_clip( mosaic, shapefile, unique_id = "unique_id", out_dir = NULL, overwrite = TRUE, verbose = TRUE, exact = FALSE, parallel = FALSE, workers = NULL )mosaic_clip( mosaic, shapefile, unique_id = "unique_id", out_dir = NULL, overwrite = TRUE, verbose = TRUE, exact = FALSE, parallel = FALSE, workers = NULL )
mosaic |
A terra::SpatRaster object or a file path pointing to a raster. In-memory rasters are first written to a temporary GeoTIFF. |
shapefile |
An sf::sf, terra::SpatVector, or path to a vector file. Must
contain a column named |
unique_id |
A column present in |
out_dir |
Directory where clipped rasters will be saved. Defaults to the current working directory. Created recursively if it does not exist. |
overwrite |
Logical; if |
verbose |
Logical; if |
exact |
Logical; if |
parallel |
Logical; if |
workers |
Integer; number of parallel daemons to launch when |
Clip a Raster Mosaic by Polygons
This function wraps GDAL's warp utility for efficient raster clipping.
When parallel = TRUE, it will spawn multiple workers via mirai and
process tiles in batches. Use exact = TRUE to clip to the true polygon
shape (at some extra cost), or leave exact = FALSE for a faster
bounding-box crop.
Invisibly returns a character vector of file paths to all clipped GeoTIFFs.
This function allows cropping of a raster mosaic interactively or programmatically:
Interactive Mode: If neither shapefile nor mosaic2 is provided, an interactive map
is shown via mosaic_view(), allowing users to draw a rectangle to define the cropping area.
Shapefile Mode: If a SpatVector is provided in shapefile, cropping or masking is performed
based on its extent or exact shape, optionally with a buffer.
Raster Mode: If mosaic2 is provided, mosaic will be cropped to match the extent of mosaic2.
For disk-based mosaics, cropping with shapefiles uses GDAL (sf::gdal_utils()) to improve efficiency.
mosaic_crop( mosaic, r = 3, g = 2, b = 1, re = 4, nir = 5, shapefile = NULL, in_memory = FALSE, mosaic2 = NULL, buffer = 0, show = c("rgb", "index"), index = "R", max_pixels = 5e+05, downsample = NULL, type = c("crop", "mask"), ... )mosaic_crop( mosaic, r = 3, g = 2, b = 1, re = 4, nir = 5, shapefile = NULL, in_memory = FALSE, mosaic2 = NULL, buffer = 0, show = c("rgb", "index"), index = "R", max_pixels = 5e+05, downsample = NULL, type = c("crop", "mask"), ... )
mosaic |
A |
r, g, b, re, nir
|
Integer indices representing the red, green, blue, red-edge, and near-infrared bands of the input mosaic. Default assumes BGR format (b = 1, g = 2, r = 3). |
shapefile |
An optional |
in_memory |
Logical. If |
mosaic2 |
A second |
buffer |
A numeric value indicating a buffer (in CRS units) to apply around the shapefile geometry. |
show |
A character value indicating what to display in the interactive viewer. Either |
index |
The index to show if |
max_pixels |
Maximum number of pixels to render in the interactive viewer. |
downsample |
Optional downsampling factor for display purposes. |
type |
Either
|
... |
Additional arguments passed to |
Crop or mask a SpatRaster object (mosaic) based on user input from an
interactive map or by using a provided shapefile or another raster.
A cropped or masked SpatRaster object.
if (interactive()) { library(pliman) # Load a sample raster mosaic <- mosaic_input(system.file("ex/elev.tif", package = "terra")) # Interactive cropping with drawn rectangle cropped <- mosaic_crop(mosaic) # View result mosaic_view(cropped) }if (interactive()) { library(pliman) # Load a sample raster mosaic <- mosaic_input(system.file("ex/elev.tif", package = "terra")) # Interactive cropping with drawn rectangle cropped <- mosaic_crop(mosaic) # View result mosaic_view(cropped) }
Drawing Lines or Polygons with Raster Information
mosaic_draw( mosaic, r = 3, g = 2, b = 1, re = 4, nir = 5, index = "NGRDI", show = "rgb", segment = FALSE, viewer = c("mapview", "base"), threshold = "Otsu", invert = FALSE, summarize_fun = NULL, buffer = 2, color_regions = rev(grDevices::terrain.colors(50)), alpha = 1, max_pixels = 1e+06, downsample = NULL, quantiles = c(0, 1), plot = TRUE, plot_layout = c(1, 2, 3, 3) )mosaic_draw( mosaic, r = 3, g = 2, b = 1, re = 4, nir = 5, index = "NGRDI", show = "rgb", segment = FALSE, viewer = c("mapview", "base"), threshold = "Otsu", invert = FALSE, summarize_fun = NULL, buffer = 2, color_regions = rev(grDevices::terrain.colors(50)), alpha = 1, max_pixels = 1e+06, downsample = NULL, quantiles = c(0, 1), plot = TRUE, plot_layout = c(1, 2, 3, 3) )
mosaic |
A mosaic of class |
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands of the image, respectively. By default, the function assumes a BGR as input (b = 1, g = 2, r = 3). If a multispectral image is provided up to seven bands can be used to compute built-in indexes. There are no limitation of band numbers if the index is computed using the band name. |
index |
The index to use for the index view. Defaults to "B". |
show |
The display option for the map view. Options are "rgb" for RGB view and "index" for index view. |
segment |
Should the raster object be segmented? If set to |
viewer |
The viewer option. If not provided, the value is retrieved
using |
threshold |
By default (threshold = "Otsu"), a threshold value based on Otsu's method is used to reduce the grayscale image to a binary image. If a numeric value is informed, this value will be used as a threshold. |
invert |
Inverts the mask if desired. Defaults to |
summarize_fun |
An optional function or character vector. When
|
buffer |
Adds a buffer around the geometries of the SpatVector created.
Note that the distance unit of |
color_regions |
The color palette for displaying index values. Defaults
to |
alpha |
opacity of the fill color of the raster layer(s). |
max_pixels |
Maximum number of pixels to render in the map or plot (default: 500000). |
downsample |
Downsampling factor to reduce the number of pixels
(default: NULL). In this case, if the number of pixels in the image (width
x height) is greater than |
quantiles |
the upper and lower quantiles used for color stretching. |
plot |
Plots the draw line/rectangle? Defaults to |
plot_layout |
The de plot layout. Defaults to |
The mosaic_draw function enables you to create mosaic drawings from
remote sensing data and compute vegetation indices.
If a line is drawn using the "Draw Polyline" tool, the profile of index is
displayed on the y-axis along the line's distance, represented in meter
units. It is important to ensure that the Coordinate Reference System (CRS)
of mosaic has latitude/longitude units for accurate distance
representation.
If a rectangle or polygon is drawn using the "Draw Rectangle" or "Draw Polygon"
tools, the index values are calculated for each object. By default, the
raw data is returned. You can set the summarize_fun to compute a summary
statistic for each object.
An invisible list containing the mosaic, draw_data, distance, distance_profile, geometry, and map.
if (interactive()) { library(pliman) # Load a raster showing the elevation of Luxembourg mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) # draw a polyline to see the elevation profile along the line mosaic_draw(mosaic, buffer = 1500) }if (interactive()) { library(pliman) # Load a raster showing the elevation of Luxembourg mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) # draw a polyline to see the elevation profile along the line mosaic_draw(mosaic, buffer = 1500) }
This function calculates the EPSG code for a given mosaic based on its geographic extent.
mosaic_epsg(mosaic)mosaic_epsg(mosaic)
mosaic |
A raster object representing the mosaic for which the EPSG code is to be determined. |
The function calculates the centroid of the mosaic's extent, determines the UTM zone based on the centroid's longitude, and identifies the hemisphere based on the centroid's latitude. The EPSG code is then constructed accordingly.
A character string representing the EPSG code corresponding to the UTM zone and hemisphere of the mosaic's centroid. If the mosaic is not in the lon/lat coordinate system, a warning is issued.
if (interactive()) { library(pliman) library(terra) # Create a sample mosaic mosaic <- rast(nrow=10, ncol=10, xmin=-120, xmax=-60, ymin=30, ymax=60) # Get the EPSG code for the mosaic mosaic_epsg(mosaic) }if (interactive()) { library(pliman) library(terra) # Create a sample mosaic mosaic <- rast(nrow=10, ncol=10, xmin=-120, xmax=-60, ymin=30, ymax=60) # Get the EPSG code for the mosaic mosaic_epsg(mosaic) }
mosaic_extract() (and its alias extract_cpp()) extracts pixel values or summary statistics from a
terra::SpatRaster object using an sf or SpatVector shapefile as spatial reference.
It runs on a highly optimized C++ engine with OpenMP multi-threading and exact coverage calculations,
completely independent of external GDAL libraries or exactextractr.
For rasters on disk, it dynamically monitors available system RAM via native C++ API (get_free_ram()) and automatically selects between
full in-memory processing and memory-safe spatial block processing (when raster size exceeds 80% of available RAM).
mosaic_extract( mosaic, shapefile, fun = NULL, return = "df", exact = FALSE, coverage_area = FALSE, subdiv = 5L, summarize_quantiles = c(0.05, 0.975), verbose = FALSE, max_cells_in_memory = NULL, ... ) extract_cpp( mosaic, shapefile, fun = NULL, return = "df", exact = FALSE, coverage_area = FALSE, subdiv = 5L, summarize_quantiles = c(0.05, 0.975), verbose = FALSE, max_cells_in_memory = NULL, ... )mosaic_extract( mosaic, shapefile, fun = NULL, return = "df", exact = FALSE, coverage_area = FALSE, subdiv = 5L, summarize_quantiles = c(0.05, 0.975), verbose = FALSE, max_cells_in_memory = NULL, ... ) extract_cpp( mosaic, shapefile, fun = NULL, return = "df", exact = FALSE, coverage_area = FALSE, subdiv = 5L, summarize_quantiles = c(0.05, 0.975), verbose = FALSE, max_cells_in_memory = NULL, ... )
mosaic |
A |
shapefile |
An |
fun |
Optional summary function(s) to compute for each polygon: |
return |
Character string specifying the return object type when statistics are computed:
|
exact |
Logical. If |
coverage_area |
Logical. Include polygon coverage area metrics ( |
subdiv |
Integer subdivision grid size per dimension when |
summarize_quantiles |
Numeric vector of quantile probabilities (values between 0 and 1) to compute when |
verbose |
Logical. Displays progress steps and status messages? Defaults to |
max_cells_in_memory |
Optional override for maximum cell count. Defaults to |
... |
Additional arguments. |
If fun = NULL, a list of data.frames (one for each polygon) containing columns cell, row, col, and raster layer values (plus coverage_area if coverage_area = TRUE).
If fun is specified and return = "shapefile", returns the original shapefile (sf or SpatVector) with the extracted summary columns attached (including covered_area, plot_area, coverage if coverage_area = TRUE).
If fun is specified and return = "df" (default), returns a data.frame of summary statistics (including covered_area, plot_area, coverage if coverage_area = TRUE).
## Not run: library(pliman) shp <- shapefile_input( paste0(image_pliman(), "/soy_shape.rds")) mosaic <- mosaic_input( paste0(image_pliman(), "/soy_ortho.tif")) # Extract summary statistics attached to shapefile mosaic_extract(mosaic, shp, fun = "mean", return = "shapefile") # Extract mean and quantiles with plot area coverage metrics mosaic_extract(mosaic, shp, fun = c("mean", "quantiles"), coverage_area = TRUE) ## End(Not run)## Not run: library(pliman) shp <- shapefile_input( paste0(image_pliman(), "/soy_shape.rds")) mosaic <- mosaic_input( paste0(image_pliman(), "/soy_ortho.tif")) # Extract summary statistics attached to shapefile mosaic_extract(mosaic, shp, fun = "mean", return = "shapefile") # Extract mean and quantiles with plot area coverage metrics mosaic_extract(mosaic, shp, fun = c("mean", "quantiles"), coverage_area = TRUE) ## End(Not run)
Create a histogram of the values of a SpatRaster.
mosaic_hist(mosaic, layer, ...)mosaic_hist(mosaic, layer, ...)
mosaic |
SpatRaster |
layer |
positive integer or character to indicate layer numbers (or names). If missing, all layers are used |
... |
Further arguments passed on to |
A NULL object
if (interactive()) { library(pliman) r <- mosaic_input(system.file("ex/elev.tif", package="terra")) mosaic_hist(r) }if (interactive()) { library(pliman) r <- mosaic_input(system.file("ex/elev.tif", package="terra")) mosaic_hist(r) }
Compute or extract an index layer from a multi-band mosaic raster.
mosaic_index( mosaic, index = "NGRDI", r = 3, g = 2, b = 1, re = NA, nir = NA, swir = NA, tir = NA, plot = TRUE, in_memory = TRUE, output = c("memory", "disk"), workers = 1, verbose = TRUE )mosaic_index( mosaic, index = "NGRDI", r = 3, g = 2, b = 1, re = NA, nir = NA, swir = NA, tir = NA, plot = TRUE, in_memory = TRUE, output = c("memory", "disk"), workers = 1, verbose = TRUE )
mosaic |
A mosaic of class |
index |
A character value (or a vector of characters) specifying the
target mode for conversion to a binary image. Use |
r, g, b, re, nir, swir, tir
|
The red, green, blue, red-edge, near-infrared, shortwave Infrared, and thermal infrared bands of the image, respectively. By default, the function assumes a BGR as input (b = 1, g = 2, r = 3). If a multispectral image is provided up to seven bands can be used to compute built-in indexes. There are no limitation of band numbers if the index is computed using the band name. |
plot |
Plot the computed index? Defaults to |
in_memory |
Logical, indicating whether the indexes should be computed
in memory. Defaults to |
output |
Character(1), either |
workers |
numeric. The number of workers you want to use for parallel processing when computing multiple indexes. |
verbose |
Whether to display progress messages. |
This function computes or extracts an index layer from the input
mosaic raster based on the specified index name. If the index is not found
in the package's predefined index list (see image_index() for more
details), it attempts to compute the index using the specified band
indices. The resulting index layer is returned as an SpatRaster object.
An index layer extracted/computed from the mosaic raster.
if (interactive()) { library(pliman) mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) names(mosaic) elev2 <- mosaic_index(mosaic, "elevation * 5", plot = FALSE) oldpar <- par(no.readonly=TRUE) par(mfrow=c(1,2)) mosaic_plot(mosaic) mosaic_plot(elev2) # return the original parameters par(oldpar) }if (interactive()) { library(pliman) mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) names(mosaic) elev2 <- mosaic_index(mosaic, "elevation * 5", plot = FALSE) oldpar <- par(no.readonly=TRUE) par(mfrow=c(1,2)) mosaic_plot(mosaic) mosaic_plot(elev2) # return the original parameters par(oldpar) }
Compute or extract an index layer from a multi-band mosaic raster using gdal_calc.py (https://gdal.org/programs/gdal_calc.html). This requires a Python and GDAL installation.
mosaic_index2( mosaic, index = "B", r = 3, g = 2, b = 1, re = 4, nir = 5, plot = TRUE, python = Sys.which("python.exe"), gdal = Sys.which("gdal_calc.py") )mosaic_index2( mosaic, index = "B", r = 3, g = 2, b = 1, re = 4, nir = 5, plot = TRUE, python = Sys.which("python.exe"), gdal = Sys.which("gdal_calc.py") )
mosaic |
A mosaic of class |
index |
A character value (or a vector of characters) specifying the
target mode for conversion to a binary image. Use |
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands of the image, respectively. By default, the function assumes a BGR as input (b = 1, g = 2, r = 3). If a multispectral image is provided up to seven bands can be used to compute built-in indexes. There are no limitation of band numbers if the index is computed using the band name. |
plot |
Plot the computed index? Defaults to |
python |
The PATH for python.exe |
gdal |
The PATH for gdal_calc.py |
An index layer extracted/computed from the mosaic raster.
if(interactive() & (Sys.which('python.exe') != '' ) & (Sys.which('gdal_calc.py') != '' )){ library(pliman) mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) names(mosaic) <- "R" elev2 <- mosaic_index2(mosaic, "R * 5", plot = FALSE) oldpar <- par(no.readonly=TRUE) mosaic_plot(mosaic) mosaic_plot(elev2) par(mfrow=c(1,2)) }if(interactive() & (Sys.which('python.exe') != '' ) & (Sys.which('gdal_calc.py') != '' )){ library(pliman) mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) names(mosaic) <- "R" elev2 <- mosaic_index2(mosaic, "R * 5", plot = FALSE) oldpar <- par(no.readonly=TRUE) mosaic_plot(mosaic) mosaic_plot(elev2) par(mfrow=c(1,2)) }
Create and Export mosaics
mosaic_input( mosaic, mosaic_pattern = NULL, info = TRUE, check_16bits = FALSE, check_datatype = FALSE, ... ) mosaic_export(mosaic, filename, datatype = NULL, overwrite = FALSE, ...)mosaic_input( mosaic, mosaic_pattern = NULL, info = TRUE, check_16bits = FALSE, check_datatype = FALSE, ... ) mosaic_export(mosaic, filename, datatype = NULL, overwrite = FALSE, ...)
mosaic |
|
mosaic_pattern |
A pattern name to import multiple mosaics into a list. |
info |
Print the mosaic informations (eg., CRS, extent). Defaults to |
check_16bits |
Checks if mosaic has maximum value in the 16-bits format
(65535), and replaces it by NA. Defaults to |
check_datatype |
Logical. If |
... |
Additional arguments passed to |
filename |
character. The Output filename. |
datatype |
The datatype. By default, the function will try to guess the
data type that saves more memory usage and file size. See
|
overwrite |
logical. If |
mosaic_input() is a simply wrapper around terra::rast(). It creates a
SpatRaster object from scratch, from a filename, or from another object.
mosaic_export() is a simply wrapper around terra::writeRaster(). It write
a SpatRaster object to a file.
mosaic_input() returns an SpatRaster object.
mosaic_export() do not return an object.
if (interactive()) { library(pliman) # create an SpatRaster object based on a matrix x <- system.file("ex/logo.tif", package="terra") rast <- mosaic_input(x) mosaic_plot(rast) # create a temporary filename for the example f <- file.path(tempdir(), "test.tif") mosaic_export(rast, f, overwrite=TRUE) list.files(tempdir()) }if (interactive()) { library(pliman) # create an SpatRaster object based on a matrix x <- system.file("ex/logo.tif", package="terra") rast <- mosaic_input(x) mosaic_plot(rast) # create a temporary filename for the example f <- file.path(tempdir(), "test.tif") mosaic_export(rast, f, overwrite=TRUE) list.files(tempdir()) }
Performs the interpolation of points from a raster object.
mosaic_interpolate(mosaic, points, method = c("bilinear", "loess", "idw"))mosaic_interpolate(mosaic, points, method = c("bilinear", "loess", "idw"))
mosaic |
An |
points |
An |
method |
One of "bilinear" (default), "loess" (local regression) or "idw" (Inverse Distance Weighting). |
An SpatRaster object with the same extent and crs from mosaic
This function projects a given mosaic from the lon/lat coordinate system to an EPSG-based CRS determined by the mosaic's extent.
mosaic_lonlat2epsg(mosaic)mosaic_lonlat2epsg(mosaic)
mosaic |
A raster object representing the mosaic to be projected. The mosaic must be in the lon/lat coordinate system. |
A raster object representing the projected mosaic. If the mosaic is not in the lon/lat coordinate system, a warning is issued.
if (interactive()) { library(terra) library(pliman) # Create a sample mosaic mosaic <- rast(nrow=10, ncol=10, xmin=-120, xmax=-60, ymin=30, ymax=60) # Project the mosaic to the appropriate UTM zone mosaic_lonlat2epsg(mosaic) }if (interactive()) { library(terra) library(pliman) # Create a sample mosaic mosaic <- rast(nrow=10, ncol=10, xmin=-120, xmax=-60, ymin=30, ymax=60) # Project the mosaic to the appropriate UTM zone mosaic_lonlat2epsg(mosaic) }
Plot the values of a SpatRaster
mosaic_plot( mosaic, col = custom_palette(c("red", "yellow", "forestgreen"), n = 200), smooth = TRUE, ... )mosaic_plot( mosaic, col = custom_palette(c("red", "yellow", "forestgreen"), n = 200), smooth = TRUE, ... )
mosaic |
SpatRaster |
col |
character vector to specify the colors to use. Defaults to
|
smooth |
logical. If TRUE (default) the cell values are smoothed (only if a continuous legend is used). |
... |
Further arguments passed on to |
A NULL object
if (interactive()) { library(pliman) r <- mosaic_input(system.file("ex/elev.tif", package="terra")) mosaic_plot(r) }if (interactive()) { library(pliman) r <- mosaic_input(system.file("ex/elev.tif", package="terra")) mosaic_plot(r) }
Plot the RGB of a SpatRaster
mosaic_plot_rgb(mosaic, ...)mosaic_plot_rgb(mosaic, ...)
mosaic |
SpatRaster |
... |
Further arguments passed on to |
A NULL object
Prepare an SpatRaster object to be analyzed in pliman. This includes
cropping the original mosaic, aligning it, and cropping the aligned object.
The resulting object is an object of class image that can be further
analyzed.
mosaic_prepare( mosaic, r = 3, g = 2, b = 1, re = 4, nir = 5, crop_mosaic = TRUE, align = TRUE, crop_aligned = TRUE, rescale = TRUE, coef = 0, viewer = "mapview", max_pixels = 5e+05, show = "rgb", index = "R" )mosaic_prepare( mosaic, r = 3, g = 2, b = 1, re = 4, nir = 5, crop_mosaic = TRUE, align = TRUE, crop_aligned = TRUE, rescale = TRUE, coef = 0, viewer = "mapview", max_pixels = 5e+05, show = "rgb", index = "R" )
mosaic |
A mosaic of class |
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands of the image, respectively. By default, the function assumes a BGR as input (b = 1, g = 2, r = 3). If a multispectral image is provided up to seven bands can be used to compute built-in indexes. There are no limitation of band numbers if the index is computed using the band name. |
crop_mosaic |
Logical, whether to crop the mosaic interactively before aligning it (default: FALSE). |
align |
Logical, whether to align the mosaic interactively (default: TRUE). |
crop_aligned |
Logical, whether to crop the aligned mosaic interactively (default: TRUE). |
rescale |
Rescale the final values? If |
coef |
An addition coefficient applied to the resulting object. This is useful to adjust the brightness of the final image. Defaults to 0. |
viewer |
The viewer option. If not provided, the value is retrieved
using |
max_pixels |
Maximum number of pixels to render in the map or plot (default: 500000). |
show |
The display option for the map view. Options are "rgb" for RGB view and "index" for index view. |
index |
The index to use for the index view. Defaults to "B". |
A prepared object of class image.
if (interactive()) { library(pliman) mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) mosaic_prepare(mosaic) }if (interactive()) { library(pliman) mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) mosaic_prepare(mosaic) }
This function projects a given mosaic to a specified CRS.
mosaic_project(mosaic, y, ...)mosaic_project(mosaic, y, ...)
mosaic |
A raster object representing the mosaic to be projected. |
y |
The target CRS to which the mosaic should be projected. This can be
specified in various formats accepted by the |
... |
Additional arguments passed to the |
A raster object representing the projected mosaic.
if (interactive()) { library(terra) library(pliman) # Create a sample mosaic mosaic <- rast(nrow=10, ncol=10, xmin=-120, xmax=-60, ymin=30, ymax=60) mosaic # Define target CRS (EPSG code for WGS 84 / UTM zone 33N) target_crs <- "EPSG:32633" # Project the mosaic projected_mosaic <- mosaic_project(mosaic, "EPSG:32633") projected_mosaic }if (interactive()) { library(terra) library(pliman) # Create a sample mosaic mosaic <- rast(nrow=10, ncol=10, xmin=-120, xmax=-60, ymin=30, ymax=60) mosaic # Define target CRS (EPSG code for WGS 84 / UTM zone 33N) target_crs <- "EPSG:32633" # Project the mosaic projected_mosaic <- mosaic_project(mosaic, "EPSG:32633") projected_mosaic }
Transfers values between SpatRaster objects that do not align (have a
different origin and/or resolution). See terra::resample() for more details
mosaic_resample(mosaic, y, ...)mosaic_resample(mosaic, y, ...)
mosaic |
SpatRaster to be resampled |
y |
SpatRaster with the geometry that x should be resampled to |
... |
Further arguments passed on to |
SpatRaster
if (interactive()) { library(pliman) library(terra) r <- rast(nrows=3, ncols=3, xmin=0, xmax=10, ymin=0, ymax=10) values(r) <- 1:ncell(r) s <- rast(nrows=25, ncols=30, xmin=1, xmax=11, ymin=-1, ymax=11) x <- mosaic_resample(r, s, method="bilinear") opar <- par(no.readonly =TRUE) par(mfrow=c(1,2)) plot(r) plot(x) par(opar) }if (interactive()) { library(pliman) library(terra) r <- rast(nrows=3, ncols=3, xmin=0, xmax=10, ymin=0, ymax=10) values(r) <- 1:ncell(r) s <- rast(nrows=25, ncols=30, xmin=1, xmax=11, ymin=-1, ymax=11) x <- mosaic_resample(r, s, method="bilinear") opar <- par(no.readonly =TRUE) par(mfrow=c(1,2)) plot(r) plot(x) par(opar) }
This function rotates a mosaic image by 90, 180, or 270 degrees.
mosaic_rotate(mosaic, angle, direction = "clockwise")mosaic_rotate(mosaic, angle, direction = "clockwise")
mosaic |
A |
angle |
An integer specifying the rotation angle. Must be one of 90, 180, or 270. |
direction |
A string specifying the rotation direction. Must be either "clockwise" or "anticlockwise". |
A SpatRaster object with the rotated mosaic image.
if (interactive()) { library(pliman) # Convert a mosaic raster to an Image object mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) r90 <- mosaic_rotate(mosaic, 90) r180 <- mosaic_rotate(mosaic, 180) r270 <- mosaic_rotate(mosaic, 270) # Plot all rotations side by side par(mfrow = c(2, 2)) mosaic_plot(mosaic, main = "Original") mosaic_plot(r90, main = "90 Degrees") mosaic_plot(r180, main = "180 Degrees") mosaic_plot(r270, main = "270 Degrees") par(mfrow = c(1, 1)) }if (interactive()) { library(pliman) # Convert a mosaic raster to an Image object mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) r90 <- mosaic_rotate(mosaic, 90) r180 <- mosaic_rotate(mosaic, 180) r270 <- mosaic_rotate(mosaic, 270) # Plot all rotations side by side par(mfrow = c(2, 2)) mosaic_plot(mosaic, main = "Original") mosaic_plot(r90, main = "90 Degrees") mosaic_plot(r180, main = "180 Degrees") mosaic_plot(r270, main = "270 Degrees") par(mfrow = c(1, 1)) }
Segment a SpatRaster using a computed image index. By default, values
greater than threshold are kept in the mask.
mosaic_segment( mosaic, index = "R", r = 3, g = 2, b = 1, re = NA, nir = NA, swir = NA, tir = NA, threshold = "Otsu", invert = FALSE, return = c("mosaic", "mask") )mosaic_segment( mosaic, index = "R", r = 3, g = 2, b = 1, re = NA, nir = NA, swir = NA, tir = NA, threshold = "Otsu", invert = FALSE, return = c("mosaic", "mask") )
mosaic |
A mosaic of class |
index |
A character value (or a vector of characters) specifying the
target mode for conversion to a binary image. Use |
r, g, b, re, nir, swir, tir
|
The red, green, blue, red-edge, near-infrared, shortwave Infrared, and thermal infrared bands of the image, respectively. By default, the function assumes a BGR as input (b = 1, g = 2, r = 3). If a multispectral image is provided up to seven bands can be used to compute built-in indexes. There are no limitation of band numbers if the index is computed using the band name. |
threshold |
By default (threshold = "Otsu"), a threshold value based on Otsu's method is used to reduce the grayscale image to a binary image. If a numeric value is provided, this value will be used as a threshold. |
invert |
Logical, indicating whether to invert the mask. Defaults to
|
return |
The output of the function. Either 'mosaic' (the segmented mosaic), or 'mask' (the binary mask). |
The segmented mosaic (SpatRaster object)
if (interactive()) { library(pliman) mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) seg <- mosaic_segment(mosaic, index = "elevation", threshold = 350) mosaic_plot(seg) }if (interactive()) { library(pliman) mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) seg <- mosaic_segment(mosaic, index = "elevation", threshold = 350) mosaic_plot(seg) }
The function segments a mosaic using an interative process where the user picks samples from background (eg., soil) and foreground (eg., plants).
mosaic_segment_pick( mosaic, basemap = NULL, g = 2, r = 3, b = 1, max_pixels = 2e+06, downsample = NULL, quantiles = c(0, 1), return = c("mosaic", "mask") )mosaic_segment_pick( mosaic, basemap = NULL, g = 2, r = 3, b = 1, max_pixels = 2e+06, downsample = NULL, quantiles = c(0, 1), return = c("mosaic", "mask") )
mosaic |
A mosaic of class |
basemap |
An optional |
r, g, b
|
The layer for the Red, Green and Blue band, respectively.
Defaults to |
max_pixels |
Maximum number of pixels to render in the map or plot (default: 500000). |
downsample |
Downsampling factor to reduce the number of pixels
(default: NULL). In this case, if the number of pixels in the image (width
x height) is greater than |
quantiles |
the upper and lower quantiles used for color stretching. |
return |
The output of the function. Either 'mosaic' (the segmented mosaic), or 'mask' (the binary mask). |
An SpatRaster object with the segmented mosaic (if return = 'mosaic') or a mask (if return = 'mask').
if (interactive()) { mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) seg <- mosaic_segment_pick(mosaic) mosaic_plot(seg) }if (interactive()) { mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) seg <- mosaic_segment_pick(mosaic) mosaic_plot(seg) }
Convert an SpatRaster object to a image object with optional scaling.
mosaic_to_pliman( mosaic, r = 3, g = 2, b = 1, re = 4, nir = 5, rescale = TRUE, coef = 0 )mosaic_to_pliman( mosaic, r = 3, g = 2, b = 1, re = 4, nir = 5, rescale = TRUE, coef = 0 )
mosaic |
A mosaic of class |
r, g, b, re, nir
|
The red, green, blue, red-edge, and near-infrared bands of the image, respectively. By default, the function assumes a BGR as input (b = 1, g = 2, r = 3). If a multispectral image is provided up to seven bands can be used to compute built-in indexes. There are no limitation of band numbers if the index is computed using the band name. |
rescale |
Rescale the final values? If |
coef |
An addition coefficient applied to the resulting object. This is useful to adjust the brightness of the final image. Defaults to 0. |
This function converts SpatRaster into an image object, which
can be used for image analysis in pliman. Note that if a large
SpatRaster is loaded, the resulting object may increase considerably the
memory usage.
An image object with the same number of layers as mosaic.
if (interactive()) { library(pliman) # Convert a mosaic raster to an Image object mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) pliman_image <- mosaic_to_pliman(mosaic) plot(pliman_image) }if (interactive()) { library(pliman) # Convert a mosaic raster to an Image object mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) pliman_image <- mosaic_to_pliman(mosaic) plot(pliman_image) }
Convert an SpatRaster to a three-band RGB image of class image.
mosaic_to_rgb(mosaic, r = 3, g = 2, b = 1, coef = 0, plot = TRUE)mosaic_to_rgb(mosaic, r = 3, g = 2, b = 1, coef = 0, plot = TRUE)
mosaic |
A mosaic of class |
r, g, b
|
The red, green, blue bands. |
coef |
An addition coefficient applied to the resulting object. This is useful to adjust the brightness of the final image. Defaults to 0. |
plot |
Logical, whether to display the resulting RGB image (default: TRUE). |
This function converts SpatRaster that contains the RGB bands into
a three-band RGB. It allows you to specify the
band indices for the red, green, and blue channels, as well as apply a
scaling coefficient to the final image. By default, the resulting RGB image
is displayed, but this behavior can be controlled using the plot
parameter.
An object of class image object.
if (interactive()) { library(pliman) # Convert a mosaic raster to an RGB image and display it mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) # Convert a mosaic raster to an RGB image without displaying it rgb_image <- mosaic_to_rgb(c(mosaic * 2, mosaic - 0.3, mosaic * 0.8)) plot(rgb_image) }if (interactive()) { library(pliman) # Convert a mosaic raster to an RGB image and display it mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) # Convert a mosaic raster to an RGB image without displaying it rgb_image <- mosaic_to_rgb(c(mosaic * 2, mosaic - 0.3, mosaic * 0.8)) plot(rgb_image) }
SpatRaster mask to an sf objectConverts a raster mask into a vectorized sf object, with various options
for morphological operations and filtering.
mosaic_vectorize( mask, aggregate = NULL, watershed = TRUE, tolerance = 1, extension = 1, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, fill_hull = FALSE, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, smooth = FALSE )mosaic_vectorize( mask, aggregate = NULL, watershed = TRUE, tolerance = 1, extension = 1, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, fill_hull = FALSE, lower_size = NULL, upper_size = NULL, topn_lower = NULL, topn_upper = NULL, smooth = FALSE )
mask |
An optional mask (SpatRaster) to mask the mosaic. |
aggregate |
The size as a fraction (percentage) of the input image size. Either a scalar (eg., 50), or a length-two numeric vector. In the last, different percentage reduction/expansion can be used for columns, and rows, respectively. |
watershed |
If |
tolerance |
The minimum height of the object in the units of image intensity between its highest point (seed) and the point where it contacts another object (checked for every contact pixel). If the height is smaller than the tolerance, the object will be combined with one of its neighbors, which is the highest. Values < 1.0 are interpreted as relative tolerance (percentage of the peak height). Values >= 1.0 are interpreted as absolute tolerance in pixels (linear Euclidean distance). |
extension |
Radius of the neighborhood in pixels for the detection of neighboring objects. A higher value smooths out small objects. |
opening, closing, filter, erode, dilate
|
Morphological operations (brush size), applied in hierarchical order. |
fill_hull |
Fill holes in the binary image? Defaults to |
lower_size, upper_size
|
Lower and upper size limits for object filtering. |
topn_lower, topn_upper
|
Select top |
smooth |
Smoothes the contours using a moving average filter. Default is
|
An sf object containing vectorized features from the raster mask,
with added area measurements.
if (interactive()) { library(pliman) mask <- image_pliman("mask.tif") shp <- mosaic_vectorize(mask, watershed = FALSE) mosaic_plot(mask) shapefile_plot(shp, add = TRUE, lwd = 3) }if (interactive()) { library(pliman) mask <- image_pliman("mask.tif") shp <- mosaic_vectorize(mask, watershed = FALSE) mosaic_plot(mask) shapefile_plot(shp, add = TRUE, lwd = 3) }
Mosaic View
mosaic_view( mosaic, r = 3, g = 2, b = 1, edit = FALSE, title = "", shapefile = NULL, attribute = NULL, viewer = c("mapview", "base"), show = c("rgb", "index"), index = "B", max_pixels = 1e+06, downsample = NULL, downsample_fun = "nearest", alpha = 1, quantiles = c(0, 1), color_regions = custom_palette(c("red", "yellow", "forestgreen")), axes = FALSE, ... )mosaic_view( mosaic, r = 3, g = 2, b = 1, edit = FALSE, title = "", shapefile = NULL, attribute = NULL, viewer = c("mapview", "base"), show = c("rgb", "index"), index = "B", max_pixels = 1e+06, downsample = NULL, downsample_fun = "nearest", alpha = 1, quantiles = c(0, 1), color_regions = custom_palette(c("red", "yellow", "forestgreen")), axes = FALSE, ... )
mosaic |
A mosaic of class |
r, g, b
|
The layer for the Red, Green and Blue band, respectively.
Defaults to |
edit |
If |
title |
A title for the generated map or plot (default: ""). |
shapefile |
An optional shapefile of class |
attribute |
The attribute name(s) or column number(s) in shapefile table of the column(s) to be rendered. |
viewer |
The viewer option. If not provided, the value is retrieved
using |
show |
The display option for the map view. Options are "rgb" for RGB view and "index" for index view. |
index |
The index to use for the index view. Defaults to "B". |
max_pixels |
Maximum number of pixels to render in the map or plot (default: 500000). |
downsample |
Downsampling factor to reduce the number of pixels
(default: NULL). In this case, if the number of pixels in the image (width
x height) is greater than |
downsample_fun |
The resampling function. Defaults to nearest. See further details in |
alpha |
opacity of the fill color of the raster layer(s). |
quantiles |
the upper and lower quantiles used for color stretching. |
color_regions |
The color palette for displaying index values. Default
is |
axes |
logical. Draw axes? Defaults to |
... |
Additional arguments passed on to |
The function can generate either an interactive map using the 'mapview'
package or a static plot using the 'base' package, depending on the viewer
and show parameters. If show = "index" is used, the function first computes
an image index that can be either an RGB-based index or a multispectral
index, if a multispectral mosaic is provided.
An sf object, the same object returned by mapedit::editMap().
if (interactive()) { library(pliman) # Load a raster showing the elevation of Luxembourg mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) # Generate an interactive map using 'mapview' mosaic_view(mosaic) # Generate a static plot using 'base' mosaic_view(mosaic, viewer = "base") }if (interactive()) { library(pliman) # Load a raster showing the elevation of Luxembourg mosaic <- mosaic_input(system.file("ex/elev.tif", package="terra")) # Generate an interactive map using 'mapview' mosaic_view(mosaic) # Generate a static plot using 'base' mosaic_view(mosaic, viewer = "base") }
This function calculates the bounding boxes for a given list of contours.
object_bbox(contours)object_bbox(contours)
contours |
A list of matrices, where each matrix contains two columns representing (x, y) coordinates of a contour. |
A list of bounding boxes, where each bounding box is represented as a
list with x_min, y_min, x_max, and y_max values.
if(interactive()){ contours <- list( matrix(c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200), ncol = 2, byrow = FALSE) ) bbox_list <- object_bbox(contours) print(bbox_list) }if(interactive()){ contours <- list( matrix(c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200), ncol = 2, byrow = FALSE) ) bbox_list <- object_bbox(contours) print(bbox_list) }
Applies the Sobel-Feldman Operator to detect edges. The operator is based on convolving the image with a small, separable, and integer-valued filter in the horizontal and vertical directions.
object_edge(img, sigma = 1, threshold = "Otsu", thinning = FALSE, plot = TRUE)object_edge(img, sigma = 1, threshold = "Otsu", thinning = FALSE, plot = TRUE)
img |
An image or a list of images of class |
sigma |
Gaussian kernel standard deviation used in the gaussian blur. |
threshold |
The theshold method to be used. If |
thinning |
Logical value indicating whether a thinning procedure should
be applied to the detected edges. See |
plot |
Logical value indicating whether a plot should be created |
A binary version of image.
Sobel, I., and G. Feldman. 1973. A 3×3 isotropic gradient operator for image processing. Pattern Classification and Scene Analysis: 271–272.
if (interactive()) { library(pliman) img <- image_pliman("sev_leaf_nb.jpg", plot = TRUE) object_edge(img) }if (interactive()) { library(pliman) img <- image_pliman("sev_leaf_nb.jpg", plot = TRUE) object_edge(img) }
Givin an image with multiple objects, object_export() will split the
objects into a list of objects using object_split() and then export them to
multiple images into the current working directory (or a subfolder). Batch
processing is performed by declaring a file name pattern that matches the
images within the working directory.
object_export( img, pattern = NULL, dir_original = NULL, dir_processed = NULL, format = ".jpg", squarize = FALSE, augment = FALSE, times = 12, index = "NB", lower_size = NULL, watershed = FALSE, invert = FALSE, fill_hull = FALSE, opening = 3, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, threshold = "Otsu", extension = NULL, tolerance = NULL, object_size = "medium", edge = 20, remove_bg = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE )object_export( img, pattern = NULL, dir_original = NULL, dir_processed = NULL, format = ".jpg", squarize = FALSE, augment = FALSE, times = 12, index = "NB", lower_size = NULL, watershed = FALSE, invert = FALSE, fill_hull = FALSE, opening = 3, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, threshold = "Otsu", extension = NULL, tolerance = NULL, object_size = "medium", edge = 20, remove_bg = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE )
img |
The image to be analyzed. |
pattern |
A pattern of file name used to identify images to be
processed. For example, if |
dir_original |
The directory containing the original images. Defaults to
|
dir_processed |
Optional character string indicating a subfolder within the current working directory to save the image(s). If the folder doesn't exist, it will be created. |
format |
The format of image to be exported. |
squarize |
Squarizes the image before the exportation? If |
augment |
A logical indicating if exported objects should be augmented using
|
times |
The number of times to rotate the image. |
index |
A character value specifying the index for conversion to binary image. |
lower_size |
Plant images often contain dirt and dust. To prevent dust from
affecting the image analysis, objects with lesser than 10% of the mean of all objects
are removed. Set |
watershed |
If |
invert |
Inverts the binary image if desired. |
fill_hull |
Fill holes in the binary image? Defaults to |
opening, closing, filter, erode, dilate
|
Morphological operations (brush size), applied in hierarchical order. |
threshold |
The threshold method ( |
extension |
Neighborhood radius for watershed segmentation. |
tolerance |
Minimum height for watershed segmentation. |
object_size |
The size of the object ( |
edge |
The number of pixels to be added in the edge of the segmented object. Defaults to 5. |
remove_bg |
If |
parallel |
If |
workers |
Number of parallel processes. |
verbose |
If |
A NULL object.
if (interactive()) { library(pliman) img <- image_pliman("potato_leaves.jpg") object_export(img, remove_bg = TRUE) }if (interactive()) { library(pliman) img <- image_pliman("potato_leaves.jpg") object_export(img, remove_bg = TRUE) }
Givin an image with multiple objects, object_export_shp() will split the
objects into a list of objects using object_split_shp() and then export
them to multiple images into the current working directory (or a subfolder).
Batch processing is performed by declaring a file name pattern that matches
the images within the working directory.
object_export_shp( img, pattern = NULL, dir_original = NULL, dir_processed = NULL, format = ".jpg", subfolder = NULL, squarize = FALSE, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, interactive = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE, viewer = pliman::get_pliman_viewer() )object_export_shp( img, pattern = NULL, dir_original = NULL, dir_processed = NULL, format = ".jpg", subfolder = NULL, squarize = FALSE, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, interactive = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE, viewer = pliman::get_pliman_viewer() )
img |
An object of class |
pattern |
A pattern of file name used to identify images to be
processed. For example, if |
dir_original |
The directory containing the original images. Defaults to
|
dir_processed |
Optional character string indicating a subfolder within the current working directory to save the image(s). If the folder doesn't exist, it will be created. |
format |
The format of image to be exported. |
subfolder |
Optional character string indicating a subfolder within the current working directory to save the image(s). If the folder doesn't exist, it will be created. |
squarize |
Squarizes the image before the exportation? If |
nrow |
The number of desired rows in the grid. Defaults to |
ncol |
The number of desired columns in the grid. Defaults to |
buffer_x, buffer_y
|
Buffering factor for the width and height, respectively, of each individual shape's side. A value between 0 and 0.5 where 0 means no buffering and 0.5 means complete buffering (default: 0). A value of 0.25 will buffer the shape by 25% on each side. |
interactive |
If |
parallel |
If |
workers |
Number of parallel processes. |
verbose |
If |
viewer |
The viewer option. If not provided, the value is retrieved
using |
A NULL object.
if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot = TRUE) object_export_shp(flax) }if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot = TRUE) object_export_shp(flax) }
Computes 13 Haralick texture features for segmented objects in an image based on a Gray-Level Co-occurrence Matrix (GLCM). The GLCM is computed using 4 directions (0, 45, 90, and 135 degrees) and is made symmetric before calculating the texture metrics.
object_haralick( mask, ref, haralick.nbins = 32, haralick.scales = 1, haralick.band = "GRAY" )object_haralick( mask, ref, haralick.nbins = 32, haralick.scales = 1, haralick.band = "GRAY" )
mask |
A mask (binary image or labeled matrix) identifying the objects. |
ref |
A grayscale or RGB reference image (matrix or Image object) containing the intensities. |
haralick.nbins |
The number of bins used to discretize intensity values before computing the GLCM (default is 32). |
haralick.scales |
A numeric vector of scales at which texture is measured (default is 1). |
haralick.band |
The band to use for computing texture features if |
The Haralick texture features are calculated from the normalized GLCM,
, where and
is the number of gray levels (haralick.nbins).
The features returned are:
asm (Angular Second Moment/Energy): Measures texture uniformity. High values indicate a highly uniform, homogeneous, and orderly texture (e.g., a flat color or a perfectly repeating pattern).
con (Contrast): Measures local variations in gray levels. High values indicate sharp local variations (e.g., sharp edges, coarse textures, or noise).
cor (Correlation): Measures linear gray-level dependencies. High values (close to 1) indicate structured, predictable patterns (e.g., linear stripes).
var (Sum of Squares/Variance): Measures dispersion of gray levels from the mean, suggesting a high variety of tones and shades within the object.
.
idm (Inverse Difference Moment/Homogeneity): Measures texture homogeneity. High values indicate a very homogeneous texture where adjacent pixels have very similar values.
sav (Sum Average): Measures overall brightness. High values suggest the texture is overall light/bright.
sva (Sum Variance): Measures the complexity and variance in overall brightness between neighboring pixel sums.
(calculated using Sum Entropy ).
sen (Sum Entropy): Measures disorder/randomness in the sum of neighboring pixel levels. Higher values mean more chaotic brightness sums.
ent (Entropy): Measures overall complexity and randomness. High values indicate highly detailed, unpredictable, and random patterns.
dva (Difference Variance): Matches Contrast (con), denoting variation in gray level differences (roughness).
den (Difference Entropy): Measures disorder/randomness of intensity differences between adjacent pixels.
f12 (Information Measure of Correlation 1): Quantifies the structural coupling and mutual information between neighboring pixels relative to their individual distributions (1).
f13 (Information Measure of Correlation 2): Quantifies the structural coupling and mutual information between neighboring pixels relative to their individual distributions (2).
(using base 10 values in the exponent).
Here, is the sum distribution:
and is the difference distribution:
A matrix containing the 13 Haralick texture features for each object.
library(pliman) img <- image_pliman("soy_green.jpg") wat <- image_binary(img, "B", opening = 5)[[1]] |> image_watershed() cont <- contour(wat) centroids <- poly_mass(cont) hara <- object_haralick(wat, img) plot(img) # Contrast text(centroids[, 1], centroids[,2], labels = round(hara[, "con.s1"], 4))library(pliman) img <- image_pliman("soy_green.jpg") wat <- image_binary(img, "B", opening = 5)[[1]] |> image_watershed() cont <- contour(wat) centroids <- poly_mass(cont) hara <- object_haralick(wat, img) plot(img) # Contrast text(centroids[, 1], centroids[,2], labels = round(hara[, "con.s1"], 4))
All pixels for each connected set of foreground (non-zero) pixels in x are
set to an unique increasing integer, starting from 1. Hence, max(x) gives the
number of connected objects in x.
object_label( img, index = "B", invert = FALSE, fill_hull = FALSE, threshold = "Otsu", k = 0.1, windowsize = NULL, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), watershed = FALSE, tolerance = NULL, extension = NULL, object_size = "medium", plot = TRUE, ncol = NULL, nrow = NULL, verbose = TRUE )object_label( img, index = "B", invert = FALSE, fill_hull = FALSE, threshold = "Otsu", k = 0.1, windowsize = NULL, opening = FALSE, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), watershed = FALSE, tolerance = NULL, extension = NULL, object_size = "medium", plot = TRUE, ncol = NULL, nrow = NULL, verbose = TRUE )
img |
An image object. |
index |
A character value (or a vector of characters) specifying the
target mode for conversion to binary image. See the available indexes with
|
invert |
Inverts the binary image, if desired. |
fill_hull |
Fill holes in the objects? Defaults to |
threshold |
The theshold method to be used.
|
k |
a numeric in the range 0-1. when |
windowsize |
windowsize controls the number of local neighborhood in
adaptive thresholding. By default it is set to |
erode, dilate, opening, closing, filter
|
Morphological operations (brush size)
Hierarchically, the operations are performed as opening > closing > filter. The value declared in each argument will define the brush size. |
filter_order |
A character vector indicating the order in which morphological
operations are applied. Defaults to |
watershed |
If |
tolerance |
Minimum height for watershed segmentation. |
extension |
Neighborhood radius for watershed segmentation. |
object_size |
The size of the object ( |
plot |
Show image after processing? |
nrow, ncol
|
The number of rows or columns in the plot grid. Defaults to
|
verbose |
If |
A list with the same length of img containing the labeled objects.
if (interactive()) { img <- image_pliman("soybean_touch.jpg") # segment the objects using the "B" (blue) band. object_label(img, index = "B") object_label(img, index = "B", watershed = TRUE) }if (interactive()) { img <- image_pliman("soybean_touch.jpg") # segment the objects using the "B" (blue) band. object_label(img, index = "B") object_label(img, index = "B", watershed = TRUE) }
Computes distances between objects in an anal_obj object and returns a list
of distances, coefficient of variation (CV), and means.
object_map(object, by_column = "img", direction = c("horizontal", "vertical"))object_map(object, by_column = "img", direction = c("horizontal", "vertical"))
object |
An |
by_column |
The column name in the object's results data frame to group objects by. Default is "img". |
direction |
The direction of mapping. Should be one of "horizontal" or "vertical". Default is "horizontal". |
A list with the following components:
distances |
A list of distances between objects grouped by unique values in the specified column/row. |
cvs |
A vector of coefficient of variation (CV) values for each column/row. |
means |
A vector of mean distances for each column/row. |
if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot =TRUE) res <- analyze_objects_shp(flax, nrow = 3, ncol = 1, watershed = FALSE, index = "R/(G/B)", plot = FALSE) plot(res$final_image_mask) plot(res$shapefiles) # distance from each leave within each row result <- object_map(res) result$distances result$cvs result$means }if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot =TRUE) res <- analyze_objects_shp(flax, nrow = 3, ncol = 1, watershed = FALSE, index = "R/(G/B)", plot = FALSE) plot(res$final_image_mask) plot(res$shapefiles) # distance from each leave within each row result <- object_map(res) result$distances result$cvs result$means }
Marks the coordinates of objects in an anal_obj object on a plot.
object_mark(object, col = "white")object_mark(object, col = "white")
object |
An |
col |
The color of the marked points. Default is "white". |
if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot =TRUE) res <- analyze_objects(flax, watershed = FALSE, index = "R/(G/B)", plot = FALSE) object_mark(res) }if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot =TRUE) res <- analyze_objects(flax, watershed = FALSE, index = "R/(G/B)", plot = FALSE) object_mark(res) }
Given an image and a matrix of labels that identify each object, the function extracts the red, green, and blue values from each object.
object_rgb(img, labels)object_rgb(img, labels)
img |
An |
labels |
A mask containing the labels for each object. This can be
obtained with |
A data.frame with n rows (number of pixels for all the objects) and
the following columns:
id: the object id;
R: the value for the red band;
G: the value for the blue band;
B: the value for the green band;
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") # segment the objects using the "B" (blue) band (default) labs <- object_label(img, watershed = TRUE) rgb <- object_rgb(img, labs[[1]]) head(rgb) }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") # segment the objects using the "B" (blue) band (default) labs <- object_label(img, watershed = TRUE) rgb <- object_rgb(img, labs[[1]]) head(rgb) }
Extracts connected objects from an image, computes their features, crops each
object, converts the crop to a raster with alpha, and draws each thumbnail
centered at its corresponding (x, y) feature location in a ggplot.
Optionally overlays object IDs. Caching can be used to avoid recomputing
object features on repeated calls.
object_scatter( img, x, y, scale = 0.1, xy_ratio = 1, xlab = x, ylab = y, erosion = 2, dilatation = FALSE, show_id = FALSE, color_id = "black", size_id = 3, cache = TRUE, verbose = TRUE, ... )object_scatter( img, x, y, scale = 0.1, xy_ratio = 1, xlab = x, ylab = y, erosion = 2, dilatation = FALSE, show_id = FALSE, color_id = "black", size_id = 3, cache = TRUE, verbose = TRUE, ... )
img |
An image of class |
x |
Character scalar. Name of the feature column (returned by
|
y |
Character scalar. Name of the feature column to use on the y-axis. |
scale |
Numeric in (0, 1]. Relative thumbnail size as a fraction of the data range along each axis (larger values draw larger thumbnails). |
xy_ratio |
Numeric scalar. Factor applied to the vertical scaling (y-axis) of thumbnails. Use values other than 1 to stretch or compress thumbnails vertically. |
xlab, ylab
|
Character scalars used as x- and y-axis labels. Defaults to
|
erosion, dilatation
|
Integer (non-negative). Size of the structuring element for morphological erosion/dilatation of the segmented objects. |
show_id |
Logical. If |
color_id |
Character. Color used for the ID labels when
|
size_id |
Numeric. Text size for the ID labels when
|
cache |
Logical. If |
verbose |
If |
... |
Additional arguments forwarded to |
A list with two elements:
features — a data frame (or tibble) with object-level features
returned by get_measures(res). Must contain columns named x and y.
plot — a ggplot object. The thumbnail scatter plot.
Thumbnails are sized relative to the observed ranges in x and y.
If the two axes differ substantially in range, perceived thumbnail aspect
on the plotting device may vary. Use xy_ratio to adjust vertical scaling.
if(interactive()){ img <- image_pliman("potato_leaves.jpg") plot(img) res <- object_scatter( img = img, index = "B", x = "area", y = "solidity", watershed = FALSE, scale = 0.5 ) res$plot # remove cached data clear_pliman_cache() }if(interactive()){ img <- image_pliman("potato_leaves.jpg") plot(img) res <- object_scatter( img = img, index = "B", x = "area", y = "solidity", watershed = FALSE, scale = 0.5 ) res$plot # remove cached data clear_pliman_cache() }
Using threshold-based segmentation, objects are first isolated from background. Then, a new image is created for each single object. A list of images is returned.
object_split( img, index = "NB", lower_size = NULL, watershed = TRUE, invert = FALSE, fill_hull = FALSE, opening = 3, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, threshold = "Otsu", extension = NULL, tolerance = NULL, object_size = "medium", edge = 3, remove_bg = FALSE, plot = TRUE, verbose = TRUE, ... )object_split( img, index = "NB", lower_size = NULL, watershed = TRUE, invert = FALSE, fill_hull = FALSE, opening = 3, closing = FALSE, filter = FALSE, erode = FALSE, dilate = FALSE, threshold = "Otsu", extension = NULL, tolerance = NULL, object_size = "medium", edge = 3, remove_bg = FALSE, plot = TRUE, verbose = TRUE, ... )
img |
The image to be analyzed. |
index |
A character value specifying the index for conversion to binary image. |
lower_size |
Plant images often contain dirt and dust. To prevent dust from
affecting the image analysis, objects with lesser than 10% of the mean of all objects
are removed. Set |
watershed |
If |
invert |
Inverts the binary image if desired. |
fill_hull |
Fill holes in the binary image? Defaults to |
opening, closing, filter, erode, dilate
|
Morphological operations (brush size), applied in hierarchical order. |
threshold |
The threshold method ( |
extension |
Neighborhood radius for watershed segmentation. |
tolerance |
Minimum height for watershed segmentation. |
object_size |
The size of the object ( |
edge |
The number of pixels to be added in the edge of the segmented object. Defaults to 5. |
remove_bg |
If |
plot |
Show image after processing? |
verbose |
If |
... |
Additional arguments passed on to |
A list of objects of class image.
analyze_objects(), image_binary()
if (interactive()) { library(pliman) img <- image_pliman("la_leaves.jpg", plot = TRUE) imgs <- object_split(img) # set to NULL to use 50% of the cores }if (interactive()) { library(pliman) img <- image_pliman("la_leaves.jpg", plot = TRUE) imgs <- object_split(img) # set to NULL to use 50% of the cores }
Here, image_shp() is used to create a shape file based on the desired
number of rows and columns. Then, using the object coordinates, a list of
image objects is created.
object_split_shp( img, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, interactive = FALSE, viewer = get_pliman_viewer(), only_shp = FALSE, ... )object_split_shp( img, nrow = 1, ncol = 1, buffer_x = 0, buffer_y = 0, interactive = FALSE, viewer = get_pliman_viewer(), only_shp = FALSE, ... )
img |
An object of class |
nrow |
The number of desired rows in the grid. Defaults to |
ncol |
The number of desired columns in the grid. Defaults to |
buffer_x, buffer_y
|
Buffering factor for the width and height, respectively, of each individual shape's side. A value between 0 and 0.5 where 0 means no buffering and 0.5 means complete buffering (default: 0). A value of 0.25 will buffer the shape by 25% on each side. |
interactive |
If |
viewer |
The viewer option. If not provided, the value is retrieved
using |
only_shp |
If |
... |
Other arguments passed on to |
A list of image objects
if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot = TRUE) objects <- object_split_shp(flax, nrow = 3, ncol = 5) image_combine(objects$imgs) }if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg", plot = TRUE) objects <- object_split_shp(flax, nrow = 3, ncol = 5) image_combine(objects$imgs) }
The function applies the color informed in the argument color to segmented
objects in the image. The segmentation is performed using image indexes. Use
image_index() to identify the better candidate index to segment objects.
object_to_color( img, pick_palettes = FALSE, background = NULL, foreground = NULL, index = "NB", color = "blue", plot = TRUE, ... )object_to_color( img, pick_palettes = FALSE, background = NULL, foreground = NULL, index = "NB", color = "blue", plot = TRUE, ... )
img |
An image object. |
pick_palettes |
Logical argument indicating wheater the user needs to
pick up the color palettes for foreground and background for the image. If
|
foreground, background
|
A color palette for the foregrond and background, respectively (optional). |
index |
A character value (or a vector of characters) specifying the
target mode for conversion to binary image. See the available indexes with
|
color |
The color to apply in the image objects. Defaults to |
plot |
Plots the modified image? Defaults to |
... |
Additional arguments passed on to |
An object of class image
if (interactive()) { library(pliman) img <- image_pliman("la_leaves.jpg") img2 <- object_to_color(img, index = "G-R") image_combine(img, img2) }if (interactive()) { library(pliman) img <- image_pliman("la_leaves.jpg") img2 <- object_to_color(img, index = "G-R") image_combine(img, img2) }
Detects leaf veins using Difference of Gaussians (DoG) bandpass filtering, dynamic resolution-independent boundary erosion, and per-object Otsu adaptive thresholding. Optionally applies Guo-Hall skeleton thinning.
object_veins( img, labels = NULL, index = "GRAY", watershed = TRUE, sigma1 = 0.75, sigma2 = sigma1 * 5, threshold = -1, channel = 0, erode_size = -1, rel_erode = 0.005, thinning = FALSE, overlay = TRUE, col = "red", plot = TRUE )object_veins( img, labels = NULL, index = "GRAY", watershed = TRUE, sigma1 = 0.75, sigma2 = sigma1 * 5, threshold = -1, channel = 0, erode_size = -1, rel_erode = 0.005, thinning = FALSE, overlay = TRUE, col = "red", plot = TRUE )
img |
An image or a list of images of class |
labels |
Optional matrix or |
index |
The image index used for object segmentation when |
watershed |
Logical argument indicating whether watershed segmentation should be performed
when |
sigma1 |
Fine Gaussian scale parameter for vein detection (default |
sigma2 |
Coarse Gaussian scale parameter for vein detection. Defaults to |
threshold |
Fixed vein threshold value in |
channel |
Channel to extract for vein detection: |
erode_size |
Fixed boundary erosion radius in pixels. If |
rel_erode |
Relative boundary erosion fraction of |
thinning |
Logical value indicating whether Guo-Hall skeleton thinning should
be applied to detected veins (default |
overlay |
Logical argument indicating whether detected veins should be overlaid
in color onto the original image (default |
col |
Color to use for overlaying detected veins (default |
plot |
Logical value indicating whether a plot should be created (default |
A list containing:
proportion: A numeric vector with vein proportions for each object ID.
vein_map: An image object representing the binary vein map (or thinned skeleton).
overlay: An image object showing the original image with veins highlighted in col (if overlay = TRUE).
if (interactive()) { library(pliman) img <- image_pliman("sev_leaf_nb.jpg", plot = TRUE) veins <- object_veins(img, overlay = TRUE, col = "red") veins$proportion }if (interactive()) { library(pliman) img <- image_pliman("sev_leaf_nb.jpg", plot = TRUE) veins <- object_veins(img, overlay = TRUE, col = "red") veins$proportion }
Downloads and configures the official Microsoft ONNX Runtime C++ shared library directly into pliman's local bin directory, requiring zero external packages and zero Python.
onnx_install(version = "1.20.1", force = FALSE, engine = c("gpu", "cpu")) pliman_install_onnx( version = "1.20.1", force = FALSE, engine = c("gpu", "cpu") )onnx_install(version = "1.20.1", force = FALSE, engine = c("gpu", "cpu")) pliman_install_onnx( version = "1.20.1", force = FALSE, engine = c("gpu", "cpu") )
version |
Character string with the ONNX Runtime release version (default |
force |
Logical. If |
engine |
Execution engine: |
A character string with the path to the installed shared library.
## Not run: onnx_install() onnx_install(engine = "gpu") ## End(Not run)## Not run: onnx_install() onnx_install(engine = "gpu") ## End(Not run)
onnx_quantize() compresses 32-bit floating point (FP32) ONNX neural network models
to 8-bit integer (INT8) precision. Dynamic quantization reduces model file sizes
by up to 75% (e.g. from 24 MB to 6 MB) and accelerates CPU inference throughput
by 2–3x with negligible accuracy trade-off.
onnx_quantize( model_path, output_path = NULL, weight_type = c("QUInt8", "QInt8"), verbose = TRUE )onnx_quantize( model_path, output_path = NULL, weight_type = c("QUInt8", "QInt8"), verbose = TRUE )
model_path |
Character string. File path to the input FP32 |
output_path |
Optional file path for the quantized INT8 model. If |
weight_type |
Precision type: |
verbose |
Logical. Display compression metrics and file sizes. Defaults to |
The normalized file path to the quantized .onnx model.
## Not run: library(pliman) # Quantize classification model q_model <- onnx_quantize("dataset_flores_yolo_cls.onnx") # Run inference with 3x speedup on CPU res <- image_classify_dl("rose.jpg", model = q_model) ## End(Not run)## Not run: library(pliman) # Quantize classification model q_model <- onnx_quantize("dataset_flores_yolo_cls.onnx") # Run inference with 3x speedup on CPU res <- image_classify_dl("rose.jpg", model = q_model) ## End(Not run)
image objectsGroup generic Ops method for image objects
## S3 method for class 'image' Ops(e1, e2)## S3 method for class 'image' Ops(e1, e2)
e1 |
Left operand. |
e2 |
Right operand. |
Sorts 4 quadrilateral corner vertices into standard Top-Left (TL), Top-Right (TR), Bottom-Right (BR), and Bottom-Left (BL) ordering.
order_quad_corners(pts)order_quad_corners(pts)
pts |
A 4x2 matrix, data frame with 2 columns, list with |
A named list with $TL, $TR, $BR, $BL coordinates (numeric pairs c(x, y)).
Given a numeric vector with the pixel's intensities, returns the threshold value based on Otsu's method, which minimizes the combined intra-class variance
otsu(values)otsu(values)
values |
A numeric vector with the pixel values. |
A double (threshold value).
Otsu, N. 1979. Threshold selection method from gray-level histograms. IEEE Trans Syst Man Cybern SMC-9(1): 62–66. doi: doi:10.1109/tsmc.1979.4310076
if (interactive()) { img <- image_pliman("soybean_touch.jpg") thresh <- otsu(image_data(img[,,3])) plot(img[,,3] < thresh) }if (interactive()) { img <- image_pliman("soybean_touch.jpg") thresh <- otsu(image_data(img[,,3])) plot(img[,,3] < thresh) }
image_palette() creates image palettes by applying the k-means algorithm
to the RGB values.
image_palette( img, pattern = NULL, npal = 5, proportional = TRUE, colorspace = c("rgb", "hsb"), remove_bg = FALSE, index = "B", filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), plot = TRUE, save_image = FALSE, prefix = "proc_", dir_original = NULL, dir_processed = NULL, return_pal = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE )image_palette( img, pattern = NULL, npal = 5, proportional = TRUE, colorspace = c("rgb", "hsb"), remove_bg = FALSE, index = "B", filter_order = c("erode", "dilate", "opening", "closing", "filter", "fill_hull"), plot = TRUE, save_image = FALSE, prefix = "proc_", dir_original = NULL, dir_processed = NULL, return_pal = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE )
img |
An image object. |
pattern |
A pattern of file name used to identify images to be imported. |
npal |
The number of color palettes. |
proportional |
Creates a joint palette with proportional size equal to
the number of pixels in the image? Defaults to |
colorspace |
The color space to produce the clusters. Defaults to |
remove_bg |
Remove background from the color palette? Defaults to
|
index |
An image index used to remove the background, passed to
|
filter_order |
Hierarchical order of morphological operations. |
plot |
Plot the generated palette? Defaults to |
save_image |
Save the image after processing? |
prefix |
Prefix for processed images. |
dir_original, dir_processed
|
Directories for original and processed images. |
return_pal |
Return the color palette image? Defaults to |
parallel |
If TRUE processes the images asynchronously (in parallel) in separate R sessions running in the background on the same machine. |
workers |
Number of parallel processes. |
verbose |
If |
image_palette() returns a list with two elements:
palette_list A list with npal color palettes of class image.
joint An object of class image with the color palettes
proportions The proportion of the entire image corresponding to each color in the palette
rgbs The average RGB value for each palette
if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") pal <- image_palette(img, npal = 5) }if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") pal <- image_palette(img, npal = 5) }
Pipe an object forward into a function or call expression.
lhs %>% rhslhs %>% rhs
lhs |
The result you are piping. |
rhs |
Where you are piping the result to. |
Nathan Eastwood [email protected] and Antoine Fabri [email protected]. The code was obtained from poorman package at https://github.com/nathaneastwood/poorman/blob/master/R/pipe.R
if (interactive()) { library(pliman) # Basic use: iris %>% head() # use to apply several functions to an image img <- image_pliman("la_leaves.jpg") img %>% image_resize(50) %>% # resize to 50% of the original size object_isolate(id = 1) %>% # isolate object 1 image_filter() %>% # apply a median filter plot() # plot }if (interactive()) { library(pliman) # Basic use: iris %>% head() # use to apply several functions to an image img <- image_pliman("la_leaves.jpg") img %>% image_resize(50) %>% # resize to 50% of the original size object_isolate(id = 1) %>% # isolate object 1 image_filter() %>% # apply a median filter plot() # plot }
This function finds the first row in the bin matrix that has a value greater than 0 (TRUE). It then calculates the minimum, median, and maximum values for the pixels in that row and creates an array containing the row index, the minimum pixel index, the median pixel index, and the maximum pixel index.
pixel_index(bin, row = NULL, direction = "updown")pixel_index(bin, row = NULL, direction = "updown")
bin |
A logical matrix representing a binary image |
row |
An optional row index. If not provided, the function selects the first non-zero row. |
direction |
The direction for row selection when row is not provided.
If set to |
A numeric vector containing the row index, the minimum pixel index, the median pixel index, and the maximum pixel index.
if (interactive()) { library(pliman) leaf <- image_pliman("sev_leaf.jpg") bin <- image_binary(leaf, "NB")[[1]] # first row with leaf (17) pixel_index(bin) # index at the row 100 pixel_index(bin, row = 100) plot(leaf) points(x = 248, y = 17, pch = 16, col = "red", cex = 2) points(x = 163, y = 100, pch = 16, col = "red", cex = 2) points(x = 333, y = 100, pch = 16, col = "red", cex = 2) }if (interactive()) { library(pliman) leaf <- image_pliman("sev_leaf.jpg") bin <- image_binary(leaf, "NB")[[1]] # first row with leaf (17) pixel_index(bin) # index at the row 100 pixel_index(bin, row = 100) plot(leaf) points(x = 248, y = 17, pch = 16, col = "red", cex = 2) points(x = 163, y = 100, pch = 16, col = "red", cex = 2) points(x = 333, y = 100, pch = 16, col = "red", cex = 2) }
Lists all supported background removal, object detection, segmentation, and classification models, their disk sizes, input resolutions, descriptions, local download status, and models dynamically discovered from GitHub release assets.
pliman_available_models(dir = pliman_model_dir(), refresh = FALSE)pliman_available_models(dir = pliman_model_dir(), refresh = FALSE)
dir |
Directory where models are stored (default: |
refresh |
Logical. If |
A data frame containing model metadata and local availability.
## Not run: pliman_available_models() pliman_available_models(refresh = TRUE) ## End(Not run)## Not run: pliman_available_models() pliman_available_models(refresh = TRUE) ## End(Not run)
Releases all in-memory compiled neural network sessions (e.g., Grounded-SAM, SAM 2.1, U2-Net) and frees allocated RAM.
pliman_clear_sessions()pliman_clear_sessions()
Invisible NULL.
Sets up the entire zero-Python, zero-external-package Deep Learning environment in a single call with interactive CLI feedback.
pliman_configure_dl( models = "u2netp", dir = pliman_model_dir(), force = FALSE, engine = c("gpu", "cpu") )pliman_configure_dl( models = "u2netp", dir = pliman_model_dir(), force = FALSE, engine = c("gpu", "cpu") )
models |
Character vector of models to pre-download. Defaults to |
dir |
Directory to store models (default: |
force |
Logical. Force re-download and re-configuration even if already present (default |
engine |
Execution engine: |
This function:
Creates and verifies the local model directory (tools::R_user_dir("pliman", "data")/models).
Downloads and verifies the official Microsoft ONNX Runtime C++ shared library directly.
Downloads the specified pre-trained models (u2netp and isnet-general-use by default).
Runs a self-test inference using the native C++ engine to confirm 100% operational status.
Logical TRUE invisibly on success.
## Not run: pliman_configure_dl() pliman_configure_dl(engine = "gpu") ## End(Not run)## Not run: pliman_configure_dl() pliman_configure_dl(engine = "gpu") ## End(Not run)
Downloads one or more pre-trained neural models into the user's model directory.
Supports downloading by model name, model asset name, dynamic GitHub release asset,
or directly from a custom URL (e.g. https://.../model.onnx).
pliman_download_model( model = "u2netp", dir = pliman_model_dir(), force = FALSE, refresh = FALSE )pliman_download_model( model = "u2netp", dir = pliman_model_dir(), force = FALSE, refresh = FALSE )
model |
Character vector naming the model(s) or direct URL(s) to download.
Can be a known model name (e.g. |
dir |
Directory to save the model files (default: |
force |
Logical. If |
refresh |
Logical. If |
A character vector with the absolute path(s) to the downloaded model file(s).
## Not run: # Download a single model pliman_download_model("u2netp") # Download directly from a custom URL pliman_download_model("https://example.com/custom_yolo.onnx") # Download all models at once pliman_download_model("all") ## End(Not run)## Not run: # Download a single model pliman_download_model("u2netp") # Download directly from a custom URL pliman_download_model("https://example.com/custom_yolo.onnx") # Download all models at once pliman_download_model("all") ## End(Not run)
Downloads and installs the official Microsoft ONNX Runtime C++ shared library directly from Microsoft's GitHub releases, with zero external package dependencies and zero Python.
pliman_download_onnx( version = "1.20.1", dir = pliman_onnx_dir(), force = FALSE, engine = c("gpu", "cpu") )pliman_download_onnx( version = "1.20.1", dir = pliman_onnx_dir(), force = FALSE, engine = c("gpu", "cpu") )
version |
Character string with the ONNX Runtime release version (default |
dir |
Directory to store the library (default: |
force |
Logical. If |
engine |
Execution engine: |
Automatically detects the host operating system (Windows, Linux, or macOS),
downloads the pre-compiled CPU binary (~15-60 MB), extracts the shared library
(onnxruntime.dll on Windows, libonnxruntime.so on Linux, libonnxruntime.dylib on macOS),
places it in pliman's binary directory, and configures the environment.
A character string with the path to the installed shared library.
## Not run: pliman_download_onnx() pliman_download_onnx(engine = "gpu") ## End(Not run)## Not run: pliman_download_onnx() pliman_download_onnx(engine = "gpu") ## End(Not run)
Queries the system's graphics hardware (via DirectX DXGI on Windows) to list available GPU adapters, dedicated video memory (VRAM), and DirectML status.
pliman_gpu_info()pliman_gpu_info()
A data frame containing information on detected GPU adapters, or a message if no GPU is available.
## Not run: pliman_gpu_info() ## End(Not run)## Not run: pliman_gpu_info() ## End(Not run)
Sample images installed with the pliman package
*.jpg format
colorcheck.jpg An image with RGB colorcheck, available at https://github.com/HarryCWright/PlantSizeClr
flax_leaves.jpg Flax leaves in a white background
flax_grains.jpg Flax grains with background light.
la_back.jpg A cyan palette representing the background of images
la_pattern, la_leaves, and soybean_touch.
la_leaf.jpg A sample of the leaves in la_leaves
la_leaves.jpg Tree leaves with a sample of known area.
mult_leaves.jpg Three soybean leaflets with soybean rust symptoms.
objects_300dpi.jpg An image with 300 dpi resolution.
potato_leaves.jpg Three potato leaves, which were gathered from Gupta et
al. (2020).
sev_leaf.jpg A soybean leaf with a blue background.
sev_leaf_nb.jpg A soybean leaf without background.
sev_back.jpg A blue palette representing the background of sev_leaf.
sev_healthy.jpg Healthy area of sev_leaf.
sev_sympt.jpg The symptomatic area sev_leaf.
shadow.jpg A shaded leaf, useful to test adaptive thresholding
soy_green.jpg Soybean grains with a white background.
soybean_grain.jpg A sample palette of the grains in soy_green.
soybean_touch.jpg Soybean grains with a cyan background touching one each
other.
field_mosaic.jpg An UVA image from a soybean field.
*.tif format
The following .tif files are provided as sample data, representing a slice
from a large orthomosaic with soybean plots in the vegetative stage. These
files were kindly provided by Arthur Bernardeli.
ortho.tif: An orthomosaic with soybean plots (5 rows and 3 columns).
dsm.tif: A digital surface model (DSM) for the soybean plots.
dtm.tif: A digital terrain model (DTM) for the area.
mask.tif: A mask that represents the soybean plants.
Tiago Olivoto [email protected]
Personal data, Gupta et al. (2020).
Gupta, S., Rosenthal, D. M., Stinchcombe, J. R., & Baucom, R. S. (2020). The remarkable morphological diversity of leaf shape in sweet potato (Ipomoea batatas): the influence of genetics, environment, and G×E. New Phytologist, 225(5), 2183–2195. doi:10.1111/NPH.16286
This function reads index equations from a CSV file included in the pliman
package, determines which bands are used in each index equation, and checks
which indexes can be computed based on the provided available bands.
pliman_indexes_ican_compute(available)pliman_indexes_ican_compute(available)
available |
A character vector of available bands (e.g., |
A data frame of indexes that can be computed with the available bands.
if (interactive()) { library(pliman) available_bands <- c("R", "G") computable_indexes <- pliman_indexes_ican_compute(available_bands) print(computable_indexes) }if (interactive()) { library(pliman) available_bands <- c("R", "G") computable_indexes <- pliman_indexes_ican_compute(available_bands) print(computable_indexes) }
Gets or sets the local directory where pre-trained ONNX models are stored.
Defaults to the standard R user data directory:
tools::R_user_dir("pliman", which = "data")/models.
pliman_model_dir(dir = NULL)pliman_model_dir(dir = NULL)
dir |
Optional character string specifying a custom directory path. If provided, creates the directory if it does not exist. |
A character string with the normalized absolute path to the model directory.
pliman_model_dir()pliman_model_dir()
Returns the base URL for downloading pre-trained ONNX models from GitHub Releases.
Can be customized globally via options(pliman.models_base_url = "...").
pliman_models_base_url()pliman_models_base_url()
Character URL string ending in a slash.
Gets or sets the local directory where the official Microsoft ONNX Runtime
C++ shared libraries (onnxruntime.dll, libonnxruntime.so, or libonnxruntime.dylib)
are saved.
pliman_onnx_dir(dir = NULL)pliman_onnx_dir(dir = NULL)
dir |
Optional custom directory path. |
A character string with the path to the bin directory.
pliman_onnx_dir()pliman_onnx_dir()
Finds the local path to the ONNX Runtime dynamic library (onnxruntime.dll on Windows,
libonnxruntime.so on Linux, libonnxruntime.dylib on macOS), or onnxruntime-directml.dll
when engine = "gpu" on Windows.
pliman_onnx_lib_path(engine = c("gpu", "cpu"))pliman_onnx_lib_path(engine = c("gpu", "cpu"))
engine |
Execution engine: |
Character path to the dynamic library or NULL if not found.
Users can set the value of this option using options("pliman_viewer", value).
The default value is "base". Use "mapview" to allow image to be
plotted/edited using the R packages mapview and mapedit
This function overlays bounding boxes onto an existing plot.
plot_bbox(bbox_list, col = "red")plot_bbox(bbox_list, col = "red")
bbox_list |
A list of bounding boxes, as returned by |
col |
The color for the bounding boxes. Defaults to |
None (adds bounding boxes to an existing plot).
if(interactive()){ plot(NA, xlim = c(0, 200), ylim = c(0, 200), asp = 1) contours <- list( matrix(c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200), ncol = 2, byrow = FALSE) ) bbox_list <- object_bbox(contours) plot_bbox(bbox_list) }if(interactive()){ plot(NA, xlim = c(0, 200), ylim = c(0, 200), asp = 1) contours <- list( matrix(c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200), ncol = 2, byrow = FALSE) ) bbox_list <- object_bbox(contours) plot_bbox(bbox_list) }
Based on a shapefile, number of columns and rows, generate plot IDs with different layouts.
plot_id( shapefile = NULL, nrow, ncol, layout = c("tblr", "tbrl", "btlr", "btrl", "lrtb", "lrbt", "rltb", "rlbt"), plot_prefix = "P", serpentine = FALSE )plot_id( shapefile = NULL, nrow, ncol, layout = c("tblr", "tbrl", "btlr", "btrl", "lrtb", "lrbt", "rltb", "rlbt"), plot_prefix = "P", serpentine = FALSE )
shapefile |
An object computed with |
nrow |
The number of columns |
ncol |
The number of rows |
layout |
Character: one of
|
plot_prefix |
The plot_id prefix. Defaults to |
serpentine |
Create a serpentine-based layout? Defaults to |
A list of plot IDs with specified layout and updated rows/columns.
Plot an image index
plot_index( img = NULL, object = NULL, index = NULL, remove_bg = TRUE, viewer = get_pliman_viewer(), all_layers = TRUE, layer = 1, max_pixels = 1e+06, downsample = NULL, downsample_fun = NULL, color_regions = custom_palette(n = 100), ncol = NULL, nrow = NULL, aspect_ratio = NA )plot_index( img = NULL, object = NULL, index = NULL, remove_bg = TRUE, viewer = get_pliman_viewer(), all_layers = TRUE, layer = 1, max_pixels = 1e+06, downsample = NULL, downsample_fun = NULL, color_regions = custom_palette(n = 100), ncol = NULL, nrow = NULL, aspect_ratio = NA )
img |
An optional |
object |
An object computed with |
index |
The index to plot. Defaults to the index computed from the
|
remove_bg |
Logical value indicating whether to remove the background
when |
viewer |
The viewer option. If not provided, the value is retrieved
using |
all_layers |
Render all layers when |
layer |
The layer to plot when |
max_pixels |
integer > 0. Maximum number of cells to plot the index. If
|
downsample |
integer; for each dimension the number of
pixels/lines/bands etc that will be skipped; Defaults to |
downsample_fun |
function; if given, downsampling will apply
|
color_regions |
The color palette for displaying index values. Default
is |
nrow, ncol
|
The number of rows or columns in the plot grid. Defaults to
|
aspect_ratio |
Numeric, giving the aspect ratio y/x. Defaults to |
None
if (interactive()) { # Example usage: library(pliman) img <- image_pliman("sev_leaf.jpg") plot_index(img, index = c("R", "G")) }if (interactive()) { # Example usage: library(pliman) img <- image_pliman("sev_leaf.jpg") plot_index(img, index = c("R", "G")) }
This function plots rectangles on top of an RGB image, where each rectangle
is colored based on a quantitative variable. The quantitative variable is
specified in the attribute argument and should be present in the
object_index of the object computed using analyze_objects_shp(). The
rectangles are colored using a color scale.
plot_index_shp( object, attribute = "coverage", r = 1, g = 2, b = 3, color = c("red", "yellow", "darkgreen"), viewer = c("mapview", "base"), max_pixels = 5e+05, downsample = NULL, downsample_fun = NULL, alpha = 0.7, legend.position = "bottom", na.color = "gray", classes = 6, round = 3, horiz = TRUE )plot_index_shp( object, attribute = "coverage", r = 1, g = 2, b = 3, color = c("red", "yellow", "darkgreen"), viewer = c("mapview", "base"), max_pixels = 5e+05, downsample = NULL, downsample_fun = NULL, alpha = 0.7, legend.position = "bottom", na.color = "gray", classes = 6, round = 3, horiz = TRUE )
object |
An object computed with |
attribute |
The name of the quantitative variable in the
|
r, g, b
|
The layer for the Red, Green and Blue band, respectively.
Defaults to |
color |
A vector of two colors to be used for the color scale. |
viewer |
The viewer option. If not provided, the value is retrieved
using |
max_pixels |
integer > 0. Maximum number of cells to plot the index. If
|
downsample |
integer; for each dimension the number of
pixels/lines/bands etc that will be skipped; Defaults to |
downsample_fun |
function; if given, downsampling will apply
|
alpha |
The transparency level of the rectangles' color (between 0 and 1). |
legend.position |
The position of the color legend, either
|
na.color |
The color to be used for rectangles with missing values in the quantitative variable. |
classes |
The number of classes in the color scale. |
round |
The number of decimal places to round the legend values. |
horiz |
Logical, whether the legend should be horizontal ( |
The function plots rectangles colored by the specified quantitative variable on top of the RGB image and shows the continuous color legend outside the plot.
if (interactive()) { library(pliman) # Computes the DGCI index for each flax leaf flax <- image_pliman("flax_leaves.jpg", plot =TRUE) res <- analyze_objects_shp(flax, buffer_x = 0.1, buffer_y = 0.02, nrow = 3, ncol = 5, plot = FALSE, object_index = "DGCI") plot_index_shp(res, attribute = "DGCI") }if (interactive()) { library(pliman) # Computes the DGCI index for each flax leaf flax <- image_pliman("flax_leaves.jpg", plot =TRUE) res <- analyze_objects_shp(flax, buffer_x = 0.1, buffer_y = 0.02, nrow = 3, ncol = 5, plot = FALSE, object_index = "DGCI") plot_index_shp(res, attribute = "DGCI") }
Plots the detected line segments from the output of image_line_segment().
Each segment is drawn as a red line on the existing plot.
plot_line_segment(x, col = "red", lwd = 1)plot_line_segment(x, col = "red", lwd = 1)
x |
A list returned by |
col |
The color of lines |
lwd |
The width of lines. Defaults to 1 |
No return value. The function adds line segments to an existing plot.
library(pliman)library(pliman)
This function plots the length and width lines given an object computed
with analyze_objects(). The function does not call plot.new, so it must
be called after an image is plotted. This can be done either using, e.g.,
plot(img), or analyze_objects(..., plot = TRUE).
plot_lw( object, col_length = "red", col_width = "green", lwd_length = 2, lwd_width = 2 )plot_lw( object, col_length = "red", col_width = "green", lwd_length = 2, lwd_width = 2 )
object |
An object computed with |
col_length |
The color of the length line. Default is |
col_width |
The color of the width line. Default is |
lwd_length |
The line width of the length line. Default is 2. |
lwd_width |
The line width of the width line. Default is 2. |
This function takes an object computed with analyze_objects() and
plots the length and width lines of each object onto an image. The length
and width lines are calculated based on the position and orientation of the
object, and are plotted using the specified colors and line widths.
if (interactive()) { img <- image_pliman("flax_leaves.jpg") res <- analyze_objects(img, watershed = FALSE, show_contour = FALSE) plot_lw(res) }if (interactive()) { img <- image_pliman("flax_leaves.jpg") res <- analyze_objects(img, watershed = FALSE, show_contour = FALSE) plot_lw(res) }
Visualizes the 2D continuous activation heatmap or prototype feature energy extracted during YOLO inference, either standalone or overlaid with alpha transparency onto the original image.
plot_yolo_heatmap( img, heatmap = NULL, col_palette = "inferno", alpha = 0.55, overlay = TRUE, title = NULL, plot = TRUE, ... )plot_yolo_heatmap( img, heatmap = NULL, col_palette = "inferno", alpha = 0.55, overlay = TRUE, title = NULL, plot = TRUE, ... )
img |
An |
heatmap |
An |
col_palette |
Color palette name ( |
alpha |
Numeric transparency of the heatmap overlay on the original image (0 = only original image,
1 = only heatmap). Default is |
overlay |
Logical. If |
title |
Optional title for the plot. |
plot |
Logical. Whether to display the plot immediately. Default is |
... |
Additional arguments passed to |
An Image object containing the colorized / blended heatmap visualization, invisibly.
## Not run: library(pliman) img <- image_import("tomatoes.jpg") res <- image_segment_dl(img, model = "yolo26n-seg", return_features = TRUE) plot_yolo_heatmap(res) ## End(Not run)## Not run: library(pliman) img <- image_import("tomatoes.jpg") res <- image_segment_dl(img, model = "yolo26n-seg", return_features = TRUE) plot_yolo_heatmap(res) ## End(Not run)
image objectsRender an image object using native base R graphics, with support for title,
custom bounding limits (xlim, ylim), and axes.
## S3 method for class 'image' plot( x, y = NULL, colormode = NULL, main = NULL, axes = FALSE, xlab = "", ylab = "", xlim = NULL, ylim = NULL, asp = 1, interpolate = TRUE, max_pixels = 2e+06, add = FALSE, ... )## S3 method for class 'image' plot( x, y = NULL, colormode = NULL, main = NULL, axes = FALSE, xlab = "", ylab = "", xlim = NULL, ylim = NULL, asp = 1, interpolate = TRUE, max_pixels = 2e+06, add = FALSE, ... )
x |
An |
y |
Unused. |
colormode |
Unused; reserved for compatibility. |
main |
Title for the plot. |
axes |
Logical; should axes be drawn? Default |
xlab |
X-axis label. |
ylab |
Y-axis label. |
xlim |
X-axis limits. |
ylim |
Y-axis limits. |
asp |
Aspect ratio. Default |
interpolate |
Logical; should raster image be interpolated? Default |
max_pixels |
Maximum number of pixels to render on screen plot. Default
|
add |
Logical; add to existing plot window? Default |
... |
Additional graphical arguments passed to |
Invisibly returns the plotted image object.
## Not run: img <- image(array(as.raw(sample(0:255, 30000)), dim = c(100, 100, 3))) plot(img, main = "Sample Image") plot(img, xlim = c(20, 80), ylim = c(20, 80), main = "Zoomed Region") ## End(Not run)## Not run: img <- image(array(as.raw(sample(0:255, 30000)), dim = c(100, 100, 3))) plot(img, main = "Sample Image") plot(img, xlim = c(20, 80), ylim = c(20, 80), main = "Zoomed Region") ## End(Not run)
plot for image_shp objectsDraws the bounding boxes for each object computed with image_shp().
## S3 method for class 'image_shp' plot( x, img = NULL, col_line = "black", size_line = 2, col_text = "black", size_text = 0.75, ... )## S3 method for class 'image_shp' plot( x, img = NULL, col_line = "black", size_line = 2, col_text = "black", size_text = 0.75, ... )
x |
An object computed with |
img |
The image that was used to compute the shapefile (optional) |
col_line, col_text
|
The color of the line/text in the grid. Defaults to
|
size_line, size_text
|
The size of the line/text in the grid. Defaults to
|
... |
Currently not used. |
A NULL object
if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg") shape <- image_shp(flax, nrow = 3, ncol = 5) # grid on the existing image plot(flax) plot(shape) }if (interactive()) { library(pliman) flax <- image_pliman("flax_leaves.jpg") shape <- image_shp(flax, nrow = 3, ncol = 5) # grid on the existing image plot(flax) plot(shape) }
Plot method for root_analysis objects
## S3 method for class 'root_analysis' plot( x, type = c("all", "skeleton", "hierarchy", "classification", "overlay", "diameter", "depth", "angles", "classes", "profile", "envelope", "shape", "topology", "angles_depth", "tropism", "diameter_dist", "density", "orders", "order_metrics", "binary"), which = NULL, background = if (!is.null(x$original_image)) "image" else "white", nodes = TRUE, alpha = 0.85, col = NULL, lwd = 2, cex_nodes = 1, legend_pos = "auto", cex_legend = NULL, axes = TRUE, grid = TRUE, ... )## S3 method for class 'root_analysis' plot( x, type = c("all", "skeleton", "hierarchy", "classification", "overlay", "diameter", "depth", "angles", "classes", "profile", "envelope", "shape", "topology", "angles_depth", "tropism", "diameter_dist", "density", "orders", "order_metrics", "binary"), which = NULL, background = if (!is.null(x$original_image)) "image" else "white", nodes = TRUE, alpha = 0.85, col = NULL, lwd = 2, cex_nodes = 1, legend_pos = "auto", cex_legend = NULL, axes = TRUE, grid = TRUE, ... )
x |
An object of class |
type |
Type of plot:
|
which |
Optional alias for |
background |
Background for skeleton, diameter, or overlay plot: |
nodes |
Logical. If |
alpha |
Numeric transparency in |
col |
Optional vector of colors for the diameter heatmap palette. |
lwd |
Line width for drawing root skeleton segments (default: 2.0). |
legend_pos |
Position of the legend: |
cex_legend |
Character expansion factor for the legend (default: |
axes |
Logical. If |
grid |
Logical. If |
... |
Additional graphical arguments passed to plotting functions. |
Plots reference image(s) with bounding boxes, segmentation polygons, and clicked exemplar points.
When the model contains multiple reference images, they are arranged automatically in a multi-panel grid.
Setting rainbow = TRUE renders each detected instance in distinct vibrant colors.
## S3 method for class 'yolo_fewshot_model' plot( x, task = x$task, rainbow = TRUE, show_boxes = NULL, show_polygons = NULL, show_points = TRUE, col_border = "#00FFCC", col_poly = "#00FFCC55", col_point = "#FFFF00", lwd = 2, mfrow = NULL, which = NULL, ... )## S3 method for class 'yolo_fewshot_model' plot( x, task = x$task, rainbow = TRUE, show_boxes = NULL, show_polygons = NULL, show_points = TRUE, col_border = "#00FFCC", col_poly = "#00FFCC55", col_point = "#FFFF00", lwd = 2, mfrow = NULL, which = NULL, ... )
x |
A |
task |
Target task: |
rainbow |
Logical. If |
show_boxes |
Logical. Show bounding boxes. Defaults to |
show_polygons |
Logical. Show segmentation polygons. Defaults to |
show_points |
Logical. Show clicked exemplar points. Defaults to |
col_border |
Border color when |
col_poly |
Fill color for polygons when |
col_point |
Point color for exemplars. Defaults to |
lwd |
Line width for borders. Defaults to |
mfrow |
Numeric vector of length 2 for grid layout (e.g. |
which |
Indices or names of reference images to plot. If |
... |
Additional arguments passed to graphics methods. |
Invisible x.
Generates high-resolution, publication-ready base R vector graphics for evaluating trained YOLO models. Supports multi-panel overview dashboards, confusion matrices (raw counts and normalized rates), precision-recall (PR) curves, confidence vs. F1-score curves, and epoch-wise loss/metric progressions.
## S3 method for class 'yolo_train' plot( x, which = c("all", "metrics", "confusion_matrix_norm", "confusion_matrix", "pr_curve", "f1_curve", "results", "labels"), native = TRUE, bg = "#fafafa", mar = 0.5, ... )## S3 method for class 'yolo_train' plot( x, which = c("all", "metrics", "confusion_matrix_norm", "confusion_matrix", "pr_curve", "f1_curve", "results", "labels"), native = TRUE, bg = "#fafafa", mar = 0.5, ... )
x |
An object of class |
which |
Which plot to display. One of:
|
native |
Logical. When |
bg |
Background color for native plots. Defaults to |
mar |
Plot margins passed to base graphics. Defaults to |
... |
Additional arguments passed to base graphics. |
1. Spatial Overlap (Intersection over Union, IoU):
Given a predicted bounding box or segmentation mask and a ground truth
annotation , the spatial overlap is quantified by the Jaccard index:
A detection is designated as a True Positive (TP) if (typically )
and the predicted class matches ground truth.
2. Confusion Matrix with Background Class:
Object detection models must detect both the presence and location of objects. Hence, detections can fail by predicting
an incorrect class, by hallucinating an object on the background, or by failing to detect a real object.
The evaluation matrix of dimensions includes the background class:
Cell for : Ground truth object of class predicted as class .
Diagonal entries represent True Positives (TP).
Last column : Ground truth object of class completely missed by the model
(misclassified as background, i.e., False Negatives, FN).
Last row : Background region falsely predicted as an object of class
(i.e., False Positives, FP).
The row-normalized confusion matrix computes the empirical conditional probability :
The diagonal entry corresponds directly to the per-class Sensitivity (Recall).
Conversely, the column-normalized entry represents the empirical precision :
3. Precision and Recall:
At any given confidence threshold :
Precision measures the accuracy of positive predictions (minimizing false alarms), while Recall measures the completeness of coverage (minimizing missed objects).
4. F1-Score vs. Confidence Curve:
The F1-score is the harmonic mean of Precision and Recall as a function of the confidence threshold :
The peak of this curve identifies the optimal operating threshold that maximizes the harmonic trade-off:
5. Precision-Recall (PR) Curve and Average Precision (AP):
As the confidence threshold ranges from 1 down to 0, recall monotonically increases from 0 to 1, while precision generally declines.
The interpolated precision at recall level is the maximum precision achieved at any recall :
Average Precision (AP) is the integral area under this interpolated curve, numerically approximated via the 101-point COCO evaluation grid:
6. Mean Average Precision (mAP):
mAP@50 (mAP50): Mean AP across all target classes evaluated at an IoU threshold of :
mAP@50-95 (mAP50-95): The primary metric of the COCO benchmark, computed as the unweighted mean of mAP across 10 IoU thresholds from to in steps of :
which = "all": Displays a 2x2 publication-ready dashboard combining:
(1) Training & Validation Loss curves (detecting divergence, underfitting, or overfitting),
(2) Validation mAP progression across epochs (with the best epoch highlighted with a star),
(3) Normalized Confusion Matrix (identifying frequent misclassifications and background leakage), and
(4) Precision-Recall curve with shaded area under the curve (quantifying overall detector precision).
which = "confusion_matrix": Displays raw detection counts across all classes and background.
High counts in the bottom row indicate excessive false positive background detections; high counts in the rightmost column indicate missed objects.
which = "confusion_matrix_norm": Displays normalized conditional probabilities. The diagonal values represent per-class sensitivity (percentage of true objects correctly detected).
which = "pr_curve": A steep curve maintaining precision close to 1.0 across high recall indicates a highly robust model with minimal false positives.
which = "f1_curve": Used to choose the ideal confidence threshold for downstream inference in image_detect_dl or image_segment_dl.
which = "metrics": Displays a 2x3 panel of detailed epoch-by-epoch loss curves (box, class, mask), precision, recall, and learning rate schedules.
Invisibly returns x or plotted data frame.
yolo_plot(), yolo_results(), yolo_train()
## Not run: library(pliman) # Load diagnostics from a previously trained model res <- yolo_results("capsulas_det") # Inspect training summary and plot 2x2 diagnostic dashboard print(res) plot(res) # Plot individual evaluation curves in high-resolution vector format: plot(res, which = "confusion_matrix") plot(res, which = "confusion_matrix_norm") plot(res, which = "pr_curve") plot(res, which = "f1_curve") plot(res, which = "metrics") ## End(Not run)## Not run: library(pliman) # Load diagnostics from a previously trained model res <- yolo_results("capsulas_det") # Inspect training summary and plot 2x2 diagnostic dashboard print(res) plot(res) # Plot individual evaluation curves in high-resolution vector format: plot(res, which = "confusion_matrix") plot(res, which = "confusion_matrix_norm") plot(res, which = "pr_curve") plot(res, which = "f1_curve") plot(res, which = "metrics") ## End(Not run)
This function calculates the apex and base angles of an object. It takes as
input a matrix of coordinates and returns the apex angle, base angle, and the
coordinates of the apex and base as a list. The angles are computed after the
object is aligned in the vertical axis with poly_align().
poly_apex_base_angle( x, percentiles = c(0.25, 0.75), invert = FALSE, plot = TRUE )poly_apex_base_angle( x, percentiles = c(0.25, 0.75), invert = FALSE, plot = TRUE )
x |
A matrix of coordinates representing the contour of the object,
often obtained with |
percentiles |
A numeric vector of two percentiles between 0 and 1 indicating the height of the points from the top to the bottom. The function calculates the apex angle between the two percentiles and the base angle between the lowest point and the highest point. |
invert |
If |
plot |
Plots the polygon with the points? Defaults to |
A list containing the apex angle, base angle, apex coordinates, and base coordinates.
if (interactive()) { library(pliman) # a matrix of coordinates angls <- poly_apex_base_angle(contours[[2]]) angls # or a list of coordinates poly_apex_base_angle(contours) }if (interactive()) { library(pliman) # a matrix of coordinates angls <- poly_apex_base_angle(contours[[2]]) angls # or a list of coordinates poly_apex_base_angle(contours) }
This function calculates the Perimeter Complexity Value (PCV) for a given set
of coordinates representing a contour. The PCV measures the variation of
distances between the original coordinates and the smoothed coordinates
relative to the perimeter length of the original contour. See more in
details section.
poly_pcv(x, niter = 100)poly_pcv(x, niter = 100)
x |
A matrix or a list of matrices representing the coordinates of the polygon(s). |
niter |
An integer specifying the number of smoothing iterations. See
|
The PCV is computed using the following formula:
where
represents the distances between corresponding points in the original and
smoothed coordinates, and is the perimeter length of the smoothed
contour.
The PCV is computed by first smoothing the input contour using a specified number of iterations. The smoothed contour is then used to compute the distances between corresponding points in the original and smoothed coordinates. These distances reflect the variations in the contour shape after smoothing. The sum of these distances represents the overall magnitude of the variations. Next, the sum of distances is multiplied by the standard deviation of the distances to capture the dispersion or spread of the variations. Finally, this value is divided by the perimeter length of the original contour to provide a relative measure of complexity. Therefore, the PCV provides a relative measure of complexity by considering both the magnitude and spread of the variations in the contour shape after smoothing.
The PCV value(s) computed for the contour(s).
If x is a matrix, returns the complexity value of the polygon's
perimeter. If x is a list of matrices, returns a numeric vector of
complexity values for each polygon.
if (interactive()) { library(pliman) set.seed(20) shp <- efourier_shape(npoints = 1000) poly_pcv(shp) # increase the complexity of the outline shp2 <- poly_jitter(shp, noise_x = 20, noise_y = 250, plot = TRUE) smo <- poly_smooth(shp2, niter = 100, plot = FALSE) plot_contour(smo, col = "red") poly_pcv(shp2) }if (interactive()) { library(pliman) set.seed(20) shp <- efourier_shape(npoints = 1000) poly_pcv(shp) # increase the complexity of the outline shp2 <- poly_jitter(shp, noise_x = 20, noise_y = 250, plot = TRUE) smo <- poly_smooth(shp2, niter = 100, plot = FALSE) plot_contour(smo, col = "red") poly_pcv(shp2) }
The function computes the polygonal convex hull of the points in x and then returns the number of points that lie below a specified set of heights along the vertical axis of the convex hull.
poly_width_at( x, at = c(0.05, 0.25, 0.5, 0.75, 0.95), unify = FALSE, plot = FALSE )poly_width_at( x, at = c(0.05, 0.25, 0.5, 0.75, 0.95), unify = FALSE, plot = FALSE )
x |
A vector containing two-dimensional data points (often produced with object_contour). |
at |
A vector of heights along the vertical axis of the convex hull at
which to count the number of points below. The default value is |
unify |
A logical value indicating whether to use the unified convex hull calculation method. If unify = TRUE, coordinates in x will be first bound before computing the convex hull. |
plot |
A logical value that specifies whether the widths should be plotted. |
The convex hull computed from x is aligned along the major axis and then converted to a binary image. For each height in the at vector, the function computes the corresponding row number in the binary image (i.e., the row number that corresponds to the specified height along the vertical axis of the convex hull) and sums the values in that row to obtain the number of points that lie below the specified height. If the convex hull contains multiple polygons and unify = FALSE, the function loops over each polygon and returns a list of the number of points below the specified heights for each polygon. If the convex hull contains only one polygon or multiple polygons and unify = TRUE, the function returns a vector of the number of points below the specified heights for that single polygon.
A vector with the widths of the convex hull at the specified heights or a list of vectors with the widths of each component.
if (interactive()) { cont <- contours[[2]] plot_polygon(cont |> conv_hull() |> poly_align()) # width below 5th, 25th, 50th, 75th, and 95th percentiles of the length wd <- poly_width_at(cont) wd # width along the height poly_width_at(cont, at = "height", plot = TRUE) }if (interactive()) { cont <- contours[[2]] plot_polygon(cont |> conv_hull() |> poly_align()) # width below 5th, 25th, 50th, 75th, and 95th percentiles of the length wd <- poly_width_at(cont) wd # width along the height poly_width_at(cont, at = "height", plot = TRUE) }
Evaluates a fitted glm logistic regression model directly on image channel
matrices without creating massive data frames or running slow predict.glm
loops over millions of pixels.
predict_binary_glm(model, img)predict_binary_glm(model, img)
model |
A fitted |
img |
An |
An integer matrix containing 1 (foreground) and 0 (background).
It is a simple wrapper around image_align() and image_crop(). In this case, only the option viewer = "base" is used. To use viewer = "mapview", please, use such functions separately.
prepare_to_shp(img, align = "vertical")prepare_to_shp(img, align = "vertical")
img |
A |
align |
The desired alignment. Either |
An aligned and cropped image object.
if (interactive()) { img <- image_pliman("flax_leaves.jpg") prepare_to_shp(img) }if (interactive()) { img <- image_pliman("flax_leaves.jpg") prepare_to_shp(img) }
image objectsPrint method for image objects
## S3 method for class 'image' print(x, ...)## S3 method for class 'image' print(x, ...)
x |
An |
... |
Unused. |
Print method for pliman_video_frames
## S3 method for class 'pliman_video_frames' print(x, ...)## S3 method for class 'pliman_video_frames' print(x, ...)
x |
An object of class |
... |
Additional arguments (not used). |
Print method for root_analysis objects
## S3 method for class 'root_analysis' print(x, ...)## S3 method for class 'root_analysis' print(x, ...)
x |
A |
... |
Ignored. |
Displays a concise summary of YOLO model training results, performance, and saved artifacts.
## S3 method for class 'yolo_train' print(x, ...)## S3 method for class 'yolo_train' print(x, ...)
x |
An object of class |
... |
Additional arguments (currently unused). |
Invisibly returns x.
Randomly chooses single or multiple built-in color names which R knows about.
See more at grDevices::colors()
random_color(n = 1, distinct = FALSE)random_color(n = 1, distinct = FALSE)
n |
The number of color names. Defaults to 1. |
distinct |
Logical indicating if the colors returned should all be
distinct. Defaults to |
A character vector of color names
library(pliman) random_color(n = 3)library(pliman) random_color(n = 3)
Removes specular reflections from a grayscale index matrix before thresholding. Algorithm:
Auto-detects which class is background by sampling border pixels after Otsu.
BFS from image borders marks all background pixels reachable from the exterior.
Internal holes = background-class pixels NOT reached by BFS (enclosed by grain).
Each internal hole pixel is replaced by the MEDIAN of its foreground (grain)
neighbours within radius. This is orientation-agnostic and never touches
the grain boundary or the external background.
remove_reflection_cpp(img, radius = 5L, has_white_bg = TRUE)remove_reflection_cpp(img, radius = 5L, has_white_bg = TRUE)
img |
Grayscale index matrix. |
radius |
Neighbourhood radius for median sampling (default = 5). |
has_white_bg |
Unused — background class is detected automatically. |
Corrected grayscale matrix.
Combines single-channel matrices, arrays, or image objects representing
Red, Green, and Blue channels into a 3D color RGB image object.
rgb_image(red = NULL, green = NULL, blue = NULL) rgbImage(red = NULL, green = NULL, blue = NULL)rgb_image(red = NULL, green = NULL, blue = NULL) rgbImage(red = NULL, green = NULL, blue = NULL)
red, green, blue
|
Single-channel matrices, arrays, or |
A 3D image object of color mode "Color".
root_analyze() performs comprehensive, high-throughput phenotyping of plant
root systems from scans, camera images, or binary masks, surpassing the analytical
capabilities of standalone tools like RhizoVision Explorer and WinRHIZO:
Exact Euclidean Distance Transform (EDT): Computes continuous local diameters for every skeletal root pixel with sub-pixel precision.
Topological Skeletonization & Pruning: Guo-Hall thinning followed by spurious spur pruning eliminates surface roughness noise without shortening genuine lateral roots.
Root Hierarchy Extraction: Automatically distinguishes the Primary Root Axis (order 1 taproot / seminal root) from Secondary / Lateral roots (order 2 and higher).
True Insertion / Branching Angles: Calculates angular divergence of lateral roots relative to parent root growth vectors in degrees (0-180 deg).
3D Root Geometry: Computes surface area () and
volume () using cylindrical integration.
Stratified Depth Profile: Dissects the root system into horizontal depth horizons, computing root length, surface area, volume, and RhizoVision-style root crossings per layer.
Global Network Shape: Calculates network width, depth, width-to-depth ratio, convex hull area, network solidity, and bushiness.
Custom Diameter Size Classes: Stratifies length, area, and volume across fine, medium, coarse, and user-defined root diameter bins.
root_analyze( img, index = "GRAY", threshold = "otsu", otsu_adj = 1.2, fill_hull = FALSE, max_order = 3, background = "auto", pixel_size = 1, dpi = NULL, unit = "mm", num_classes = 4, depth_slices = 10, crown_point = NULL, cluster_radius = 3, prune_length = NULL, gravitropic_alpha = 3, closing = 1, fill_size = 200, radius_prune = 1.2, dissolve_cycles = TRUE, plot = FALSE, plot_type = "all", verbose = TRUE, ... )root_analyze( img, index = "GRAY", threshold = "otsu", otsu_adj = 1.2, fill_hull = FALSE, max_order = 3, background = "auto", pixel_size = 1, dpi = NULL, unit = "mm", num_classes = 4, depth_slices = 10, crown_point = NULL, cluster_radius = 3, prune_length = NULL, gravitropic_alpha = 3, closing = 1, fill_size = 200, radius_prune = 1.2, dissolve_cycles = TRUE, plot = FALSE, plot_type = "all", verbose = TRUE, ... )
img |
An |
index |
Color index used to segment roots if |
threshold |
Segmentation threshold for binarization. Defaults to |
otsu_adj |
Numeric multiplier applied to the Otsu threshold (default: 1.2, i.e., +20% adjustment).
Shifts the threshold towards the background to prevent losing fine, faint lateral roots.
Set to |
fill_hull |
Logical. If |
max_order |
Integer specifying the maximum root branching order to classify based on
node hierarchy (default: 3). |
background |
Background color: |
pixel_size |
Physical size of one pixel in the chosen |
dpi |
Optional integer scanner/camera resolution in dots per inch. If provided,
overrides |
unit |
Unit of measurement for lengths and coordinates (default: |
num_classes |
Number of diameter size classes to compute based on quantiles (default: 4).
Can also be a numeric vector of custom diameter cut points (e.g., |
depth_slices |
Integer specifying the number of horizontal depth strata to compute vertical distribution profiles (default: 10). |
crown_point |
Optional numeric vector of length 2 |
cluster_radius |
Numeric radius (in pixels) within which adjacent branching junctions
(degree >= 3) are clustered and merged into a single consensus node (default: 3 pixels).
Thick roots often generate multi-pixel clusters of junction pixels during skeletonization;
increasing |
prune_length |
Optional integer minimum length in pixels for terminal spur branches
(default: |
gravitropic_alpha |
Numeric weight (default: 3) controlling how strongly the primary
root detection favours downward-growing edges over purely diameter-based selection. Higher
values (e.g., 3.0–5.0) guide the taproot identification along the downward vertical axis,
even when horizontal lateral roots are thicker than the primary axis. Set to |
closing |
Integer morphological closing radius (in pixels) applied to the binary mask
in C++ (default: 1). Performs morphological dilation followed by erosion. Smooths bark
roughness and bridges micro-fissures in segmented roots. Set to |
fill_size |
Integer maximum area (in pixels) of enclosed cavities to fill internally
in C++ (default: 200). Converts enclosed background regions (holes) with area <= |
radius_prune |
Numeric multiplier applied to local parent root radius for adaptive spur
pruning (default: 1.2). Terminal branches with length shorter than
|
dissolve_cycles |
Logical. If |
plot |
Logical. If |
plot_type |
Type of visualization: |
verbose |
Logical. If |
... |
Additional arguments passed to |
An object of class root_analysis (or root_analysis_list for multiple images)
containing:
summary: Single-row data.frame with all phenotypic traits.
roots: Detailed data.frame of all individual root segments (order, length, avg diameter,
surface area, volume, branching angle, insertion depth).
nodes: Coordinates, degrees, and types (crown, junction, tip) of all network nodes.
paths: List of matrices containing (x, y) coordinates for each curved root segment.
diameter_classes: Distribution of length, surface area, and volume across diameter classes.
depth_profile: Stratified depth distribution with lengths, volumes, and root crossings.
skeleton: 2D binary matrix of the pruned skeleton.
diameter_map: 2D matrix of local root diameters.
Tiago Olivoto [email protected]
Seethepalli, A., Guo, H., Liu, X., Ruff, T., & York, L. M. (2021). RhizoVision Explorer: open-source software for generalized root phenotyping using image analysis. Plant Physiology, 187(2), 739-757.
## Not run: library(pliman) # Analyze a root image scanned at 600 DPI res <- root_analyze("root_sample.jpg", dpi = 600) # View global phenotypic summary res$summary # Plot 4-panel diagnostic dashboard plot(res) # Plot continuous diameter heatmap plot(res, type = "diameter") ## End(Not run)## Not run: library(pliman) # Analyze a root image scanned at 600 DPI res <- root_analyze("root_sample.jpg", dpi = 600) # View global phenotypic summary res$summary # Plot 4-panel diagnostic dashboard plot(res) # Plot continuous diameter heatmap plot(res, type = "diameter") ## End(Not run)
Given an object computed with measure_disease() or measure_disease_byl()
a Standard Area Diagram (SAD) with n images are returned with the
respective severity values.
sad( object, n, show_original = FALSE, show_contour = FALSE, nrow = NULL, ncol = NULL, ... )sad( object, n, show_original = FALSE, show_contour = FALSE, nrow = NULL, ncol = NULL, ... )
object |
An object computed with |
n |
The number of leaves in the Standard Area Diagram. |
show_original |
Show original images? Defaults to |
show_contour |
Show original images? Defaults to |
nrow, ncol
|
The number of rows and columns in the plot. See [image_combine())] [image_combine())]: R:image_combine()) |
... |
Other arguments passed on to |
The leaves with the smallest and highest severity will always be in the SAD.
If n = 1, the leaf with the smallest severity will be returned. The others
are sampled sequentially to achieve the n images after severity has been
ordered in an ascending order. For example, if there are 30 leaves and n is
set to 3, the leaves sampled will be the 1st, 15th, and 30th with the
smallest severity values.
The SAD can be only computed if an image pattern name is used in argument
pattern of measure_disease(). If the images are saved, the n images
will be retrevied from dir_processed directory. Otherwise, the severity
will be computed again to generate the images.
A data frame with the severity values for the n sampled leaves. A plot with
the standard area diagram can be saved by wrapping sad() with png().
Del Ponte EM, Pethybridge SJ, Bock CH, et al (2017) Standard area diagrams for aiding severity estimation: Scientometrics, pathosystems, and methodological trends in the last 25 years. Phytopathology 107:1161–1174. doi:10.1094/PHYTO-02-17-0069-FI
if (interactive()) { library(pliman) sev <- measure_disease(pattern = "sev_leaf", img_healthy = "sev_healthy", img_symptoms = "sev_sympt", img_background = "sev_back", plot = FALSE, save_image = TRUE, show_original = FALSE, dir_original = image_pliman(), dir_processed = tempdir()) sad(sev, n = 2) }if (interactive()) { library(pliman) sev <- measure_disease(pattern = "sev_leaf", img_healthy = "sev_healthy", img_symptoms = "sev_sympt", img_background = "sev_back", plot = FALSE, save_image = TRUE, show_original = FALSE, dir_original = image_pliman(), dir_processed = tempdir()) sad(sev, n = 2) }
This function converts Sentinel satellite data files to GeoTIFF format.
sentinel_to_tif(layers = NULL, path = ".", destination, spat_res = 10)sentinel_to_tif(layers = NULL, path = ".", destination, spat_res = 10)
layers |
(character) Vector of file paths to Sentinel data files. If NULL, the function searches for files in the specified path with names containing "B". |
path |
(character) Directory path where Sentinel data files are located. Default is the current directory. |
destination |
(character) File path for the output GeoTIFF file. |
spat_res |
(numeric) Spatial resolution of the output GeoTIFF file. Default is 10 meters. |
The function converts Sentinel satellite data files to GeoTIFF format using GDAL utilities. It builds a virtual raster file (VRT) from the input files and then translates it to GeoTIFF format. Compression is applied to the output GeoTIFF file using DEFLATE method.
Given either a regular expression or a vector of character positions,
separate_col() turns a single character column into multiple columns.
separate_col(.data, col, into, sep = "[^[:alnum:]]+")separate_col(.data, col, into, sep = "[^[:alnum:]]+")
.data |
A data frame |
col |
Column name |
into |
Names of new variables to create as character vector |
sep |
The separator between columns. By default, a regular expression that matches any sequence of non-alphanumeric values. |
A mutated .data
library(pliman) df <- data.frame(x = paste0("TRAT_", 1:5), y = 1:5) df separate_col(df, x, into = c("TRAT", "REP"))library(pliman) df <- data.frame(x = paste0("TRAT_", 1:5), y = 1:5) df separate_col(df, x, into = c("TRAT", "REP"))
Sets the value of the pliman_viewer option used in the package.
set_pliman_viewer(value)set_pliman_viewer(value)
value |
The value to be set for the pliman_viewer option. |
This function takes a mosaic raster to create a shapefile containing polygons
for the specified regions. Users can drawn Areas of Interest (AOIs) that can
be either a polygon with n sides or a rectangular/curvilinear grid, defined
by nrow, and ncol arguments.
shapefile_build( mosaic, basemap = NULL, controlpoints = NULL, r = 3, g = 2, b = 1, crop_to_shape_ext = FALSE, grid = TRUE, method = c("rectangular", "radial", "landmark"), engine = c("cpp", "cpp_old"), nrow = 1, ncol = 1, curved = TRUE, density = 30, plot_width = NULL, plot_height = NULL, layout = "lrtb", serpentine = TRUE, build_shapefile = TRUE, check_shapefile = FALSE, sf_to_polygon = FALSE, buffer = FALSE, buffer_edge = 1, buffer_col = 0, buffer_row = 0, as_sf = TRUE, verbose = TRUE, max_pixels = 1e+06, downsample = NULL, quantiles = c(0, 1) )shapefile_build( mosaic, basemap = NULL, controlpoints = NULL, r = 3, g = 2, b = 1, crop_to_shape_ext = FALSE, grid = TRUE, method = c("rectangular", "radial", "landmark"), engine = c("cpp", "cpp_old"), nrow = 1, ncol = 1, curved = TRUE, density = 30, plot_width = NULL, plot_height = NULL, layout = "lrtb", serpentine = TRUE, build_shapefile = TRUE, check_shapefile = FALSE, sf_to_polygon = FALSE, buffer = FALSE, buffer_edge = 1, buffer_col = 0, buffer_row = 0, as_sf = TRUE, verbose = TRUE, max_pixels = 1e+06, downsample = NULL, quantiles = c(0, 1) )
mosaic |
A |
basemap |
An optional |
controlpoints |
An object created with |
r, g, b
|
The layer for the Red, Green and Blue band, respectively.
Defaults to |
crop_to_shape_ext |
Crop the mosaic to the extension of shapefile?
Defaults to |
grid |
Logical, indicating whether to use a grid for segmentation (default: TRUE). |
method |
Character. The generation method: |
engine |
Character string specifying the computation engine to use: |
nrow |
Number of rows for the grid (default: 1). |
ncol |
Number of columns for the grid (default: 1). |
curved |
Logical. If |
density |
Integer. The number of intermediate points used to draw the
curved edges of each polygon. This argument is ignored if |
plot_width, plot_height
|
The width and height of the plot shape (in the
mosaic unit). It is mutually exclusiv with |
layout |
Character: one of
|
serpentine |
Create a serpentine-based layout? Defaults to |
build_shapefile |
Logical, indicating whether to interactively draw ROIs
if the shapefile is |
check_shapefile |
Logical, indicating whether to validate the shapefile with an interactive map view (default: TRUE). This enables live editing of the drawn shapefile by deleting or changing the drawn grids. |
sf_to_polygon |
Convert sf geometry like POINTS and LINES to POLYGONS?
Defaults to |
buffer |
Numeric. A buffer distance (in map units) to be applied uniformly
to the final generated plots. If negative, the plots will be shrunk; if
positive, the plots will be expanded. Default is |
buffer_edge |
Width of the buffer around the shapefile (default: 5). |
buffer_col, buffer_row
|
Buffering factor for the columns and rows, respectively, of each individual plot's side. A value between 0 and 0.5 where 0 means no buffering and 0.5 means complete buffering (default: 0). A value of 0.25 will buffer the plot by 25% on each side. |
as_sf |
Logical value indicating whether to convert the imported
shapefile to an |
verbose |
Logical, indicating whether to display verbose output (default: TRUE). |
max_pixels |
Maximum number of pixels to render in the map or plot (default: 500000). |
downsample |
Downsampling factor to reduce the number of pixels
(default: NULL). In this case, if the number of pixels in the image (width
x height) is greater than |
quantiles |
the upper and lower quantiles used for color stretching. |
The function supports three generation methods:
Rectangular: Uses standard interpolation, ideal for regular grids. Supports buffers and fixed plot sizes.
Radial: Uses an orthogonal projection from a centerline, ideal for curvilinear grids (e.g., contour farming).
Landmark: Uses the specific control points defined by the user as anchors for the plot boundaries.
Since multiple blocks can be created, the length of arguments grid, nrow,
ncol, buffer_edge, buffer_col, and buffer_row can be either an scalar
(the same argument applied to all the drawn blocks), or a vector with the
same length as the number of drawn blocks. In the last, shapefiles in each
block can be created with different dimensions.
Curvilinear Grid Handling: When defining an AOI using the Polygon or Rectangle
tools, the corners drawn by the user establish the path and orientation
of the grid. The function automatically checks the angle formed by these
drawn control points, creates the grid using user-defined nrow and ncol
and uses a rotation-adjusted layout to ensure the plot ID sequence follows
the intended serpentine or linear pattern along the long axis of the drawn
boundary.
A list with the built shapefile. Each element is an sf object with
the coordinates of the drawn polygons.
if (interactive()) { library(pliman) mosaic <- image_pliman("soy_ortho.tif") # Draw a regular polygon with 7 rows and 3 columns shps <- shapefile_build(mosaic, nrow = 7, ncol = 3, build_shapefile = FALSE) mosaic_plot(mosaic) shapefile_plot(shps[[1]], add = TRUE) # Here, you'll need to draw the four control points that defines the grid # top left, top right, bottom right, bottom left shps <- shapefile_build(mosaic, nrow = 5, ncol = 3) mosaic_plot(mosaic) shapefile_plot(shps[[1]], add = TRUE) }if (interactive()) { library(pliman) mosaic <- image_pliman("soy_ortho.tif") # Draw a regular polygon with 7 rows and 3 columns shps <- shapefile_build(mosaic, nrow = 7, ncol = 3, build_shapefile = FALSE) mosaic_plot(mosaic) shapefile_plot(shps[[1]], add = TRUE) # Here, you'll need to draw the four control points that defines the grid # top left, top right, bottom right, bottom left shps <- shapefile_build(mosaic, nrow = 5, ncol = 3) mosaic_plot(mosaic) shapefile_plot(shps[[1]], add = TRUE) }
This function allows you to interactively edit features in a shapefile using the mapedit package.
shapefile_edit( shapefile, mosaic = NULL, basemap = NULL, r = 3, g = 2, b = 1, max_pixels = 3e+06 )shapefile_edit( shapefile, mosaic = NULL, basemap = NULL, r = 3, g = 2, b = 1, max_pixels = 3e+06 )
shapefile |
A shapefile ( |
mosaic |
Optionally, a mosaic (SpatRaster) to be displayed as a background. |
basemap |
An optional |
r |
Red band index for RGB display (default is 3). |
g |
Green band index for RGB display (default is 2). |
b |
Blue band index for RGB display (default is 1). |
max_pixels |
Maximum number of pixels for down-sampling the mosaic (default is 3e6). |
A modified shapefile with user-edited features.
if (interactive()) { library(pliman) shp <- shapefile_input(system.file("ex/lux.shp", package="terra")) edited <- shapefile_edit(shp) }if (interactive()) { library(pliman) shp <- shapefile_input(system.file("ex/lux.shp", package="terra")) edited <- shapefile_edit(shp) }
This function interpolates values at specified points using x, y coordinates and a target variable from a shapefile. It supports "Kriging" and "Tps" interpolation methods.
shapefile_interpolate( shapefile, z, x = "x", y = "y", interpolation = c("Kriging", "Tps"), verbose = FALSE )shapefile_interpolate( shapefile, z, x = "x", y = "y", interpolation = c("Kriging", "Tps"), verbose = FALSE )
shapefile |
An sf object containing the x, y, and target variable (z)
columns. It is highly recommended to use |
z |
A string specifying the name of the column in the shapefile that contains the target variable to be interpolated. |
x |
A string specifying the name of the column containing x-coordinates. Default is 'x'. |
y |
A string specifying the name of the column containing y-coordinates. Default is 'y'. |
interpolation |
A character vector specifying the interpolation method. Options are "Kriging" or "Tps". |
verbose |
Logical; if TRUE, progress messages will be displayed. |
A vector of interpolated values at the specified points.
shapefile_measures() calculates key geometric measures such as the number
of points, area, perimeter, width, height, and centroid coordinates for a
given shapefile (polygon) object.
shapefile_measures(shapefile, n = NULL, verbose = TRUE)shapefile_measures(shapefile, n = NULL, verbose = TRUE)
shapefile |
An |
n |
An integer specifying the number of polygons to process. If |
verbose |
Trigger an alert when complex geometries are used? |
This function processes a single or multi-polygon sf object and computes
geometric properties. It calculates distances between points, extracts the
centroid coordinates, and computes the area and perimeter of the polygons.
The width and height are derived from sequential distances between points.
A modified sf object with added columns for:
xcoord: The x-coordinate of the centroid.
ycoord: The y-coordinate of the centroid.
area: The area of the polygon (in square units).
perimeter: The perimeter of the polygon (in linear units).
width: The calculated width based on sequential distances between points.
The result will only be accurate if the polygon is rectangular.
height: The calculated height based on sequential distances between points.
The result will only be accurate if the polygon is rectangular.
if (interactive()) { library(pliman) path_shp <- paste0(image_pliman(), "/soy_shape.rds") shp <- shapefile_input(path_shp) shapefile_measures(shp) }if (interactive()) { library(pliman) path_shp <- paste0(image_pliman(), "/soy_shape.rds") shp <- shapefile_input(path_shp) shapefile_measures(shp) }
These functions perform various spatial operations on two shapefiles, including determining which geometries fall within, outside, touch, cross, overlap, or intersect another geometry. They also include functions for geometric operations such as intersection, difference, and union.
shapefile_within(shp1, shp2) shapefile_outside(shp1, shp2) shapefile_overlaps(shp1, shp2) shapefile_touches(shp1, shp2) shapefile_crosses(shp1, shp2) shapefile_intersection(shp1, shp2) shapefile_difference(shp1, shp2) shapefile_union(shp1, shp2)shapefile_within(shp1, shp2) shapefile_outside(shp1, shp2) shapefile_overlaps(shp1, shp2) shapefile_touches(shp1, shp2) shapefile_crosses(shp1, shp2) shapefile_intersection(shp1, shp2) shapefile_difference(shp1, shp2) shapefile_union(shp1, shp2)
shp1 |
An |
shp2 |
An |
All functions ensure that the coordinate reference systems (CRS) of both shapefiles are the same before performing operations. If the CRSs are different, shp2 will be transformed to match the CRS of shp1.
shapefile_within(): Filters features in shp1 that are fully within shp2.
shapefile_outside(): Filters features in shp1 that are outside or do not overlap shp2.
shapefile_overlaps(): Filters features in shp1 that overlap with shp2.
shapefile_touches(): Filters features in shp1 that touch the boundary of shp2.
shapefile_crosses(): Filters features in shp1 that cross through shp2.
shapefile_intersection(): Computes the geometric intersection of shp1 and shp2.
shapefile_difference(): Computes the geometric difference of shp1 minus shp2.
shapefile_union(): Computes the geometric union of shp1 and shp2.
A filtered sf object or the result of the geometric operation.
if (interactive()) { library(pliman) shp1 <- shapefile_input(paste0(image_pliman(), "/shp1.rds")) shp2 <- shapefile_input(paste0(image_pliman(), "/shp2.rds")) shapefile_view(shp1) + shapefile_view(shp1) # Apply operations shapefile_within(shp1, shp2) shapefile_outside(shp1, shp2) shapefile_overlaps(shp1, shp2) shapefile_touches(shp1, shp2) shapefile_crosses(shp1, shp2) shapefile_intersection(shp1, shp2) shapefile_difference(shp1, shp2) shapefile_union(shp1, shp2) }if (interactive()) { library(pliman) shp1 <- shapefile_input(paste0(image_pliman(), "/shp1.rds")) shp2 <- shapefile_input(paste0(image_pliman(), "/shp2.rds")) shapefile_view(shp1) + shapefile_view(shp1) # Apply operations shapefile_within(shp1, shp2) shapefile_outside(shp1, shp2) shapefile_overlaps(shp1, shp2) shapefile_touches(shp1, shp2) shapefile_crosses(shp1, shp2) shapefile_intersection(shp1, shp2) shapefile_difference(shp1, shp2) shapefile_union(shp1, shp2) }
Plot the values of a SpatVector
shapefile_plot(shapefile, ...)shapefile_plot(shapefile, ...)
shapefile |
An SpatVector of sf object. |
... |
Further arguments passed on to |
A NULL object
if(interactive()){ library(pliman) r <- shapefile_input(system.file("ex/lux.shp", package="terra")) shapefile_plot(r) }if(interactive()){ library(pliman) r <- shapefile_input(system.file("ex/lux.shp", package="terra")) shapefile_plot(r) }
This function creates a surface plot from an interpolated spatial model, with options to customize plot appearance, grid resolution, and color palette.
shapefile_surface( model, curve = TRUE, nx = 300, ny = 300, xlab = "Longitude (UTM)", ylab = "Latitude (UTM)", col = custom_palette(c("darkred", "yellow", "forestgreen"), n = 100), ... )shapefile_surface( model, curve = TRUE, nx = 300, ny = 300, xlab = "Longitude (UTM)", ylab = "Latitude (UTM)", col = custom_palette(c("darkred", "yellow", "forestgreen"), n = 100), ... )
model |
An interpolated spatial object (e.g., from |
curve |
Logical; if TRUE, a contour plot is generated ( |
nx |
Integer; the number of grid cells in the x-direction. Default is 300. |
ny |
Integer; the number of grid cells in the y-direction. Default is 300. |
xlab |
Character; label for the x-axis. Default is "Longitude (UTM)". |
ylab |
Character; label for the y-axis. Default is "Latitude (UTM)". |
col |
A color palette function for the surface plot. Default is a custom palette from dark red to yellow to forest green. |
... |
Additional parameters to pass to |
A surface plot showing spatially interpolated data.
Rotates, shifts, and scales (anisotropically) an sf object containing
grid polygons. This function is particularly useful for manually aligning
experimental grids over non-georeferenced imagery (e.g., drone flights)
by adjusting the grid's pose to match the visual features.
shapefile_transform( shapefile, shift_x = 0, shift_y = 0, angle = 0, scale_x = 1, scale_y = 1 )shapefile_transform( shapefile, shift_x = 0, shift_y = 0, angle = 0, scale_x = 1, scale_y = 1 )
shapefile |
An |
shift_x |
Numeric. Translation along the X-axis (in map units). Positive values move right. Default is 0. |
shift_y |
Numeric. Translation along the Y-axis (in map units). Positive values move up. Default is 0. |
angle |
Numeric. Rotation angle in degrees. Positive values rotate the grid clockwise (compass direction). Default is 0. |
scale_x |
Numeric. Scaling factor for the X-axis (width). Values > 1 expand, values < 1 compress. Default is 1.0. |
scale_y |
Numeric. Scaling factor for the Y-axis (height). Values > 1 expand, values < 1 compress. Default is 1.0. |
The transformations are applied in the following order for each vertex:
Centering: Vertices are translated so the grid's global centroid becomes (0,0).
Scaling: Anisotropic scaling is applied (scale_x, scale_y).
Rotation: Rotation is applied around the centroid. Positive angles rotate clockwise.
Translation: The grid is moved back to its original position plus the defined offsets (shift_x, shift_y).
This logic ensures the grid rotates and expands "in place" rather than flying off relative to the coordinate origin.
An sf object with the transformed geometry, preserving all original attributes.
if(interactive()){ library(pliman) shp <- system.file("ex/lux.shp", package="terra") shp_file <- shapefile_input(shp) shapefile_plot(shp_file) rot <- shapefile_transform(shp_file, angle = 5) shapefile_plot(rot, add = TRUE, border = "red") }if(interactive()){ library(pliman) shp <- system.file("ex/lux.shp", package="terra") shp_file <- shapefile_input(shp) shapefile_plot(shp_file) rot <- shapefile_transform(shp_file, angle = 5) shapefile_plot(rot, add = TRUE, border = "red") }
If more than one index is available, the function performs a Principal
Component Analysis and produces a plot showing the contribution of the
indexes to the PC1 (see pca()). If an index is declared in
index and a cut point in cut_point, the number and proportion of objects
with mean value of index bellow and above cut_point are returned.
Additionaly, the number and proportion of pixels bellow and above the
cutpoint is shown for each object (id).
summary_index( object, index = NULL, cut_point = NULL, select_higher = FALSE, plot = TRUE, type = "var", ... )summary_index( object, index = NULL, cut_point = NULL, select_higher = FALSE, plot = TRUE, type = "var", ... )
object |
An object computed with |
index |
The index desired, e.g., |
cut_point |
The cut point. |
select_higher |
If |
plot |
Shows the contribution plot when more than one index is
available? Defaults to |
type |
The type of plot to produce. Defaults to |
... |
Further arguments passed on to |
A list with the following elements:
ids The identification of selected objects.
between_id A data frame with the following columns
n The number of objects.
nsel The number of selected objects.
prop The proportion of objects selected.
mean_index_sel, and mean_index_nsel The mean value of index for the
selected and non-selected objects, respectively.
within_id A data frame with the following columns
id The object identification
n_less The number of pixels with values lesser than or equal to
cut_point.
n_greater The number of pixels with values greater than cut_point.
less_ratio The proportion of pixels with values lesser than or equal to
cut_point.
greater_ratio The proportion of pixels with values greater than
cut_point.
pca_res An object computed with pca()
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) soy <- image_pliman("soy_green.jpg") anal <- analyze_objects(soy, object_index = "G", pixel_level_index = TRUE) plot_measures(anal, measure = "G") summary_index(anal, index = "G", cut_point = 0.5) }if (interactive()) { library(pliman) soy <- image_pliman("soy_green.jpg") anal <- analyze_objects(soy, object_index = "G", pixel_level_index = TRUE) plot_measures(anal, measure = "G") summary_index(anal, index = "G", cut_point = 0.5) }
image objects (min, max, range, sum, prod, any, all)Group generic Summary method for image objects (min, max, range, sum, prod, any, all)
## S3 method for class 'image' Summary(..., na.rm = FALSE)## S3 method for class 'image' Summary(..., na.rm = FALSE)
... |
|
na.rm |
Logical; should NAs be removed? |
Computes L2-normalized 512-dimensional semantic embeddings for character strings using OpenAI's CLIP (ViT-B/32) text model directly via C++ ONNX Runtime.
text_embed_dl( text, model = "clip-vit-b32", threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = FALSE, dir = pliman_model_dir(), ... )text_embed_dl( text, model = "clip-vit-b32", threads = 0, engine = c("gpu", "cpu"), device_id = -1, verbose = FALSE, dir = pliman_model_dir(), ... )
text |
A character vector of one or more text prompts. |
model |
Model name or path to a custom ONNX text model file (default |
threads |
Number of CPU threads (default 0 for auto-tuning). |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
verbose |
Logical. Whether to show progress messages. |
dir |
Directory where models are stored (default |
... |
Additional arguments. |
A numeric matrix of dimensions length(text) x 512 containing the L2-normalized text embeddings.
## Not run: library(pliman) embs <- text_embed_dl(c("healthy soybean leaf", "asian rust lesion", "pest bite")) dim(embs) # 3 x 512 ## End(Not run)## Not run: library(pliman) embs <- text_embed_dl(c("healthy soybean leaf", "asian rust lesion", "pest bite")) dim(embs) # 3 x 512 ## End(Not run)
image between raw (0..255 uint8) and numeric (0..1 double)Convert image between raw (0..255 uint8) and numeric (0..1 double)
to_numeric(x) to_raw(x)to_numeric(x) to_raw(x)
x |
An |
An image object converted to numeric storage.
rgb_to_srgb() Transforms colors from RGB space (red/green/blue) to
Standard Red Green Blue (sRGB), using a gamma correction of 2.2. The
function performs the conversion by applying a gamma correction to the input
RGB values (raising them to the power of 2.2) and then transforming them
using a specific transformation matrix. The result is clamped to the range
0-1 to ensure valid sRGB values.
rgb_to_hsb() Transforms colors from RGB space (red/green/blue) to HSB
space (hue/saturation/brightness). The HSB values are calculated as follows
(see https://www.rapidtables.com/convert/color/rgb-to-hsv.html for more
details).
Hue: The hue is determined based on the maximum value among R, G, and B, and it ranges from 0 to 360 degrees.
Saturation: Saturation is calculated as the difference between the maximum and minimum channel values, expressed as a percentage.
Brightness: Brightness is equal to the maximum channel value, expressed as a percentage.
rgb_to_lab() Transforms colors from RGB space (red/green/blue) to CIE-LAB
space, using the sRGB values. See grDevices::convertColor() for more
details.
rgb_to_hsb(object) rgb_to_srgb(object) rgb_to_lab(object)rgb_to_hsb(object) rgb_to_srgb(object) rgb_to_lab(object)
object |
An |
A data frame with the columns of the converted color space
Tiago Olivoto [email protected]
See the detailed formulas here
if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") rgb_to_lab(img) # analyze the object and convert the pixels anal <- analyze_objects(img, object_index = "B", pixel_level_index = TRUE) rgb_to_lab(anal) }if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") rgb_to_lab(img) # analyze the object and convert the pixels anal <- analyze_objects(img, object_index = "B", pixel_level_index = TRUE) rgb_to_lab(anal) }
Provides useful conversions between size (cm), number of pixels (px) and dots per inch (dpi).
dpi_to_cm() converts a known dpi value to centimeters.
cm_to_dpi() converts a known centimeter values to dpi.
pixels_to_cm() converts the number of pixels to centimeters, given a
known resolution (dpi).
cm_to_pixels() converts a distance (cm) to number of pixels, given a
known resolution (dpi).
distance() Computes the distance between two points in an image based on
the Pythagorean theorem.
dpi() An interactive function to compute the image resolution given a
known distance informed by the user. See more information in the Details
section.
npixels() returns the number of pixels of an image.
dpi_to_cm(dpi) cm_to_dpi(cm) pixels_to_cm(px, dpi) cm_to_pixels(cm, dpi) npixels(img) dpi(img, viewer = get_pliman_viewer(), downsample = NULL, max_pixels = 1e+06) distance( img, viewer = get_pliman_viewer(), downsample = NULL, max_pixels = 1e+06 )dpi_to_cm(dpi) cm_to_dpi(cm) pixels_to_cm(px, dpi) cm_to_pixels(cm, dpi) npixels(img) dpi(img, viewer = get_pliman_viewer(), downsample = NULL, max_pixels = 1e+06) distance( img, viewer = get_pliman_viewer(), downsample = NULL, max_pixels = 1e+06 )
dpi |
The image resolution in dots per inch. |
cm |
The size in centimeters. |
px |
The number of pixels. |
img |
An image object. |
viewer |
The viewer option. If not provided, the value is retrieved
using |
downsample |
integer; for each dimension the number of
pixels/lines/bands etc that will be skipped; Defaults to |
max_pixels |
integer > 0. Maximum number of cells to use for the plot.
If |
dpi() only run in an interactive section. To compute the image
resolution (dpi) the user must use the left button mouse to create a line
of known distance. This can be done, for example, using a template with
known distance in the image (e.g., la_leaves.jpg).
dpi_to_cm(), cm_to_dpi(), pixels_to_cm(), and cm_to_pixels() return
a numeric value or a vector of numeric values if the input data is a vector.
dpi() returns the computed dpi (dots per inch) given the known distance
informed in the plot.
Tiago Olivoto [email protected]
library(pliman) # Convert dots per inch to centimeter dpi_to_cm(c(1, 2, 3)) # Convert centimeters to dots per inch cm_to_dpi(c(1, 2, 3)) # Convert centimeters to number of pixels with resolution of 96 dpi. cm_to_pixels(c(1, 2, 3), 96) # Convert number of pixels to cm with resolution of 96 dpi. pixels_to_cm(c(1, 2, 3), 96) if(isTRUE(interactive())){ #### compute the dpi (dots per inch) resolution #### # only works in an interactive section # objects_300dpi.jpg has a known resolution of 300 dpi img <- image_pliman("objects_300dpi.jpg") # Higher square: 10 x 10 cm # 1) Run the function dpi() # 2) Use the left mouse button to create a line in the higher square # 3) Declare a known distance (10 cm) # 4) See the computed dpi dpi(img) img2 <- image_pliman("la_leaves.jpg") # square leaf sample (2 x 2 cm) dpi(img2) }library(pliman) # Convert dots per inch to centimeter dpi_to_cm(c(1, 2, 3)) # Convert centimeters to dots per inch cm_to_dpi(c(1, 2, 3)) # Convert centimeters to number of pixels with resolution of 96 dpi. cm_to_pixels(c(1, 2, 3), 96) # Convert number of pixels to cm with resolution of 96 dpi. pixels_to_cm(c(1, 2, 3), 96) if(isTRUE(interactive())){ #### compute the dpi (dots per inch) resolution #### # only works in an interactive section # objects_300dpi.jpg has a known resolution of 300 dpi img <- image_pliman("objects_300dpi.jpg") # Higher square: 10 x 10 cm # 1) Run the function dpi() # 2) Use the left mouse button to create a line in the higher square # 3) Declare a known distance (10 cm) # 4) See the computed dpi dpi(img) img2 <- image_pliman("la_leaves.jpg") # square leaf sample (2 x 2 cm) dpi(img2) }
file_extension() Get the extension of a file.
file_name() Get the name of a file.
file_dir() Get or directory of a file
manipulate_files() Manipulate files in a directory with options to rename
(insert prefix or suffix) and save the new files to the same or other provided
directory.
pliman_indexes() Get the indexes available in pliman.
pliman_indexes_eq() Get the equation of the indexes available
in pliman.
file_extension(file) file_name(file) file_dir(file) manipulate_files( pattern, dir = NULL, prefix = NULL, name = NULL, suffix = NULL, extension = NULL, sep = "", save_to = NULL, overwrite = FALSE, remove_original = FALSE, verbose = TRUE )file_extension(file) file_name(file) file_dir(file) manipulate_files( pattern, dir = NULL, prefix = NULL, name = NULL, suffix = NULL, extension = NULL, sep = "", save_to = NULL, overwrite = FALSE, remove_original = FALSE, verbose = TRUE )
file |
The file name. |
pattern |
A file name pattern. |
dir |
The working directory containing the files to be manipulated. Defaults to the current working directory. |
prefix, suffix
|
A prefix or suffix to be added in the new file names.
Defaults to |
name |
The name of the new files. Defaults to |
extension |
The new extension of the file. If not declared (default), the original extensions will be used. |
sep |
An optional separator. Defaults to |
save_to |
The directory to save the new files. Defaults to the current
working directory. If the file name of a file is not changed, nothing will
occur. If |
overwrite |
Overwrite the files? Defaults to |
remove_original |
Remove original files after manipulation? defaults to
|
verbose |
If |
file_extension(), file_name(), and file_dir() return a character
string.
manipulate_files() No return value. If verbose == TRUE, a message is
printed indicating which operation succeeded (or not) for each of the files
attempted.
if (interactive()) { library(pliman) # get file name, directory and extension file <- "E:/my_folder/my_subfolder/image1.png" file_dir(file) file_name(file) file_extension(file) # manipulate files dir <- tempdir() list.files(dir) file.create(paste0(dir, "/test.txt")) list.files(dir) manipulate_files("test", dir = paste0(dir, "\\"), prefix = "chang_", save_to = paste0(dir, "\\"), overwrite = TRUE) list.files(dir) }if (interactive()) { library(pliman) # get file name, directory and extension file <- "E:/my_folder/my_subfolder/image1.png" file_dir(file) file_name(file) file_extension(file) # manipulate files dir <- tempdir() list.files(dir) file.create(paste0(dir, "/test.txt")) list.files(dir) manipulate_files("test", dir = paste0(dir, "\\"), prefix = "chang_", save_to = paste0(dir, "\\"), overwrite = TRUE) list.files(dir) }
Import images from files and URLs and write images to files, possibly with batch processing.
image_import( img, ..., which = 1, pattern = NULL, path = NULL, resize = FALSE, plot = FALSE, nrow = NULL, ncol = NULL ) image_export( img, name = NULL, prefix = "", extension = NULL, subfolder = NULL, ... ) image_input(img, ...) image_pliman(img, plot = FALSE)image_import( img, ..., which = 1, pattern = NULL, path = NULL, resize = FALSE, plot = FALSE, nrow = NULL, ncol = NULL ) image_export( img, name = NULL, prefix = "", extension = NULL, subfolder = NULL, ... ) image_input(img, ...) image_pliman(img, plot = FALSE)
img |
|
... |
|
which |
logical scalar or integer vector to indicate which image are
imported if a TIFF files is informed. Defaults to |
pattern |
A pattern of file name used to identify images to be imported.
For example, if |
path |
A character vector of full path names; the default corresponds to
the working directory, |
resize |
Resize the image after importation? Defaults to |
plot |
Plots the image after importing? Defaults to |
nrow, ncol
|
Passed on to |
name |
An string specifying the name of the image. It can be either a character with the image name (e.g., "img1") or name and extension (e.g., "img1.jpg"). If none file extension is provided, the image will be saved as a *.jpg file. |
prefix |
A prefix to include in the image name when exporting a list of
images. Defaults to |
extension |
When |
subfolder |
Optional character string indicating a subfolder within the current working directory to save the image(s). If the folder doesn't exist, it will be created. |
image_import() returns a new image object.
image_export() returns an return vector of file names.
image_pliman() returns a new image object with the example image
required. If an empty call is used, the path to the tmp_images directory
installed with the package is returned.
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) folder <- image_pliman() full_path <- paste0(folder, "/sev_leaf.jpg") (path <- file_dir(full_path)) (file <- basename(full_path)) image_import(img = full_path) image_import(img = file, path = path) }if (interactive()) { library(pliman) folder <- image_pliman() full_path <- paste0(folder, "/sev_leaf.jpg") (path <- file_dir(full_path)) (file <- basename(full_path)) image_import(img = full_path) image_import(img = file, path = path) }
pliman_indexes(): Get all the available indexes in pliman.
pliman_indexes_rgb(): Get all the RGB-based available indexes in pliman.
pliman_indexes_me(): Get all the multispectral available indexes in pliman.
pliman_indexes_hs(): Get all the hyperspectral available indexes in pliman.
pliman_indexes_eq(): Get the equations of the available indexes.
pliman_indexes() pliman_indexes_eq() pliman_indexes_rgb() pliman_indexes_me() pliman_indexes_hs()pliman_indexes() pliman_indexes_eq() pliman_indexes_rgb() pliman_indexes_me() pliman_indexes_hs()
get_measures() computes object measures (area, perimeter, radius) by using
either a known resolution (dpi) or an object with known measurements.
plot_measures() draws the object measures given in an object to the
current plot. The object identification ("id") is drawn by default.
get_measures( object, measure = NULL, id = NULL, dpi = NULL, sep = "\\_|-", verbose = TRUE, digits = 5 ) plot_measures( object, measure = "id", prefix = "", suffix = "", id = NULL, hjust = NULL, vjust = NULL, digits = 2, size = 0.9, col = "white", ... )get_measures( object, measure = NULL, id = NULL, dpi = NULL, sep = "\\_|-", verbose = TRUE, digits = 5 ) plot_measures( object, measure = "id", prefix = "", suffix = "", id = NULL, hjust = NULL, vjust = NULL, digits = 2, size = 0.9, col = "white", ... )
object |
An object computed with |
measure |
For
|
id |
An object in the image to indicate a known value. |
dpi |
A known resolution of the image in DPI (dots per inch). |
sep |
Regular expression to manage file names. The function combines in
the |
verbose |
If |
digits |
The number of significant figures. Defaults to |
prefix, suffix
|
A prefix/suffix to be added to the plotted measures. |
hjust, vjust
|
A numeric value to adjust the labels horizontally and vertically. Positive values will move labels to right (hjust) and top (vjust). Negative values will move the labels to left and bottom, respectively. |
size |
The size of the text. Defaults to |
col |
The color of the text. Defaults to |
... |
Further arguments passed on to |
For get_measures(), if measure is informed, the pixel values will be
corrected by the value of the known object, given in the unit of the
right-hand side of meae. If dpi is informed, then all the measures
will be adjusted to the knosurwn dpi.
If applied to an object of class anal_obj, returns a data frame with the
object id and the (corrected) measures.
If applied to an object of class anal_obj_ls, returns a list of class
measures_ls, with two objects: (i) results, a data frame containing
the identification of each image (img) and object within each image (id);
and (ii) summary a data frame containing the values for each image. If
more than one object is detected in a given image, the number of objects
(n), total area (area_sum), mean area (area_mean) and the standard
deviation of the area (area_sd) will be computed. For the other measures
(perimeter and radius), the mean values are presented.
plot_measures() returns a NULL object, drawing the text according to
the x and y coordinates of the objects in object.
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) img <- image_pliman("objects_300dpi.jpg") plot(img) # Image with four objects with a known resolution of 300 dpi # Higher square: 10 x 10 cm # Lower square: 5 x 5 cm # Rectangle: 4 x 2 cm # Circle: 3 cm in diameter # Count the objects using the blue band to segment the image results <- analyze_objects(img, index = "B", lower_noise = 0.1) plot_measures(results, measure = "id") # Get object measures by declaring the known resolution in dots per inch (measures <- get_measures(results, dpi = 300)) # Calculated diagonal of the object 1 # 10 * sqrt(2) = 14.14 # Observed diagonal of the object 1 measures[1, "radius_max"] * 2 # Get object measures by declaring the known area of object 1 get_measures(results, id = 1, area ~ 100) }if (interactive()) { library(pliman) img <- image_pliman("objects_300dpi.jpg") plot(img) # Image with four objects with a known resolution of 300 dpi # Higher square: 10 x 10 cm # Lower square: 5 x 5 cm # Rectangle: 4 x 2 cm # Circle: 3 cm in diameter # Count the objects using the blue band to segment the image results <- analyze_objects(img, index = "B", lower_noise = 0.1) plot_measures(results, measure = "id") # Get object measures by declaring the known resolution in dots per inch (measures <- get_measures(results, dpi = 300)) # Calculated diagonal of the object 1 # 10 * sqrt(2) = 14.14 # Observed diagonal of the object 1 measures[1, "radius_max"] * 2 # Get object measures by declaring the known area of object 1 get_measures(results, id = 1, area ~ 100) }
The pliman neural module provides high-accuracy, zero-Python foreground segmentation
and background removal powered by pre-trained Deep Learning models in ONNX
(Open Neural Network Exchange) format.
"u2netp" (Default for CPU):
Size: ~4.4 MB | Input Resolution: 320 x 320
Architecture: Ultra-lightweight U2-Net with nested U-structure residual blocks.
Best For: Fast batch processing on standard laptops and CPUs without dedicated GPU.
"ben2" (Boundary-Aware Extraction Network):
Size: ~212.6 MB | Input Resolution: 1024 x 1024
Architecture: BEN2 Base (Prama LLC) with boundary-focused refinement stream.
Best For: Crisp sub-pixel object boundaries, fine petioles, leaf margins, roots, and hairs.
"grounded-sam" (Zero-Shot Text-Prompted Detection & Instance Segmentation):
Size: ~314.8 MB (Grounding DINO ~194.4 MB + SAM 2.1 ~120.2 MB) | Input Resolution: 800 x 800 (DINO) & 1024 x 1024 (SAM)
Architecture: Combines Grounding DINO Tiny for open-vocabulary text-prompted bounding box detection with SAM 2.1 Hiera-Tiny for instance mask extraction.
Best For: Detecting and segmenting specific objects using natural language prompts (e.g. "cow", "leaf", "lesion"), with support for bounding-box-only detection (mask = FALSE, bbox = TRUE).
"sam2.1" (Segment Anything 2.1 by Meta AI, alias "sam2"):
Size: ~120.2 MB (Encoder + Decoder) | Input Resolution: 1024 x 1024
Architecture: Meta AI Hiera-Tiny foundation vision transformer with promptable mask decoder.
Best For: Zero-shot foundation segmentation with point prompts (pick_object = TRUE), box prompts, or center point defaults.
"sam3.1" (Segment Anything 3.1 by Meta AI, alias "sam3"):
Size: ~868.1 MB | Input Resolution: 1024 x 1024
Architecture: Meta AI Segment Anything 3.1 with real-time concept-driven segmentation.
Best For: Advanced foundation segmentation across diverse biological structures.
"birefnet-lite" (Bilateral Reference Network Lite):
Size: ~213.6 MB | Input Resolution: 1024 x 1024
Architecture: Bilateral Reference Network for High-Resolution Dichotomous Image Segmentation (BiRefNet Lite).
Best For: Extremely fine margins, hair-thin leaf serrations, complex petioles, translucent halos, and subtle lesions.
"isnet-general-use" (High Precision Boundary Matting):
Size: ~170.4 MB | Input Resolution: 1024 x 1024
Architecture: IS-Net (Intermediate Supervision Network) specialized in high-resolution boundary matting.
Best For: Plant leaves, fine serrated margins, lesion borders, chlorotic halos, veins, and complex natural backgrounds.
"rmbg-1.4" (BRIA AI Standard, alias "rmbg"):
Size: ~168.0 MB | Input Resolution: 1024 x 1024
Architecture: BRIA RMBG 1.4 trained on extensive curated foreground datasets.
Best For: General background removal under challenging lighting, shadows, reflections, and fine object edges.
"rmbg-2.0" (BRIA AI Next-Gen Model):
Size: ~976.9 MB | Input Resolution: 1024 x 1024
Architecture: BRIA RMBG 2.0 based on a BiRefNet backbone trained on extensive curated commercial datasets.
Best For: Highest-fidelity boundary matting, transparent surfaces, fine plant hairs, and complex scenes.
"withoutbg" (State-of-the-Art DepthAnythingV2 + ConvNeXt Matting):
Size: ~433.4 MB | Input Resolution: 448 x 448
Architecture: withoutBG Open Weights: DINOv3 ConvNeXt-fused U-Net guided by DepthAnythingV2 depth features.
Best For: Complex 3D depth-separated backgrounds, transparent materials, and fine details.
"silueta":
Size: ~42.1 MB | Input Resolution: 320 x 320
Architecture: Compact silhouette extraction network.
Best For: Balanced speed-accuracy tradeoff on edge/CPU hardware.
"u2net":
Size: ~167.8 MB | Input Resolution: 320 x 320
Architecture: Full-depth U2-Net salient object detection model.
Best For: Robust multi-scale salient object detection on standard resolution images.
Unlike standard Python-dependent deep learning packages, pliman executes ONNX models
natively in C++ via direct Microsoft ONNX Runtime C API dynamic bindings.
Zero Python Requirement: No Python, Conda, Virtualenv, or pip required.
Direct C++ Binding: Connects directly to Microsoft's official ONNX Runtime C++ engine (onnxruntime.dll on Windows / libonnxruntime.so on Linux / libonnxruntime.dylib on macOS).
CPU & GPU Support: Runs optimized CPU multi-threading (AVX2/AVX512) or CUDA GPU acceleration.
Downloaded .onnx model weights are stored permanently in the user's R data directory:
tools::R_user_dir("pliman", which = "data")/models
(e.g., C:/Users/<User>/AppData/Local/R/data/R/pliman/models on Windows).
This follows CRAN policy and ensures models are preserved across R session restarts
and package upgrades.
To configure everything in a single call:
library(pliman) # 1. Set up the environment (downloads ONNX Runtime C++ library & default models) pliman_configure_dl() # 2. Extract a binary mask mask <- image_binary_dl(img, model = "u2netp") # 3. Remove background with transparent alpha channel (RGBA) img_trans <- image_remove_bg_dl(img, model = "isnet-general-use") # 4. General segmentation seg <- image_segment_dl(img, model = "u2netp")
object_id() get the object identification in an image.
object_coord() get the object coordinates and (optionally) draw a
bounding rectangle around multiple objects in an image.
object_contour() returns the coordinates (x and y) for the contours
of each object in the image.
object_isolate() isolates an object from an image.
object_coord( img, id = NULL, index = "NB", watershed = TRUE, invert = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, fill_hull = FALSE, threshold = "Otsu", edge = 2, extension = NULL, tolerance = NULL, object_size = "medium", parallel = FALSE, workers = NULL, plot = TRUE, verbose = TRUE ) object_contour( img, pattern = NULL, dir_original = NULL, center = FALSE, index = "NB", invert = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, fill_hull = FALSE, smooth = FALSE, threshold = "Otsu", watershed = TRUE, extension = NULL, tolerance = NULL, object_size = "medium", parallel = FALSE, workers = NULL, plot = TRUE, verbose = TRUE ) object_isolate( img, id = NULL, parallel = FALSE, workers = NULL, verbose = TRUE, ... ) object_id(img, parallel = FALSE, workers = NULL, verbose = TRUE, ...)object_coord( img, id = NULL, index = "NB", watershed = TRUE, invert = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, fill_hull = FALSE, threshold = "Otsu", edge = 2, extension = NULL, tolerance = NULL, object_size = "medium", parallel = FALSE, workers = NULL, plot = TRUE, verbose = TRUE ) object_contour( img, pattern = NULL, dir_original = NULL, center = FALSE, index = "NB", invert = FALSE, opening = FALSE, closing = FALSE, filter = FALSE, fill_hull = FALSE, smooth = FALSE, threshold = "Otsu", watershed = TRUE, extension = NULL, tolerance = NULL, object_size = "medium", parallel = FALSE, workers = NULL, plot = TRUE, verbose = TRUE ) object_isolate( img, id = NULL, parallel = FALSE, workers = NULL, verbose = TRUE, ... ) object_id(img, parallel = FALSE, workers = NULL, verbose = TRUE, ...)
img |
An image of class |
id |
|
index |
The index to produce a binary image used to compute bounding
rectangle coordinates. See |
watershed |
If |
invert |
Inverts the binary image, if desired. Defaults to |
opening, closing, filter
|
Morphological operations (brush size)
Hierarchically, the operations are performed as opening > closing > filter. The value declared in each argument will define the brush size. |
fill_hull |
Fill holes in the objects? Defaults to |
threshold |
By default ( |
edge |
The number of pixels in the edge of the bounding rectangle.
Defaults to |
extension, tolerance, object_size
|
Controls the watershed segmentation of
objects in the image. See |
parallel |
Processes the images asynchronously (in parallel) in separate
R sessions running in the background on the same machine. It may speed up
the processing time when |
workers |
A positive numeric scalar or a function specifying the maximum number of parallel processes that can be active at the same time. |
plot |
Shows the image with bounding rectangles? Defaults to
|
verbose |
If |
pattern |
A pattern of file name used to identify images to be imported. |
dir_original |
The directory containing the original images. Defaults
to |
center |
If |
smooth |
whether the object contours should be smoothed with
|
... |
|
object_id() An image of class "Image" containing the object's
identification.
object_coord() A list with the coordinates for the bounding rectangles.
If id = "all" or a numeric vector, a list with a vector of coordinates is
returned.
object_isolate() An image of class "Image" containing the isolated
object.
if (interactive()) { library(pliman) img <- image_pliman("la_leaves.jpg") # Get the object's (leaves) identification object_id(img) # Get the coordinates and draw a bounding rectangle around leaves 1 and 3 object_coord(img, id = c(1, 3)) # Isolate leaf 3 isolated <- object_isolate(img, id = 3) plot(isolated) }if (interactive()) { library(pliman) img <- image_pliman("la_leaves.jpg") # Get the object's (leaves) identification object_id(img) # Get the coordinates and draw a bounding rectangle around leaves 1 and 3 object_coord(img, id = c(1, 3)) # Isolate leaf 3 isolated <- object_isolate(img, id = 3) plot(isolated) }
pca() Computes a Principal Component Analysis. It wrappers
stats::prcomp(), but returns more results such as data, scores,
contributions and quality of measurements for individuals and variables.
get_biplot(): Produces a biplot for an object computed with pca().
plot.pca(): Produces several types of plots, depending on the type and which
arguments.
type = "var" Produces a barplot with the contribution (which = "contrib"), qualitity of adjustment which = "cos2", and a scatter plot
with coordinates (which = "coord") for the variables.
type = "ind" Produces a barplot with the contribution (which = "contrib"), qualitity of adjustment which = "cos2", and a scatter plot
with coordinates (which = "coord") for the individuals.
type = "biplot" Produces a biplot.
pca(x, scale = TRUE) get_biplot( x, axes = c(1, 2), show = c("both"), show_ind_id = TRUE, show_unit_circle = TRUE, expand = NULL ) ## S3 method for class 'pca' plot(x, type = "var", which = "contrib", axis = 1, ...)pca(x, scale = TRUE) get_biplot( x, axes = c(1, 2), show = c("both"), show_ind_id = TRUE, show_unit_circle = TRUE, expand = NULL ) ## S3 method for class 'pca' plot(x, type = "var", which = "contrib", axis = 1, ...)
x |
|
scale |
A logical value indicating whether the variables should be
scaled to have unit variance before the analysis takes place. Defaults to
|
axes |
The principal component axes to plot. Defaults to |
show |
Which to show in the biplot. Defaults to |
show_ind_id |
Shows the labels for individuals? Defaults to |
show_unit_circle |
Shows the unit variance circle? Defaults to |
expand |
An expansion factor to apply when plotting the second set of
points relative to the first. This can be used to tweak the scaling of the
two sets to a physically comparable scale. Setting to |
type |
One of |
which |
Which measure to plot. Either |
axis |
The axist to plot the contribution/cos2. Defaults to 1. |
... |
Further arguments passed on to |
pca() returns a list including:
data: The raw data used to compute the PCA.
variances: Variances (eigenvalues), and proportion of explained
variance for each component.
center,scale: the centering and scaling used.
ind,var A list with the following objects for individuals/variables, respectively.
coord: coordinates for the individuals/variables (loadings * the
component standard deviations)
cos2: cos2 for the individuals/variables (coord^2)
contrib: The contribution (in percentage) of a variable to a given
principal component: (cos2 * 100) / (total cos2 of the component)
plot.pca() returns a list with the coordinates used.
get_biplot() returns a NULL object
library(pliman) pc <- pca(mtcars[1:10 ,1:6]) plot(pc) plot(pc, type = "ind") plot(pc, type = "var", which = "coord") plot(pc, type = "ind", which = "coord") plot(pc, type = "biplot")library(pliman) pc <- pca(mtcars[1:10 ,1:6]) plot(pc) plot(pc, type = "ind") plot(pc, type = "var", which = "coord") plot(pc, type = "ind", which = "coord") plot(pc, type = "biplot")
pick_count() opens an interactive section where the user will be able to
click in the image to count objects (points) manually. In each mouse click, a
point is drawn and an upward counter is shown in the console. After n
counts or after the user press Esc, the interactive process is terminated and
the number of counts is returned.
pick_coord() Picks coordinates from the image
pick_palette() creates an image palette by picking up color point(s)
from the image.
pick_rgb() Picks up the RGB values from selected point(s) in the image.
pick_count( img, n = Inf, col = "red", viewer = get_pliman_viewer(), external_device = FALSE, size = 0.8, plot = TRUE, verbose = TRUE ) pick_coords( img, n = Inf, col = "red", viewer = get_pliman_viewer(), external_device = FALSE, size = 0.8, verbose = TRUE ) pick_rgb( img, n = Inf, col = "red", viewer = get_pliman_viewer(), external_device = FALSE, size = 0.8, plot = TRUE, verbose = TRUE ) pick_palette( img, n = Inf, r = 2, shape = "box", viewer = get_pliman_viewer(), external_device = FALSE, show = "rgb", title = "Pick colors in the image", index = "B", random = TRUE, width = 100, height = 100, col = "red", size = 0.8, plot = TRUE, palette = TRUE, verbose = TRUE ) pick_rgb_area( img, n = Inf, r = 15, shape = "box", viewer = get_pliman_viewer(), external_device = FALSE, title = "Pick samples in the image", col = "red", size = 0.8, plot = TRUE, verbose = TRUE )pick_count( img, n = Inf, col = "red", viewer = get_pliman_viewer(), external_device = FALSE, size = 0.8, plot = TRUE, verbose = TRUE ) pick_coords( img, n = Inf, col = "red", viewer = get_pliman_viewer(), external_device = FALSE, size = 0.8, verbose = TRUE ) pick_rgb( img, n = Inf, col = "red", viewer = get_pliman_viewer(), external_device = FALSE, size = 0.8, plot = TRUE, verbose = TRUE ) pick_palette( img, n = Inf, r = 2, shape = "box", viewer = get_pliman_viewer(), external_device = FALSE, show = "rgb", title = "Pick colors in the image", index = "B", random = TRUE, width = 100, height = 100, col = "red", size = 0.8, plot = TRUE, palette = TRUE, verbose = TRUE ) pick_rgb_area( img, n = Inf, r = 15, shape = "box", viewer = get_pliman_viewer(), external_device = FALSE, title = "Pick samples in the image", col = "red", size = 0.8, plot = TRUE, verbose = TRUE )
img |
An |
n |
The number of points of the |
col, size
|
The color and size for the marker point. |
viewer |
The viewer option. If not provided, the value is retrieved
using |
external_device |
Logical. If |
plot |
Call a new |
verbose |
If |
r |
The radius of neighborhood pixels. Defaults to |
shape |
A character vector indicating the shape of the brush around the
selected pixel. It can be |
show |
How to plot in mapview viewer, either |
title |
The title of the map view when |
index |
The index to use for the index view. Defaults to 'B'. |
random |
Randomize the selected pixels? Defaults to |
width, height
|
The width and height of the generated palette. Defaults
to |
palette |
Plot the generated palette? Defaults to |
pick_count() returns data.frame with the x and y coordinates of the
selected point(x).
pick_rgb() returns a data.frame with the R, G, and B values of the
selected point(s).
pick_palette() returns an object of class image.
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") # start a counting process pick_count(img) # get rgb from point(s) pick_rgb(img) # create a palette from point(s) pick_palette(img) }if (interactive()) { library(pliman) img <- image_pliman("soybean_touch.jpg") # start a counting process pick_count(img) # get rgb from point(s) pick_rgb(img) # create a palette from point(s) pick_palette(img) }
Several useful functions for analyzing polygons. All of them are based on a set of coordinate points that describe the edge of the object(s). If a list of polygons is provided, it loops through the list and computes what is needed for each element of the list.
Polygon measures
conv_hull() Computes the convex hull of a set of points.
conv_hull_unified() Computes the convex hull of a set of points. Compared
to conv_hull(), conv_hull_unified() binds (unifies) the coordinates when
x is a list of coordinates.
poly_area() Computes the area of a polygon given by the vertices in the
vectors x and y using the Shoelace formula, as follows (Lee and Lim,
2017):
where x and y are the coordinates that form the
corners of a polygon, and n is the number of coordinates.
poly_angles() Calculates the internal angles of the polygon using the
law of cosines.
poly_lw() Returns the length and width of a polygon based on its
alignment to the y-axis (with poly_align()). The length is defined as the
range along the x-axis, and the width is defined as the range on the y-axis.
poly_mass() Computes the center of mass (centroid) of a polygon given by
the vertices in the vectors x and y using the following formulas:
where C_x and C_y are the coordinates of the center of mass, A is the
area of the polygon computed by the Shoelace formula, x and y are the
coordinates that form the corners of the polygon, and n is the number of
coordinates.
poly_solidity() Computes the solidity of a shape as the ratio of
the shape area and the convex hull area.
Perimeter measures
poly_slide() Slides the coordinates of a polygon given by the vertices
in the vectors x and y so that the id-th point becomes the first one.
poly_distpts() Computes the Euclidean distance between every point
of a polygon given by the vertices in the vectors x and y.
poly_centdist() Computes the Euclidean distance between every point on
the perimeter and the centroid of the object.
poly_centdist_mass() Computes the Euclidean distance between every point on
the perimeter and the center of mass of the object.
poly_perimeter() Computes the perimeter of a polygon given by the
vertices in the vectors x and y.
poly_caliper() Computes the caliper (also called the Feret's diameter)
of a polygon given by the vertices in the vectors x and y.
Circularity measures (Montero et al. 2009).
poly_circularity() computes the circularity (C), also called shape
compactness or roundness measure, of an object. It is given by C = P^2 / A,
where P is the perimeter and A is the area of the object.
poly_circularity_norm() computes the normalized circularity (Cn), which
is unity for a circle. This measure is invariant under translation,
rotation, scaling transformations, and is dimensionless. It is given by:
Cn = P^2 / 4*pi*A.
poly_circularity_haralick() computes Haralick's circularity (CH). The
method is based on computing all Euclidean distances from the object
centroid to each boundary pixel. With this set of distances, the mean (m)
and the standard deviation (sd) are computed. These statistical parameters
are used to calculate the circularity, CH, of a shape as CH = m/sd.
poly_convexity() computes the convexity of a shape using the ratio
between the perimeter of the convex hull and the perimeter of the polygon.
poly_eccentricity() computes the eccentricity of a shape using the
ratio of the eigenvalues (inertia axes of coordinates).
poly_elongation() computes the elongation of a shape as 1 - width / length.
Utilities for polygons
poly_check() Checks a set of coordinate points and returns a matrix
with x and y columns.
poly_is_closed() Returns a logical value indicating if a polygon is
closed.
poly_close() and poly_unclose() close and unclose a polygon,
respectively.
poly_rotate() Rotates the polygon coordinates by an angle (0-360
degrees) in the counterclockwise direction.
poly_flip_x(), poly_flip_y() flip shapes along the x-axis and y-axis,
respectively.
poly_align() Aligns the coordinates along their longer axis using the
var-cov matrix and eigen values.
poly_center() Centers the coordinates on the origin.
poly_sample() Samples n coordinates from existing points. Defaults
to 50.
poly_sample_prop() Samples a proportion of coordinates from existing
points. Defaults to 0.1.
poly_spline() Interpolates the polygon contour.
poly_smooth() Smooths the polygon contour using a simple moving average.
poly_jitter() Adds a small amount of noise to a set of point
coordinates. See base::jitter() for more details.
poly_measures() Is a wrapper around the poly_*() functions.
poly_check(x) poly_is_closed(x) poly_close(x) poly_unclose(x) poly_angles(x) poly_limits(x) conv_hull(x) conv_hull_unified(x) poly_area(x) poly_slide(x, fp = 1) poly_distpts(x) poly_centdist(x) poly_centdist_mass(x) poly_perimeter(x) poly_rotate(x, angle, plot = TRUE) poly_align(x, plot = TRUE) poly_center(x, plot = TRUE) poly_lw(x) poly_eccentricity(x) poly_convexity(x) poly_caliper(x) poly_elongation(x) poly_solidity(x) poly_flip_y(x) poly_flip_x(x) poly_sample(x, n = 50) poly_sample_prop(x, prop = 0.1) poly_jitter(x, noise_x = 1, noise_y = 1, plot = TRUE) poly_circularity(x) poly_circularity_norm(x) poly_circularity_haralick(x) poly_mass(x) poly_spline(x, vertices = 100, k = 2) poly_smooth(x, niter = 10, n = NULL, prop = NULL, plot = TRUE) poly_measures(x)poly_check(x) poly_is_closed(x) poly_close(x) poly_unclose(x) poly_angles(x) poly_limits(x) conv_hull(x) conv_hull_unified(x) poly_area(x) poly_slide(x, fp = 1) poly_distpts(x) poly_centdist(x) poly_centdist_mass(x) poly_perimeter(x) poly_rotate(x, angle, plot = TRUE) poly_align(x, plot = TRUE) poly_center(x, plot = TRUE) poly_lw(x) poly_eccentricity(x) poly_convexity(x) poly_caliper(x) poly_elongation(x) poly_solidity(x) poly_flip_y(x) poly_flip_x(x) poly_sample(x, n = 50) poly_sample_prop(x, prop = 0.1) poly_jitter(x, noise_x = 1, noise_y = 1, plot = TRUE) poly_circularity(x) poly_circularity_norm(x) poly_circularity_haralick(x) poly_mass(x) poly_spline(x, vertices = 100, k = 2) poly_smooth(x, niter = 10, n = NULL, prop = NULL, plot = TRUE) poly_measures(x)
x |
A 2-column matrix with the |
fp |
The ID of the point that will become the new first point. Defaults to 1. |
angle |
The angle (0-360) to rotate the object. |
plot |
Should the object be plotted? Defaults to |
n, prop
|
The number and proportion of coordinates to sample from the
perimeter coordinates. In |
noise_x, noise_y
|
A numeric factor to define the noise added to the |
vertices |
The number of spline vertices to create. |
k |
The number of points to wrap around the ends to obtain a smooth periodic spline. |
niter |
An integer indicating the number of smoothing iterations. |
conv_hull() and poly_spline() returns a matrix with x and y
coordinates for the convex hull/smooth line in clockwise order. If x is a
list, a list of points is returned.
poly_area() returns a double, or a numeric vector if x is a list of
vector points.
poly_mass() returns a data.frame containing the coordinates for the
center of mass, as well as for the maximum and minimum distance from contour
to the center of mass.
poly_slides(), poly_distpts(), poly_spline(), poly_close(),
poly_unclose(), poly_rotate(), poly_jitter(), poly_sample(),
poly_sample_prop(), and poly_measures returns a data.frame.
poly_perimeter(), poly_lw(), poly_eccentricity(),
poly_convexity(), poly_caliper(), poly_elongation(),
poly_circularity_norm(), poly_circularity_haralick() returns a double.
Lee, Y., & Lim, W. (2017). Shoelace Formula: Connecting the Area of a Polygon and the Vector Cross Product. The Mathematics Teacher, 110(8), 631–636. doi:10.5951/mathteacher.110.8.0631
Montero, R. S., Bribiesca, E., Santiago, R., & Bribiesca, E. (2009). State of the Art of Compactness and Circularity Measures. International Mathematical Forum, 4(27), 1305–1335.
Chen, C.H., and P.S.P. Wang. 2005. Handbook of Pattern Recognition and Computer Vision. 3rd ed. World Scientific.
if (interactive()) { library(pliman) # A 2 x 2 square df <- draw_square(side = 2) # square area poly_area(df) # polygon perimeter poly_perimeter(df) # center of mass of the square cm <- poly_mass(df) plot_mass(cm) # The convex hull will be the vertices of the square (conv_square <- conv_hull(df) |> poly_close()) plot_contour(conv_square, col = "blue", lwd = 6) poly_area(conv_square) ################### Example with a polygon ################## x <- c(0, 1, 2, 3, 5, 2, -1, 0, 0) y <- c(5, 6.5, 7, 3, 1, 1, 0, 2, 5) df_poly <- cbind(x, y) # area of the polygon plot_polygon(df_poly, fill = "red") poly_area(df_poly) # perimeter of the polygon poly_perimeter(df_poly) # center of mass of polygon cm <- poly_mass(df_poly) plot_mass(cm, col = "blue") # vertices of the convex hull (conv_poly <- conv_hull(df_poly)) # area of the convex hull poly_area(conv_poly) plot_polygon(conv_poly, fill = "red", alpha = 0.2, add = TRUE) ############ example of circularity measures ################ tri <- draw_circle(n = 200, plot = FALSE) plot_polygon(tri, aspect_ratio = 1) poly_circularity_norm(tri) set.seed(1) tri2 <- draw_circle(n = 200, plot = FALSE) |> poly_jitter(noise_x = 100, noise_y = 100, plot = FALSE) plot_polygon(tri2, aspect_ratio = 1) poly_circularity_norm(tri2) }if (interactive()) { library(pliman) # A 2 x 2 square df <- draw_square(side = 2) # square area poly_area(df) # polygon perimeter poly_perimeter(df) # center of mass of the square cm <- poly_mass(df) plot_mass(cm) # The convex hull will be the vertices of the square (conv_square <- conv_hull(df) |> poly_close()) plot_contour(conv_square, col = "blue", lwd = 6) poly_area(conv_square) ################### Example with a polygon ################## x <- c(0, 1, 2, 3, 5, 2, -1, 0, 0) y <- c(5, 6.5, 7, 3, 1, 1, 0, 2, 5) df_poly <- cbind(x, y) # area of the polygon plot_polygon(df_poly, fill = "red") poly_area(df_poly) # perimeter of the polygon poly_perimeter(df_poly) # center of mass of polygon cm <- poly_mass(df_poly) plot_mass(cm, col = "blue") # vertices of the convex hull (conv_poly <- conv_hull(df_poly)) # area of the convex hull poly_area(conv_poly) plot_polygon(conv_poly, fill = "red", alpha = 0.2, add = TRUE) ############ example of circularity measures ################ tri <- draw_circle(n = 200, plot = FALSE) plot_polygon(tri, aspect_ratio = 1) poly_circularity_norm(tri) set.seed(1) tri2 <- draw_circle(n = 200, plot = FALSE) |> poly_jitter(noise_x = 100, noise_y = 100, plot = FALSE) plot_polygon(tri2, aspect_ratio = 1) poly_circularity_norm(tri2) }
plot_contour() Plot contour lines.
plot_polygon() Plots a polygon describing the objects.
plot_mass() Plots the center of mass along with maximum and minimum
radius.
plot_ellipse() Plots an ellipse that fits the major and minor axis for
each object.
plot_contour(x, id = NULL, col = "black", lwd = 1, ...) plot_polygon( x, fill = "gray", random_fill = TRUE, points = FALSE, merge = TRUE, border = "black", alpha = 1, add = FALSE, nrow = NULL, ncol = NULL, aspect_ratio = 1, show_id = TRUE, xlim = NULL, ylim = NULL, ... ) plot_mass(x, id = NULL, col = "black", cex = 1, lwd = 1) plot_ellipse(object, id = NULL, col = "black", lwd = 1)plot_contour(x, id = NULL, col = "black", lwd = 1, ...) plot_polygon( x, fill = "gray", random_fill = TRUE, points = FALSE, merge = TRUE, border = "black", alpha = 1, add = FALSE, nrow = NULL, ncol = NULL, aspect_ratio = 1, show_id = TRUE, xlim = NULL, ylim = NULL, ... ) plot_mass(x, id = NULL, col = "black", cex = 1, lwd = 1) plot_ellipse(object, id = NULL, col = "black", lwd = 1)
x |
A 2-column matrix with the |
id |
The object identification (numeric) to plot the contour/ellipse. By
default ( |
col, lwd, cex
|
The color, width of the lines, and size of point, respectively. |
... |
|
fill, border, alpha
|
The color to fill the polygon, the color of the polygon's border, and the alpha transparency (1 opaque, 0 transparent). |
random_fill |
Fill multiple objects with random colors? Defaults to
|
points |
Plot the points? Defaults to |
merge |
Merge multiple objects into a single plot? Defaults to |
add |
Add the current plot to a previous one? Defaults to |
nrow, ncol
|
The number of rows and columns to use in the composite
image. Defaults to |
aspect_ratio |
The x/y aspect ratio. Defaults to |
show_id |
Shows the object id? Defaults to |
xlim, ylim
|
A numeric vector of length 2 (min; max) indicating the range
of |
object |
An object computed with |
a NULL object.
plot_polygon(contours) plot_contour(contours[[1]], id = 6, col = "red", lwd = 3)plot_polygon(contours) plot_contour(contours[[1]], id = 6, col = "red", lwd = 3)
columns_to_rownames(): Move a column of .data to its row
names.
rownames_to_column(): Move the row names of .data to a new
column.
remove_rownames(): Remove the row names of .data.
round_cols() Rounds the values of all numeric variables to the specified
number of decimal places (default 2).
column_to_rownames(.data, var = "rowname") rownames_to_column(.data, var = "rowname") remove_rownames(.data) round_cols(.data, digits = 2)column_to_rownames(.data, var = "rowname") rownames_to_column(.data, var = "rowname") remove_rownames(.data) round_cols(.data, digits = 2)
.data |
A data frame |
var |
Name of column to use for rownames. |
digits |
The number of significant figures. Defaults to |
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) iris2 <- iris |> rownames_to_column() head(iris2) iris2$rowname <- paste0("r", iris2$rowname) iris2 |> column_to_rownames("rowname") |> head() }if (interactive()) { library(pliman) iris2 <- iris |> rownames_to_column() head(iris2) iris2$rowname <- paste0("r", iris2$rowname) iris2 |> column_to_rownames("rowname") |> head() }
shapefile_input() creates or imports a shapefile and optionally converts
it to an sf object. It can also cast POLYGON or MULTIPOLYGON geometries
to MULTILINESTRING if required.
shapefile_export() exports an object (sf or SpatVector) to a file.
shapefile_view() is a simple wrapper around mapview() to plot a shapefile.
shapefile_input( shapefile, info = TRUE, as_sf = TRUE, multilinestring = FALSE, make_valid = FALSE, ... ) shapefile_export(shapefile, filename, ...) shapefile_view( shapefile, attribute = NULL, type = c("shape", "centroid"), color_regions = custom_palette(c("red", "yellow", "forestgreen")), ... )shapefile_input( shapefile, info = TRUE, as_sf = TRUE, multilinestring = FALSE, make_valid = FALSE, ... ) shapefile_export(shapefile, filename, ...) shapefile_view( shapefile, attribute = NULL, type = c("shape", "centroid"), color_regions = custom_palette(c("red", "yellow", "forestgreen")), ... )
shapefile |
For For |
info |
Logical value indicating whether to print information about the
imported shapefile (default is |
as_sf |
Logical value indicating whether to convert the imported
shapefile to an |
multilinestring |
Logical value indicating whether to cast polygon geometries
to |
make_valid |
If |
... |
Additional arguments to be passed to |
filename |
The path to the output shapefile. |
attribute |
The attribute to be shown in the color key. It must be a
variable present in |
type |
A character string specifying whether to visualize the shapefile
as |
color_regions |
The color palette to represent |
shapefile_input() returns an object of class sf (default) representing
the imported shapefile.
shapefile_export() returns a NULL object.
shapefile_view() returns an object of class mapview.
if(interactive()){ library(pliman) shp <- system.file("ex/lux.shp", package="terra") shp_file <- shapefile_input(shp, as_sf = FALSE) shapefile_view(shp_file) }if(interactive()){ library(pliman) shp <- system.file("ex/lux.shp", package="terra") shp_file <- shapefile_input(shp, as_sf = FALSE) shapefile_view(shp_file) }
The functions computes the coordinates of common shapes such as squares triangles, rectangles and circles.
draw_circle() Draws a perfect circle with a desired radius.
draw_square() Draws a square with a desired side.
draw_rectangle() Draws a rectangle given two desired sides.
draw_trian_equi() Draws an equilateral triangle with a desired side.
draw_trian_rect() Draws a triangle rectangle given two cathetus.
draw_n_tagon() Draws polygons with n sides
draw_circle(radius = 1, n = 1000, plot = TRUE) draw_square(side = 2, plot = TRUE) draw_rectangle(side1 = 2, side2 = 3, plot = TRUE) draw_trian_equi(side = 2, plot = TRUE) draw_trian_rect(cat1 = 1, cat2 = 2, plot = TRUE) draw_n_tagon(n, plot = TRUE)draw_circle(radius = 1, n = 1000, plot = TRUE) draw_square(side = 2, plot = TRUE) draw_rectangle(side1 = 2, side2 = 3, plot = TRUE) draw_trian_equi(side = 2, plot = TRUE) draw_trian_rect(cat1 = 1, cat2 = 2, plot = TRUE) draw_n_tagon(n, plot = TRUE)
radius |
The radius of the circle. Defaults to |
n |
The number of sides in the |
plot |
Plots the result? Defaults to |
side |
The side of the square/equilateral triangle. Defaults to |
side1, side2
|
The first and second sides of the rectangle. Defaults to
|
cat1, cat2
|
The first and second cathetus of the right triangle.
Defaults to |
A data frame with the x and y coordinates
########## An example of a circle ########## library(pliman) radius <- 3 circ <- draw_circle(radius = radius) # area pi * radius ^ 2 poly_area(circ) # perimeter 2 * pi * radius poly_perimeter(circ) ############ An example of a square ############ side <- 2 (square <- draw_square(side = side)) # area side ^ 2 poly_area(square) # perimeter side * 4 poly_perimeter(square) ############ An example of a rectangle ############ side1 <- 2 side2 <- 3 (rect <- draw_rectangle()) # area poly_area(rect) # perimeter poly_perimeter(rect) ########### An example of an equilateral triangle ######### side <- 1 # defaults (trig <- draw_trian_equi(side = side)) ### area (b*h / 2) # height of the triangle (h <- (side * sqrt(3)) / 2) side * h / 2 poly_area(trig) ### perimeter (side * 3) poly_perimeter(trig) ########### An example of a rectangle triangle ########## cat1 <- 2 cat2 <- 3 (df <- draw_trian_rect(cat1, cat2)) # area (cat1 * cat2) / 2 poly_area(df) # perimeter cat1 + cat2 + sqrt(cat1^2 + cat2^2) poly_perimeter(df) ############ An creating shapes with n sides ############ side <- 2 (square <- draw_square(side = side)) # area side ^ 2 poly_area(square) # perimeter side * 4 poly_perimeter(square)########## An example of a circle ########## library(pliman) radius <- 3 circ <- draw_circle(radius = radius) # area pi * radius ^ 2 poly_area(circ) # perimeter 2 * pi * radius poly_perimeter(circ) ############ An example of a square ############ side <- 2 (square <- draw_square(side = side)) # area side ^ 2 poly_area(square) # perimeter side * 4 poly_perimeter(square) ############ An example of a rectangle ############ side1 <- 2 side2 <- 3 (rect <- draw_rectangle()) # area poly_area(rect) # perimeter poly_perimeter(rect) ########### An example of an equilateral triangle ######### side <- 1 # defaults (trig <- draw_trian_equi(side = side)) ### area (b*h / 2) # height of the triangle (h <- (side * sqrt(3)) / 2) side * h / 2 poly_area(trig) ### perimeter (side * 3) poly_perimeter(trig) ########### An example of a rectangle triangle ########## cat1 <- 2 cat2 <- 3 (df <- draw_trian_rect(cat1, cat2)) # area (cat1 * cat2) / 2 poly_area(df) # perimeter cat1 + cat2 + sqrt(cat1^2 + cat2^2) poly_perimeter(df) ############ An creating shapes with n sides ############ side <- 2 (square <- draw_square(side = side)) # area side ^ 2 poly_area(square) # perimeter side * 4 poly_perimeter(square)
These functions applies common statistics to a list of objects, returning a numeric vector.
mean_list(x, ...) sd_list(x, ...) max_list(x, ...) min_list(x, ...)mean_list(x, ...) sd_list(x, ...) max_list(x, ...) min_list(x, ...)
x |
A data.frame or matrix with numeric values. |
... |
Further arguments passed on to the R base function (e.g, mean(), sd(), etc.) |
A numeric vector.
mean_list(list(a = 1:10, b = 2:20))mean_list(list(a = 1:10, b = 2:20))
Performs image rotation and reflection
image autocrop() Crops automatically an image to the area of objects.
image_crop() Crops an image to the desired area.
image_trim() Remove pixels from the edges of an image (20 by default).
image_dimension() Gives the dimension (width and height) of an image.
image_rotate() Rotates the image clockwise by the given angle.
image_horizontal() Converts (if needed) an image to a horizontal image.
image_vertical() Converts (if needed) an image to a vertical image.
image_hreflect() Performs horizontal reflection of the image.
image_vreflect() Performs vertical reflection of the image.
image_resize() Resize the image. See more at image_resize().
image_contrast() Improve contrast locally by performing adaptive
histogram equalization.
image_dilate() Performs image dilatation.
image_erode() Performs image erosion.
image_opening() Performs an erosion followed by a dilation.
image_closing() Performs a dilation followed by an erosion.
image_filter() Performs median filtering in constant time.
image_blur() Performs blurring filter of images.
image_skeleton() Performs image skeletonization.
Performs morphological erosion of a binary image.
Performs morphological dilation of a binary image.
Fills internal holes in a binary image.
Performs morphological opening of a binary image (erosion followed by dilation).
When return_exact = TRUE, morphological reconstruction via watershed-partitioned seed matching is performed.
This isolates noise touching large objects into separate watershed labels, identifies surviving labels using the un-dilated eroded marker,
and restores 100% of the exact original boundaries and shapes of surviving objects without rounding corners or eroding tips.
Removes small noise objects from a binary image without altering or eroding
the boundaries of larger objects. Filtering can be based on an absolute pixel count (min_size)
or a relative fraction of the mean object area (rel_size, e.g. 0.1 for objects smaller than 10% of average object area).
Performs morphological closing of a binary image. Closing is defined as a dilation followed by an erosion. It is useful for filling small holes or connecting nearby objects.
image_autocrop( img, index = "NB", edge = 5, opening = FALSE, closing = FALSE, filter = FALSE, invert = FALSE, threshold = "Otsu", parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_crop( img, width = NULL, height = NULL, viewer = get_pliman_viewer(), downsample = NULL, max_pixels = 1e+06, show = "rgb", parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_dimension(img, parallel = FALSE, workers = NULL, verbose = TRUE) image_rotate( img, angle, bg_col = "white", bg_color = NULL, parallel = FALSE, workers = NULL, verbose = TRUE, plot = TRUE ) image_horizontal( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_vertical( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_hreflect( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_vreflect( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_trim( img, edge = NULL, top = NULL, bottom = NULL, left = NULL, right = NULL, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_skeleton( img, kern = NULL, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE, ... ) image_thinning( img, niter = 3, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE, ... ) image_filter( img, size = 2, cache = 512, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_blur( img, sigma = 3, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_contrast( img, nx = 8, ny = 8, clip_limit = 3, bins = 256, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_erode( img, size = NULL, shape = "disc", external = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_dilate( img, size = NULL, shape = "disc", parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_fill_hull( img, max_size = NULL, min_neck_dist = 0, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_opening( img, size = NULL, shape = "disc", external = FALSE, return_exact = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_remove_small( img, min_size = NULL, rel_size = NULL, watershed = TRUE, plot = FALSE ) image_closing( img, size = NULL, shape = "disc", external = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE )image_autocrop( img, index = "NB", edge = 5, opening = FALSE, closing = FALSE, filter = FALSE, invert = FALSE, threshold = "Otsu", parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_crop( img, width = NULL, height = NULL, viewer = get_pliman_viewer(), downsample = NULL, max_pixels = 1e+06, show = "rgb", parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_dimension(img, parallel = FALSE, workers = NULL, verbose = TRUE) image_rotate( img, angle, bg_col = "white", bg_color = NULL, parallel = FALSE, workers = NULL, verbose = TRUE, plot = TRUE ) image_horizontal( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_vertical( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_hreflect( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_vreflect( img, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_trim( img, edge = NULL, top = NULL, bottom = NULL, left = NULL, right = NULL, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_skeleton( img, kern = NULL, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE, ... ) image_thinning( img, niter = 3, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE, ... ) image_filter( img, size = 2, cache = 512, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_blur( img, sigma = 3, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_contrast( img, nx = 8, ny = 8, clip_limit = 3, bins = 256, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_erode( img, size = NULL, shape = "disc", external = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_dilate( img, size = NULL, shape = "disc", parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_fill_hull( img, max_size = NULL, min_neck_dist = 0, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_opening( img, size = NULL, shape = "disc", external = FALSE, return_exact = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE ) image_remove_small( img, min_size = NULL, rel_size = NULL, watershed = TRUE, plot = FALSE ) image_closing( img, size = NULL, shape = "disc", external = FALSE, parallel = FALSE, workers = NULL, verbose = TRUE, plot = FALSE )
img |
An |
index |
The index to segment the image. See |
edge |
|
opening, closing, filter
|
Morphological operations (brush size)
Hierarchically, the operations are performed as opening > closing > filter. The value declared in each argument will define the brush size. |
invert |
Inverts the binary image if desired. |
threshold |
The threshold method ( |
parallel |
Logical. If |
workers |
Number of parallel workers. If |
verbose |
Logical. If |
plot |
Logical. If |
width, height
|
|
viewer |
The viewer option. If not provided, the value is retrieved
using |
downsample |
integer; for each dimension the number of
pixels/lines/bands etc that will be skipped; Defaults to |
max_pixels |
integer > 0. Maximum number of cells to use for the plot.
If |
show |
How to plot in mapview viewer, either |
angle |
The rotation angle in degrees. |
bg_col, bg_color
|
Color used to fill the background pixels, defaults to |
top, bottom, left, right
|
The number of pixels removed from |
kern |
An |
... |
Additional arguments passed on to |
niter |
The number of iterations to perform in the thinning procedure.
Defaults to 3. Set to |
size |
The size of the structuring element (radius in pixels). Default is |
cache |
The the L2 cache size of the system CPU in kB (integer).
Defaults to |
sigma |
A numeric denoting the standard deviation of the Gaussian filter
used for blurring. Defaults to |
nx |
Number of contextual regions in the x-direction (tile grid) for CLAHE contrast enhancement. Defaults to 8. |
ny |
Number of contextual regions in the y-direction (tile grid) for CLAHE contrast enhancement. Defaults to 8. |
clip_limit |
Normalized contrast limit value for CLAHE contrast enhancement. Defaults to 3. |
bins |
Number of histogram bins used for CLAHE contrast enhancement. Defaults to 256. |
shape |
A character string specifying the shape of the structuring element.
Either |
external |
Logical. If |
max_size |
Maximum size of holes to fill (in pixels). Default is |
min_neck_dist |
Minimum neck distance threshold for hole filling. Default is |
return_exact |
Logical. If |
min_size |
Minimum area (in pixels) for an object to be retained. |
rel_size |
Relative threshold as a fraction of the mean object area (e.g. |
watershed |
Logical. Default |
image_skeleton() returns a binary image object.
All other functions returns a modified version of image depending on the
image_*() function used.
If image is a list, a list of the same length will be returned.
A binary image object or a list of image objects.
A binary image object or a list of image objects.
A binary image object or a list of image objects.
A binary image object or a list of image objects.
A binary image object or a list of binary image objects.
A binary image object or a list of image objects.
Tiago Olivoto [email protected]
if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") plot(img) img <- image_resize(img, 50) img1 <- image_rotate(img, 45) img2 <- image_hreflect(img) img3 <- image_vreflect(img) img4 <- image_vertical(img) image_combine(img1, img2, img3, img4) }if (interactive()) { library(pliman) img <- image_pliman("sev_leaf.jpg") plot(img) img <- image_resize(img, 50) img1 <- image_rotate(img, 45) img2 <- image_hreflect(img) img3 <- image_vreflect(img) img4 <- image_vertical(img) image_combine(img1, img2, img3, img4) }
get_wd_here() gets the working directory to the path of the current script.
set_wd_here() sets the working directory to the path of the current script.
open_wd_here() Open the File Explorer at the directory path of the current script.
open_wd() Open the File Explorer at the current working directory.
set_wd_here(path = NULL) get_wd_here(path = NULL) open_wd_here(path = get_wd_here()) open_wd(path = getwd())set_wd_here(path = NULL) get_wd_here(path = NULL) open_wd_here(path = get_wd_here()) open_wd(path = getwd())
path |
Path components below the project root. Defaults to |
get_wd_here() returns a full-path directory name.
get_wd_here() returns a message showing the current working directory.
open_wd_here() Opens the File Explorer of the path returned by get_wd_here().
if (interactive()) { get_wd_here() set_wd_here() open_wd_here() }if (interactive()) { get_wd_here() set_wd_here() open_wd_here() }
This function generates one or more UUIDs (Universally Unique Identifiers).
By default, it generates Version 7 UUIDs, which are time-ordered and suitable
for use cases requiring efficient indexing and sorting by creation time.
Alternatively, random Version 4 UUIDs can be generated by setting usetime = FALSE.
uuid(n = 1, uppercase = FALSE, usetime = FALSE)uuid(n = 1, uppercase = FALSE, usetime = FALSE)
n |
Integer. Number of UUIDs to generate. Default is |
uppercase |
Logical. If |
usetime |
Logical. If |
Version 7 UUIDs: These are time-ordered UUIDs based on the current timestamp in milliseconds
since the Unix epoch (1970-01-01 00:00:00 UTC). They are ideal for scenarios requiring
chronological sorting or indexing.
Version 4 UUIDs: These are randomly generated UUIDs that do not depend on time, ensuring uniqueness through random hexadecimal values.
A character vector of UUIDs of length n.
library(pliman) # Generate a single UUID uuid() # Generate 5 UUIDs in uppercase uuid(n = 3, uppercase = TRUE) # Generate two random UUIDs uuid(n = 2, usetime = FALSE)library(pliman) # Generate a single UUID uuid() # Generate 5 UUIDs in uppercase uuid(n = 3, uppercase = TRUE) # Generate two random UUIDs uuid(n = 2, usetime = FALSE)
Performs real-time object detection and tracking on video files (.mp4, .avi, .mov)
or live camera feeds (webcam) using YOLO models via native C++ ONNX Runtime with
zero Python dependencies. When return_data = TRUE, it computes an extensive ecological
and temporal community profile (richness, abundance, Shannon diversity, Simpson index,
Pielou evenness, species accumulation curves, and class persistence rates).
video_detect_dl( video = 0, model = "yolo26n", conf_threshold = 0.25, iou_threshold = 0.45, labels = NULL, classes = NULL, detect = TRUE, output = NULL, save_video = !is.null(output), return_data = TRUE, track = FALSE, trail = TRUE, cex = 1, pad = 1, badge = TRUE, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, text_size = 1, count_line = NULL, count_line_label = NULL, roi = NULL, roi_mode = c("crop", "filter"), roi_label = "ROI / MONITORED ZONE", hide_outside_roi = TRUE, hide_counted = TRUE, flash_counted = TRUE, fullscreen = FALSE, window_size = NULL, window_scale = 1, resolution = NULL, crop = NULL, backend = c("native", "auto"), skeleton = TRUE, kpt_threshold = 0.3, kpt_radius = 4, bbox = TRUE, mask = TRUE, alpha = 0.4, show = NULL, show_fps = TRUE, hud_pos = c("top-right", "top-left", "bottom-left", "bottom-right", "top", "bottom"), hud_layout = c("vertical", "horizontal"), infer_every = 1L, max_frames = NULL, fps = NULL, col = NULL, lwd = 2, rainbow = TRUE, engine = c("gpu", "cpu"), device_id = -1, threads = 0, dir = pliman_model_dir(), verbose = TRUE, ... ) video_detect( video = 0, model = "yolo26n", conf_threshold = 0.25, iou_threshold = 0.45, labels = NULL, classes = NULL, detect = TRUE, output = NULL, save_video = !is.null(output), return_data = TRUE, track = FALSE, trail = TRUE, cex = 1, pad = 1, badge = TRUE, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, text_size = 1, count_line = NULL, count_line_label = NULL, roi = NULL, roi_mode = c("crop", "filter"), roi_label = "ROI / MONITORED ZONE", hide_outside_roi = TRUE, hide_counted = TRUE, flash_counted = TRUE, fullscreen = FALSE, window_size = NULL, window_scale = 1, resolution = NULL, crop = NULL, backend = c("native", "auto"), skeleton = TRUE, kpt_threshold = 0.3, kpt_radius = 4, bbox = TRUE, mask = TRUE, alpha = 0.4, show = NULL, show_fps = TRUE, hud_pos = c("top-right", "top-left", "bottom-left", "bottom-right", "top", "bottom"), hud_layout = c("vertical", "horizontal"), infer_every = 1L, max_frames = NULL, fps = NULL, col = NULL, lwd = 2, rainbow = TRUE, engine = c("gpu", "cpu"), device_id = -1, threads = 0, dir = pliman_model_dir(), verbose = TRUE, ... )video_detect_dl( video = 0, model = "yolo26n", conf_threshold = 0.25, iou_threshold = 0.45, labels = NULL, classes = NULL, detect = TRUE, output = NULL, save_video = !is.null(output), return_data = TRUE, track = FALSE, trail = TRUE, cex = 1, pad = 1, badge = TRUE, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, text_size = 1, count_line = NULL, count_line_label = NULL, roi = NULL, roi_mode = c("crop", "filter"), roi_label = "ROI / MONITORED ZONE", hide_outside_roi = TRUE, hide_counted = TRUE, flash_counted = TRUE, fullscreen = FALSE, window_size = NULL, window_scale = 1, resolution = NULL, crop = NULL, backend = c("native", "auto"), skeleton = TRUE, kpt_threshold = 0.3, kpt_radius = 4, bbox = TRUE, mask = TRUE, alpha = 0.4, show = NULL, show_fps = TRUE, hud_pos = c("top-right", "top-left", "bottom-left", "bottom-right", "top", "bottom"), hud_layout = c("vertical", "horizontal"), infer_every = 1L, max_frames = NULL, fps = NULL, col = NULL, lwd = 2, rainbow = TRUE, engine = c("gpu", "cpu"), device_id = -1, threads = 0, dir = pliman_model_dir(), verbose = TRUE, ... ) video_detect( video = 0, model = "yolo26n", conf_threshold = 0.25, iou_threshold = 0.45, labels = NULL, classes = NULL, detect = TRUE, output = NULL, save_video = !is.null(output), return_data = TRUE, track = FALSE, trail = TRUE, cex = 1, pad = 1, badge = TRUE, show_text = TRUE, show_conf = TRUE, show_class = TRUE, show_id = FALSE, text_size = 1, count_line = NULL, count_line_label = NULL, roi = NULL, roi_mode = c("crop", "filter"), roi_label = "ROI / MONITORED ZONE", hide_outside_roi = TRUE, hide_counted = TRUE, flash_counted = TRUE, fullscreen = FALSE, window_size = NULL, window_scale = 1, resolution = NULL, crop = NULL, backend = c("native", "auto"), skeleton = TRUE, kpt_threshold = 0.3, kpt_radius = 4, bbox = TRUE, mask = TRUE, alpha = 0.4, show = NULL, show_fps = TRUE, hud_pos = c("top-right", "top-left", "bottom-left", "bottom-right", "top", "bottom"), hud_layout = c("vertical", "horizontal"), infer_every = 1L, max_frames = NULL, fps = NULL, col = NULL, lwd = 2, rainbow = TRUE, engine = c("gpu", "cpu"), device_id = -1, threads = 0, dir = pliman_model_dir(), verbose = TRUE, ... )
video |
Input video source. Either a camera index (e.g. |
model |
Model name or path to a custom ONNX file. Defaults to |
conf_threshold |
Minimum confidence threshold for candidate detections (default 0.25). |
iou_threshold |
IoU threshold for Non-Maximum Suppression (default 0.45). |
labels |
Optional character vector of class names. If |
classes |
Optional character vector of specific class names to filter and retain. If specified, only detections matching these classes will be kept. |
detect |
Logical. Whether to run object detection model inference. If |
output |
Optional output file path (e.g. |
save_video |
Logical. Whether to save the processed video. Automatically |
return_data |
Logical. Whether to compute and return the detection dataset and ecological summary statistics (default |
track |
Logical. Whether to enable multi-object tracking and assign persistent IDs ( |
trail |
Logical. Whether to draw historical trajectory motion trail lines behind tracked objects when |
cex |
Size factor for label text (default |
pad |
Padding multiplier controlling the area/background badge size around label text (default |
badge |
Logical. Whether to draw a solid background badge behind label text (default |
show_text |
Logical. Whether to display text badges above bounding boxes (default |
show_conf |
Logical. Whether to display confidence scores in badges (default |
show_class |
Logical. Whether to display class label names in badges (default |
show_id |
Logical. Whether to display persistent tracking IDs ( |
text_size |
Numeric font scale for bounding box text labels and badges (alias for |
count_line |
Optional counting tripwire line specified as |
count_line_label |
Optional label displayed along the counting line (default |
roi |
Optional Region of Interest coordinates |
roi_mode |
Either |
roi_label |
Label displayed on the ROI box (default |
hide_outside_roi |
Logical. Whether to remove / suppress bounding boxes and visual annotations for objects outside the ROI zone. Defaults to |
hide_counted |
Logical. Whether to remove / suppress bounding boxes for objects that have already crossed the virtual counting line. Defaults to |
flash_counted |
Logical. Whether to show a brief neon green confirmation flash (~12 frames) when an object crosses the counting line before removing its bounding box. Defaults to |
fullscreen |
Logical. Whether to display the video feed in full screen mode (default |
window_size |
Optional numeric vector |
window_scale |
Scaling factor for the display window (default 1.0). |
resolution |
Optional camera capture resolution as a numeric vector |
crop |
Optional frame cropping. Set to |
backend |
Camera and display backend: |
skeleton |
Logical. Whether to render the 17-keypoint anatomical skeleton when running pose estimation models (e.g. |
kpt_threshold |
Minimum confidence threshold for rendering individual keypoints and skeleton limbs (default 0.3). |
kpt_radius |
Integer radius of keypoint joint markers in pixels (default 4). |
bbox |
Logical. Whether to render bounding boxes around detected objects or people (default |
mask |
Logical. Whether to render semi-transparent instance segmentation masks when using segmentation models (default |
alpha |
Opacity/transparency of instance segmentation masks (default |
show |
Logical. Whether to display the video feed with bounding boxes in real time.
Default is |
show_fps |
Logical. Whether to overlay a real-time FPS and detection counter badge (default |
hud_pos |
Screen position of the telemetry HUD card: |
hud_layout |
Layout style of the telemetry HUD: |
infer_every |
Integer stride for neural network inference (default |
max_frames |
Optional maximum number of frames to process. Default is |
fps |
Target framerate for video output. If |
col |
Optional color or palette for bounding boxes. If |
lwd |
Line width for bounding boxes (default 2). |
rainbow |
Logical. If |
engine |
Execution engine: |
device_id |
GPU device ID (default -1 for auto). |
threads |
Number of CPU threads (default 0 for auto-tuning). |
dir |
Directory where pre-trained models are stored (default |
verbose |
Logical. Whether to show progress messages. |
... |
Additional arguments passed to graphics plotting functions or aliases
( |
In automated phenotyping, precision agriculture, ecological monitoring, and industrial inspection,
a video stream represents a continuous temporal transect composed of sequential frames
recorded at a frame rate of frames per second. In each frame ,
deep neural network inference detects candidate bounding boxes belonging to recognized classes.
By aggregating detections over space and time, video_detect_dl translates raw computer vision
detections into standardized ecological metrics, quantifying instantaneous community state,
temporal persistence, class dominance, and cumulative discovery rates.
Abundance characterizes the numerical density of detected objects:
Instantaneous Abundance (): The total count of object instances detected in frame :
where is the count of detected objects belonging to class in frame , and is the total number of candidate classes.
Total Video Abundance (): The cumulative sum of all detections identified across the processed footage:
where is the total detection count for class .
Average Abundance per Frame (): Quantifies the baseline object density per frame:
Peak Abundance (): The maximum instantaneous count observed in any single frame:
The exact frame index and corresponding timestamp (in seconds)
identify the moment of maximum congestion or cluster density.
Richness quantifies class variety and categorical complexity over time:
Instantaneous Richness (): The number of distinct classes co-occurring simultaneously in frame :
where is the indicator function equal to 1 if class has at least one detection in frame , and 0 otherwise.
Total Video Richness (): The total count of unique classes recognized across the entire video:
Cumulative Richness / Species Accumulation Curve (Collector's Curve):
The Collector's Curve plots the progressive discovery of novel classes over time. A plateau indicates that sampling effort (video duration) is sufficient to capture the full assemblage of classes present in the environment.
Cumulative Detections ():
Tracking the cumulative volume of detections provides insights into detection throughput and arrival rates.
For each class , video_detect_dl extracts detailed persistence and distribution metrics:
Total Detections (): Total bounding box instances identified for class .
Relative Abundance (): The percentage contribution of class to total video detections:
Frames Present (): The number of frames in which class was detected at least once:
Occurrence Rate / Constancy (): The temporal persistence of class across the video footage:
In ecological literature, species with are classified as constant, as accessory, and as accidental.
Mean Abundance When Present: The expected number of individuals per frame given that the class is present:
Mean Abundance Overall: The unconditional expected number of individuals per frame across all processed frames:
Maximum per Frame (): Peak instantaneous count of class .
Mean Confidence (): The arithmetic mean of detection confidence scores for class :
Temporal Span: First observed timestamp () and last observed timestamp () in seconds.
Summary diversity indices synthesize class variety and equitability into scalar coefficients:
Shannon-Wiener Diversity Index ():
where . quantifies the uncertainty in predicting the class identity of a randomly sampled detection.
Higher values indicate higher diversity and a more equitable distribution across classes.
In addition to the global video-level index, is computed dynamically for each frame in the $temporal data frame.
Simpson's Diversity Index () and Dominance ():
represents the probability that two randomly chosen detections belong to the same class (dominance),
while (Gini-Simpson index) represents the probability that they belong to different classes.
Values range from 0 (monoculture / single class dominating entirely) to (maximal diversity).
Pielou's Evenness Index ():
for (with if , and if ).
normalizes Shannon diversity against its theoretical maximum (),
providing an equitability index bounded between 0 and 1. A value of 1.0 indicates that all classes are detected with equal frequency.
Berger-Parker Dominance Index ():
Quantifies the proportional dominance of the most abundant single class in the assemblage.
When track = TRUE, a spatial-temporal Kalman filter tracking algorithm (SORT/ByteTrack)
associates detections across consecutive frames using Intersection over Union (IoU) cost matrices:
Unique Objects (): Persistent IDs (#1, #2, ...) track physical entities over time,
preventing double-counting when calculating true entity abundance:
For each class , records the unique tracked individuals assigned to that class.
Cumulative Unique Objects Curve ():
Tracks the progressive entry of novel unique physical entities into the monitored frame.
Virtual Tripwire Counting (count_line):
When a virtual line is provided as c(x1, y1, x2, y2) in normalized coordinates ,
the trajectory segments between consecutive centroids and of tracked objects
are evaluated for intersection with the virtual line segment.
Crossing events are registered precisely when the signed 2D cross-product changes orientation,
cataloguing the event frame, timestamp, persistent ID, and class label in $crossings.
The returned object has class c("pliman_video_detect", "list") and provides built-in S3 methods:
plot(x, type = ...): Renders clean, publication-ready graphics. Supported type options:
"temporal" (default): Two-panel stacked time series displaying total abundance and richness .
"abundance": Multi-class abundance trajectories over time.
"richness": Step-function curve of class richness over time.
"cumulative": Two-panel plot of the Species Accumulation Curve (Collector's Curve) and cumulative detection volume.
"class": Horizontal barplot displaying total detections and relative abundance percentages for each class.
"all": 2x2 multi-panel overview combining abundance, richness, class distribution, and the Collector's Curve.
summary(x): Formats and displays an overview table with video metadata, ecological metrics, and class distribution.
print(x): Displays an informative console summary with key video metrics and class rankings.
as.data.frame(x), head(x), tail(x), dim(x), nrow(x), ncol(x), x$column, x[i, j]:
Provide transparent backward compatibility with data frame operations on raw detections.
If return_data = TRUE, an object of class c("pliman_video_detect", "list") containing:
summary: A data.frame of video-level metadata and ecological diversity metrics:
video_source, model, engine, total_frames, fps, duration_sec,
total_detections (), total_richness (), unique_objects (),
avg_abundance_frame (), max_abundance_frame (),
peak_frame (), peak_time_sec (),
shannon_index (), simpson_index (), pielou_evenness (),
and optionally total_counted (when count_line is used).
by_class: A data.frame sorted by total detections detailing per-class metrics:
class, total_detections (), relative_abundance (, \
unique_objects (), n_frames_present (), occurrence_rate (, \
mean_abundance_when_present (), mean_abundance_overall (),
max_per_frame, mean_confidence (), first_seen_sec (),
last_seen_sec (), and optionally total_counted.
unique_objects: A data.frame aggregating every unique tracked object across all observed frames:
id, label, n_frames, first_frame, last_frame, duration_sec, mean_score,
and (when using instance segmentation models) detailed morphological shape features:
area (in pixels), area_sd, perimeter, radius_mean, length, width, circularity, eccentricity, and asp_ratio.
temporal: A data.frame of frame-by-frame time series at resolution :
frame, timestamp (in seconds), instantaneous abundance (), instantaneous richness (),
instantaneous shannon diversity (), and individual count columns for every detected class.
cumulative: A data.frame of cumulative progression:
frame, timestamp, cumulative_detections (),
cumulative_richness (Species Accumulation Curve / Collector's Curve, ),
and optionally cumulative_unique_objects ().
diversity: A list containing global ecological diversity indices:
richness_S (), total_abundance_N (), shannon_H (),
simpson_1_minus_D (), simpson_D (), pielou_J (),
berger_parker_d (), mean_richness_per_frame, and mean_abundance_per_frame.
detections: A data.frame of all raw candidate detections across all frames:
frame, timestamp, id, xmin, ymin, xmax, ymax, label, score, and class_id
(plus shape features when running segmentation models).
crossings: (Optional) A data.frame of virtual tripwire crossing events when count_line is specified.
keypoints: (Optional) A data.frame of 17 keypoint anatomical landmarks when running pose estimation models.
roi, roi_mode, count_line, output: Additional metadata reflecting execution configuration.
If return_data = FALSE, returns invisible(NULL).
## Not run: library(pliman) # 1. Video detection and ecological diversity analysis dets <- video_detect_dl( video = "field_drone.mp4", model = "yolo26n", conf_threshold = 0.5, return_data = TRUE, output = "annotated_field.mp4" ) # Summary table of ecological metrics summary(dets) # Plot community temporal dynamics (abundance & richness) plot(dets, type = "temporal") # Plot Species Accumulation Curve (Collector's Curve) plot(dets, type = "cumulative") # Plot multi-class abundance trajectories plot(dets, type = "abundance") # Multi-panel 2x2 diagnostic overview plot(dets, type = "all") # Access per-class breakdown dets$by_class # 2. Multi-object tracking with virtual tripwire line counting tracked_dets <- video_detect_dl( video = "conveyor_belt.mp4", model = "seed_weights.onnx", track = TRUE, count_line = c(0.5, 0, 0.5, 1), # vertical counting tripwire return_data = TRUE ) ## End(Not run)## Not run: library(pliman) # 1. Video detection and ecological diversity analysis dets <- video_detect_dl( video = "field_drone.mp4", model = "yolo26n", conf_threshold = 0.5, return_data = TRUE, output = "annotated_field.mp4" ) # Summary table of ecological metrics summary(dets) # Plot community temporal dynamics (abundance & richness) plot(dets, type = "temporal") # Plot Species Accumulation Curve (Collector's Curve) plot(dets, type = "cumulative") # Plot multi-class abundance trajectories plot(dets, type = "abundance") # Multi-panel 2x2 diagnostic overview plot(dets, type = "all") # Access per-class breakdown dets$by_class # 2. Multi-object tracking with virtual tripwire line counting tracked_dets <- video_detect_dl( video = "conveyor_belt.mp4", model = "seed_weights.onnx", track = TRUE, count_line = c(0.5, 0, 0.5, 1), # vertical counting tripwire return_data = TRUE ) ## End(Not run)
video_split() extracts individual frames from a video file and saves them
directly to disk as image files (.jpg or .png). It provides native
hardware-accelerated decoding on Windows via Windows Media Foundation and C++,
saving images directly to disk without intermediate temporary files or
external command-line dependencies.
On Linux and macOS, or when explicitly requested via backend = "av", it
seamlessly delegates decoding to the av package.
You can control the extraction rate by either:
Specifying fps (e.g., fps = 1 for 1 frame per second).
Specifying n for a fixed number of uniformly spaced frames sampled across
the entire video duration.
Leaving both NULL to extract every frame of the video.
video_to_frames() is an alias for video_split().
video_split( video, dir = "frames", fps = NULL, n = NULL, format = c("jpg", "png"), quality = 95, prefix = "frame_", digits = 6, backend = c("auto", "native", "av"), verbose = TRUE )video_split( video, dir = "frames", fps = NULL, n = NULL, format = c("jpg", "png"), quality = 95, prefix = "frame_", digits = 6, backend = c("auto", "native", "av"), verbose = TRUE )
video |
Character. Path to the video file (e.g., |
dir |
Character. Directory where the extracted frames will be saved.
Defaults to |
fps |
Numeric. Desired frame rate (frames per second) for extraction.
For example, |
n |
Integer. Desired total number of frames to sample uniformly across
the entire video duration. For example, |
format |
Character. Output image format: |
quality |
Integer (1-100). JPEG compression quality. Defaults to |
prefix |
Character. Prefix for generated frame filenames. Defaults to
|
digits |
Integer. Number of digits with zero-padding in frame filenames
(e.g., |
backend |
Character. Decoding engine to use: |
verbose |
Logical. If |
A data frame of class c("pliman_video_frames", "data.frame") containing:
frame: Frame sequential index.
file: Full path to the saved image file.
time: Timestamp of the frame in seconds.
width: Width of the image in pixels.
height: Height of the image in pixels.
Tiago Olivoto [email protected]
## Not run: # Extract 1 frame per second video_split("my_video.mp4", dir = "frames_fps", fps = 1) # Sample exactly 20 frames uniformly across the video video_split("my_video.mp4", dir = "frames_n", n = 20) # Extract all frames as PNG video_to_frames("my_video.mp4", dir = "all_frames", format = "png") ## End(Not run)## Not run: # Extract 1 frame per second video_split("my_video.mp4", dir = "frames_fps", fps = 1) # Sample exactly 20 frames uniformly across the video video_split("my_video.mp4", dir = "frames_n", n = 20) # Extract all frames as PNG video_to_frames("my_video.mp4", dir = "all_frames", format = "png") ## End(Not run)
Generic function for interactive viewing of images and spatial objects
view(x, ...)view(x, ...)
x |
An image or spatial object to view. |
... |
Additional arguments passed to specific view methods. |
image objects with Zoom In and Zoom OutProvides an interactive viewer for image objects in R. When using base viewer mode,
users can interactively zoom in (selecting a bounding rectangle), zoom out, reset,
or finish viewing.
## S3 method for class 'image' view(x, viewer = get_pliman_viewer(), ...)## S3 method for class 'image' view(x, viewer = get_pliman_viewer(), ...)
x |
An |
viewer |
Character specifying the viewer back-end: |
... |
Additional arguments passed to |
Invisibly returns the current zoomed sub-image or full image object.
## Not run: img <- image_import(image_pliman("sev_leaf.jpg")) view(img) ## End(Not run)## Not run: img <- image_import(image_pliman("sev_leaf.jpg")) view(img) ## End(Not run)
Adds negative background images (images without objects and matching empty .txt
label files) to an existing YOLO dataset. This is an official Ultralytics best practice
to drastically reduce false positive detections. Supports local image folders,
vector of image file paths, an Ultralytics Platform .ndjson export file, or a direct URL.
yolo_dataset_add_background( dir = "yolo_dataset", source, n = 20L, train_prop = 0.8, prefix = "bg_", verbose = TRUE )yolo_dataset_add_background( dir = "yolo_dataset", source, n = 20L, train_prop = 0.8, prefix = "bg_", verbose = TRUE )
dir |
Character or |
source |
Character. Either a path to an Ultralytics |
n |
Integer. Number of background images to add. Defaults to |
train_prop |
Numeric. Proportion of background images assigned to the training split. Defaults to |
prefix |
Character. Filename prefix for added background images. Defaults to |
verbose |
Logical. Whether to show progress messages. Defaults to |
Invisible list with summary of added files.
Ultralytics provides a rich repository of ready-to-use open datasets at
https://docs.ultralytics.com/datasets/ and https://platform.ultralytics.com/.
To obtain an .ndjson file to use here:
Visit https://docs.ultralytics.com/datasets/ or log in to the Ultralytics Platform at https://platform.ultralytics.com/.
Browse or search for your desired dataset (e.g. African Wildlife, COCO8, SKU-110k, VisDrone, VOC).
Open the dataset page and navigate to the Versions or Overview tab.
Click the Download (Export) icon in the top header.
Select NDJSON (Newline Delimited JSON) format and download the file (e.g. "african-wildlife.ndjson").
Pass the downloaded file path directly to yolo_dataset_add_background(source = "african-wildlife.ndjson")!
## Not run: # Using a local NDJSON downloaded from Ultralytics Hub: yolo_dataset_add_background( dir = "yolo_toras", source = "D:/Downloads/pliman_dl/african-wildlife.ndjson", n = 20 ) ## End(Not run)## Not run: # Using a local NDJSON downloaded from Ultralytics Hub: yolo_dataset_add_background( dir = "yolo_toras", source = "D:/Downloads/pliman_dl/african-wildlife.ndjson", n = 20 ) ## End(Not run)
yolo_dataset_audit() conducts a deep structural, syntactic, and geometric health
check on any YOLO dataset (Detection, Instance Segmentation, or Image Classification).
It detects duplicate file stems across extensions (stem collisions, e.g. foo.jpg and foo.png
colliding on foo.txt), orphaned images/labels, corrupt files, invalid coordinates (< 0 or > 1),
negative bounding box dimensions, malformed polygons, class index out-of-bounds,
and severe class imbalance.
With repair = TRUE, it automatically repairs the dataset in-place:
Renames colliding images and review previews uniquely (foo_jpg.jpg, foo_png.png) and links existing .txt annotations to the best-matching file based on modification timestamps.
Clamps out-of-bounds coordinates to [0, 1].
Prunes zero-area bounding boxes.
Creates empty .txt background labels for unannotated images.
Removes orphaned .txt label files.
The returned object wraps the audited dataset seamlessly so it can be chained
directly with the pipe operator |> into yolo_train() or yolo_dataset_augment().
yolo_dataset_audit(data, repair = FALSE, min_images = 10L, verbose = TRUE)yolo_dataset_audit(data, repair = FALSE, min_images = 10L, verbose = TRUE)
data |
A |
repair |
Logical. If |
min_images |
Integer threshold for warning if a class has few samples. Defaults to |
verbose |
Logical. Whether to display progress and diagnostic alerts. Defaults to |
An object of class c("yolo_dataset_audit", "yolo_dataset", "list") containing:
dir: Root directory of the dataset.
is_healthy: Logical indicator of dataset health.
issues_found: Total count of issues detected.
issues_repaired: Count of issues successfully fixed (when repair = TRUE).
details: data.frame with file-by-file diagnostic records.
dataset: Underlying yolo_dataset or yolo_dataset_cls object.
Tiago Olivoto [email protected]
## Not run: library(pliman) # Audit a YOLO dataset and automatically fix issues ds_clean <- yolo_dataset_audit("dataset_cafe", repair = TRUE) # Pipe directly into training! ds_clean |> yolo_train(model = "yolo26n-seg", epochs = 50) ## End(Not run)## Not run: library(pliman) # Audit a YOLO dataset and automatically fix issues ds_clean <- yolo_dataset_audit("dataset_cafe", repair = TRUE) # Pipe directly into training! ds_clean |> yolo_train(model = "yolo26n-seg", epochs = 50) ## End(Not run)
yolo_dataset_augment() applies robust offline geometric and photometric augmentations
(horizontal/vertical flips, 90/180/270 rotations, brightness, contrast, and noise)
to a YOLO dataset. Crucially, all bounding boxes and segmentation polygon vertices
are dynamically recomputed with mathematical precision to match the transformed images.
Augmentations are exclusively applied to the train/ split, strictly keeping val/
and test/ pristine for unbiased evaluation.
yolo_dataset_augment( data, out_dir = NULL, copies = 1L, flip_h = TRUE, flip_v = FALSE, rotate = c(0, 90, 180, 270), brightness = TRUE, contrast = TRUE, noise = FALSE, seed = 42, verbose = TRUE )yolo_dataset_augment( data, out_dir = NULL, copies = 1L, flip_h = TRUE, flip_v = FALSE, rotate = c(0, 90, 180, 270), brightness = TRUE, contrast = TRUE, noise = FALSE, seed = 42, verbose = TRUE )
data |
A |
out_dir |
Output directory. If |
copies |
Integer. The number of augmented variants generated per original training image (default: |
flip_h |
Logical. Allow horizontal flipping with probability 0.5 (default: |
flip_v |
Logical. Allow vertical flipping with probability 0.5 (default: |
rotate |
Integer vector of allowable rotation angles in degrees (default: |
brightness |
Logical. Allow random brightness jitter in |
contrast |
Logical. Allow random contrast scaling in |
noise |
Logical. Allow subtle additive Gaussian noise (default: |
seed |
Optional integer seed for reproducibility (default: 42). |
verbose |
Logical. Whether to show progress. Defaults to |
How copies and transformations work (Stochastic Sampling vs. Cartesian Grid):
The parameters (rotate, flip_h, flip_v, brightness,
contrast, noise) define the pool of eligible transformations.
Rather than generating a full Cartesian grid product of all possible combinations (which would produce 30–60 copies per image and quickly exhaust disk space), the function samples a unique combination of transformations for each copy requested:
copies = 1L (default): Generates exactly 1 new augmented variant per original training image (resulting in original + 1 = 2x training size).
copies = 3L: Generates 3 distinct augmented variants per original training image (resulting in original + 3 = 4x training size).
copies = 5L: Generates 5 distinct augmented variants per original training image (resulting in original + 5 = 6x training size).
For each copy, one angle is randomly sampled from rotate, flipping is evaluated
probabilistically, and photometric adjustments are applied randomly within valid bounds.
Already augmented images (named with suffix _aug[0-9]+) are automatically skipped,
preventing recursive dataset explosion if the function is executed multiple times.
A yolo_dataset object pointing to the augmented dataset directory.
## Not run: library(pliman) # 1. Default: 1 augmented copy per image (doubles training size) ds_aug1 <- yolo_dataset_augment("dataset_cafe") # 2. Generate 3 distinct augmented variants per image (quadruples training size) ds_aug3 <- yolo_dataset_augment("dataset_cafe", copies = 3) # 3. Allow vertical flips and 4 augmented variants per image ds_aug4 <- yolo_dataset_augment("dataset_cafe", copies = 4, flip_v = TRUE) ## End(Not run)## Not run: library(pliman) # 1. Default: 1 augmented copy per image (doubles training size) ds_aug1 <- yolo_dataset_augment("dataset_cafe") # 2. Generate 3 distinct augmented variants per image (quadruples training size) ds_aug3 <- yolo_dataset_augment("dataset_cafe", copies = 3) # 3. Allow vertical flips and 4 augmented variants per image ds_aug4 <- yolo_dataset_augment("dataset_cafe", copies = 4, flip_v = TRUE) ## End(Not run)
yolo_dataset_autolabel() batch-processes an entire folder of unannotated images using
a trained yolo_fewshot_model (from yolo_fewshot_fit()). It predicts bounding boxes
or instance segmentation polygons, writes standard YOLO .txt annotation files, splits
the data into train, val, and test, and generates a data.yaml descriptor.
It also creates a review/ visual inspection folder with rendered boxes/polygons so the user
can quickly audit the automated labels.
yolo_dataset_autolabel( input_dir, model, output_dir, task = if (!is.null(model$task)) model$task else c("segment", "detect"), conf_threshold = NULL, max_objects = NULL, split_ratio = c(0.7, 0.2, 0.1), engine = "gpu", device_id = -1, review = TRUE, rainbow = TRUE, seed = 42, verbose = TRUE )yolo_dataset_autolabel( input_dir, model, output_dir, task = if (!is.null(model$task)) model$task else c("segment", "detect"), conf_threshold = NULL, max_objects = NULL, split_ratio = c(0.7, 0.2, 0.1), engine = "gpu", device_id = -1, review = TRUE, rainbow = TRUE, seed = 42, verbose = TRUE )
input_dir |
Directory containing raw unannotated images. |
model |
A |
output_dir |
Target directory to write the YOLO dataset. |
task |
Target task: |
conf_threshold |
Minimum confidence / similarity threshold for accepting predicted instances (e.g. 0.50). If |
split_ratio |
Numeric vector of length 3 for |
engine |
Execution engine override: |
device_id |
GPU device ID if |
review |
Logical. If |
rainbow |
Logical. If |
seed |
Random seed for reproducible splitting. Defaults to |
verbose |
Logical. Show progress messages. Defaults to |
A yolo_dataset S3 object pointing to the created dataset.
yolo_dataset_balance() balances class distributions in a YOLO dataset to eliminate
majority class bias.
With strategy = "oversample" (default), it generates augmented variants of minority
classes using random flips, rotations, and photometric jitter until all classes reach
the target count.
With strategy = "undersample", it downsamples majority classes to match the count
of the smallest class (or a specified target_count).
yolo_dataset_balance( data, strategy = c("oversample", "undersample"), target_count = NULL, clean = TRUE, seed = 42, verbose = TRUE )yolo_dataset_balance( data, strategy = c("oversample", "undersample"), target_count = NULL, clean = TRUE, seed = 42, verbose = TRUE )
data |
A |
strategy |
Strategy to apply: |
target_count |
Optional integer target count per class in |
clean |
Logical. If |
seed |
Optional random seed (default: 42). |
verbose |
Logical. Whether to show progress. Defaults to |
A yolo_dataset object with balanced class distributions.
## Not run: library(pliman) # Oversample minority classes to achieve equal sample sizes ds_balanced <- yolo_dataset_balance("dataset_flores_yolo", strategy = "oversample") ## End(Not run)## Not run: library(pliman) # Oversample minority classes to achieve equal sample sizes ds_balanced <- yolo_dataset_balance("dataset_flores_yolo", strategy = "oversample") ## End(Not run)
yolo_dataset_classify() organizes raw images structured in class subfolders (or custom
lists of files) into a standardized YOLO classification dataset with train/, val/,
and optionally test/ splits per class. The output directory is 100% compliant with Ultralytics
YOLOv8, YOLO11, and YOLO26, and can be passed directly to yolo_train() for deep learning training.
yolo_dataset_classify( src_dir, out_dir = "yolo_cls_dataset", split = c(train = 0.7, val = 0.2, test = 0.1), classes = NULL, ext = c("jpg", "jpeg", "png", "bmp", "tif", "tiff", "webp"), copy = TRUE, balance = FALSE, min_images = 10L, seed = 42, overwrite = FALSE, verbose = TRUE )yolo_dataset_classify( src_dir, out_dir = "yolo_cls_dataset", split = c(train = 0.7, val = 0.2, test = 0.1), classes = NULL, ext = c("jpg", "jpeg", "png", "bmp", "tif", "tiff", "webp"), copy = TRUE, balance = FALSE, min_images = 10L, seed = 42, overwrite = FALSE, verbose = TRUE )
src_dir |
Character path to the source root directory containing class subdirectories
(e.g., |
out_dir |
Output directory path for the YOLO classification dataset. Defaults to |
split |
Numeric vector specifying the train / val / test split ratios.
Can be of length 2 (e.g. |
classes |
Optional character vector of specific class folder names to include. If |
ext |
Character vector of valid image file extensions (default: |
copy |
Logical. If |
balance |
Logical or integer. If |
min_images |
Integer threshold for displaying a warning if a class contains very few images
(default: |
seed |
Optional integer for reproducible random shuffling and train/val/test partitioning (default: 42). |
overwrite |
Logical. If |
verbose |
Logical. If |
The resulting directory structure conforms to the official YOLO classification format:
out_dir/
├── train/
│ ├── class_a/
│ ├── class_b/
│ └── ...
├── val/
│ ├── class_a/
│ ├── class_b/
│ └── ...
└── test/ (optional)
├── class_a/
├── class_b/
└── ...
An object of class c("yolo_dataset_cls", "yolo_dataset", "list") containing:
dir: Absolute path to the created dataset directory (ready to pass to yolo_train(data = ...)).
classes: Character vector of class names.
splits: Character vector of split names created ("train", "val", and optionally "test").
summary: data.frame with the number of images per class in each split and totals.
total_images: Total count of processed images.
split_ratio: Named numeric vector of split ratios used.
Tiago Olivoto [email protected]
## Not run: library(pliman) # Organize flower photos into train (70%), val (20%), test (10%) ds <- yolo_dataset_classify( src_dir = "D:/Downloads/pliman_dl/flower_photos", out_dir = "dataset_flores_yolo", split = c(train = 0.70, val = 0.20, test = 0.10), min_images = 10 ) # Inspect summary table ds # Train a YOLO classification model directly with pliman! model <- yolo_train( data = ds, model = "yolo11n-cls", epochs = 50 ) ## End(Not run)## Not run: library(pliman) # Organize flower photos into train (70%), val (20%), test (10%) ds <- yolo_dataset_classify( src_dir = "D:/Downloads/pliman_dl/flower_photos", out_dir = "dataset_flores_yolo", split = c(train = 0.70, val = 0.20, test = 0.10), min_images = 10 ) # Inspect summary table ds # Train a YOLO classification model directly with pliman! model <- yolo_train( data = ds, model = "yolo11n-cls", epochs = 50 ) ## End(Not run)
yolo_dataset_convert() converts annotations from standard computer vision formats
into a clean, ready-to-train YOLO dataset.
Supports:
CSV: Tabular tables (image, xmin, ymin, xmax, ymax, class) commonly exported by ImageJ, Fiji, or field records.
COCO: Standard COCO JSON (instances_train.json with images, annotations, categories).
Pascal VOC: Directory of XML annotation files.
Automatically computes normalized YOLO coordinates and creates train/ and val/ splits.
yolo_dataset_convert( input, format = c("csv", "coco", "voc"), img_dir = NULL, out_dir = "yolo_converted_dataset", split = c(train = 0.8, val = 0.2), copy = TRUE, seed = 42, overwrite = FALSE, verbose = TRUE )yolo_dataset_convert( input, format = c("csv", "coco", "voc"), img_dir = NULL, out_dir = "yolo_converted_dataset", split = c(train = 0.8, val = 0.2), copy = TRUE, seed = 42, overwrite = FALSE, verbose = TRUE )
input |
Path to the annotation file ( |
format |
Format type: |
img_dir |
Directory where the raw image files are stored. |
out_dir |
Destination directory for the YOLO dataset. Defaults to |
split |
Proportions for train and validation splits (default: |
copy |
Logical. Whether to copy image files into the dataset. Defaults to |
seed |
Random seed for split partitioning (default: 42). |
overwrite |
Logical. Overwrite existing |
verbose |
Logical. Show progress. Defaults to |
A yolo_dataset object pointing to out_dir.
## Not run: library(pliman) # Convert CSV bounding boxes from field phenotyping ds_yolo <- yolo_dataset_convert( input = "field_labels.csv", format = "csv", img_dir = "field_photos", out_dir = "dataset_field_yolo" ) ## End(Not run)## Not run: library(pliman) # Convert CSV bounding boxes from field phenotyping ds_yolo <- yolo_dataset_convert( input = "field_labels.csv", format = "csv", img_dir = "field_photos", out_dir = "dataset_field_yolo" ) ## End(Not run)
Automatically generates a structured YOLO dataset (images/, labels/,
and data.yaml) for object detection (task = "detect") or instance
segmentation (task = "segment"). Annotations can be produced automatically
via deep learning foundation models:
One-shot visual exemplar auto-labeling with model = "persam" (Roboflow-style 1-click annotation).
Zero-shot text prompt detection with model = "grounded-sam" (e.g. prompt = "people").
Assisted labeling / pseudo-labeling with pre-trained or fine-tuned YOLO models (model = "custom.onnx").
Classical image analysis with analyze_objects() (model = NULL).
yolo_dataset_export( img, model = NULL, annotations = "auto", dir = "yolo_dataset", task = c("detect", "segment"), class_names = c("object"), class_id = 0L, prompt = NULL, prompt_mode = c("each", "first"), interactive = is.null(prompt) && !is.null(model) && identical(tolower(model), "persam") && interactive(), sim_threshold = 0.5, min_dist = 20, box_threshold = 0.25, text_threshold = 0.25, iou_threshold = 0.5, feat_res = 256, max_objects = NULL, train_prop = 0.8, n_points = 40L, min_area = 15, filter_edge = TRUE, show_similarity = FALSE, superres_map = FALSE, engine = c("gpu", "cpu"), device_id = -1, overwrite = TRUE, verbose = TRUE, ... )yolo_dataset_export( img, model = NULL, annotations = "auto", dir = "yolo_dataset", task = c("detect", "segment"), class_names = c("object"), class_id = 0L, prompt = NULL, prompt_mode = c("each", "first"), interactive = is.null(prompt) && !is.null(model) && identical(tolower(model), "persam") && interactive(), sim_threshold = 0.5, min_dist = 20, box_threshold = 0.25, text_threshold = 0.25, iou_threshold = 0.5, feat_res = 256, max_objects = NULL, train_prop = 0.8, n_points = 40L, min_area = 15, filter_edge = TRUE, show_similarity = FALSE, superres_map = FALSE, engine = c("gpu", "cpu"), device_id = -1, overwrite = TRUE, verbose = TRUE, ... )
img |
An |
model |
Deep learning model to use for automated or semi-automated labeling:
|
annotations |
Annotations source when
|
dir |
Output directory path for the YOLO dataset. Defaults to |
task |
Task type: |
class_names |
Character vector of class names (e.g. |
class_id |
Numeric class ID assigned to the annotations. Defaults to |
prompt |
Prompt specification for deep learning models:
|
prompt_mode |
Exemplar prompting mode when labeling multiple images with PerSAM:
|
interactive |
Logical. If |
sim_threshold |
Numeric cosine similarity threshold in |
min_dist |
Minimum distance (in pixels) between detected objects/peaks for PerSAM exemplar segmentation. Defaults to |
box_threshold |
Bounding box confidence threshold for Grounded-SAM or YOLO models. Defaults to |
text_threshold |
Text confidence threshold for Grounded-SAM. Defaults to |
iou_threshold |
Non-Maximum Suppression (NMS) IoU threshold. Defaults to |
feat_res |
Feature map resolution for PerSAM ( |
max_objects |
Maximum number of objects detected per image. Defaults to |
train_prop |
Proportion of images assigned to the training split (default |
n_points |
Target number of polygon vertices per object for segmentation
(default |
min_area |
Minimum object area (in pixels) to include in the dataset. Defaults to |
filter_edge |
Logical. If |
show_similarity |
Logical. If |
superres_map |
Logical. If |
engine |
Computing device engine: |
device_id |
GPU device ID (default |
overwrite |
Logical. If |
verbose |
Logical. If |
... |
Additional arguments passed directly to |
PerSAM One-Shot Exemplar Auto-Labeling (model = "persam"):
The user clicks on 1 or more exemplar objects in the plot window. PerSAM extracts
visual embeddings from SAM 2.1, calculates the spatial cosine feature similarity map
("matriz de coincidencia"), and identifies all matching instances across the image.
When interactive = TRUE, an interactive confirmation menu allows accepting detections ('r'), or fine-tuning the similarity threshold ('t 0.55') in real-time.
Grounded-SAM Text Prompting (model = "grounded-sam"):
Accepts natural language text descriptions (e.g. prompt = "people", prompt = "coffee grain",
or class_names = c("person", "bicycle")) to locate and segment all matching objects.
YOLO Pre-Labeling / Active Learning (model = "<model>.onnx"):
Applies an existing trained YOLO model to unannotated images to produce draft labels
for rapid dataset expansion.
Classical Image Analysis (model = NULL):
Extracts contours via analyze_objects() using thresholding, color indexes, and watershed algorithms.
The exported directory adheres to the standard structure expected by YOLOv8, YOLO11, and YOLO26:
dataset_dir/
|-- data.yaml
|-- images/
| |-- train/
| \-- val/
\-- labels/
|-- train/
\-- val/
An invisible list containing:
dir: Root directory of the dataset.
yaml_file: Full path to the generated data.yaml.
train_images: Vector of paths to training images.
val_images: Vector of paths to validation images.
n_objects: Total number of annotated objects across the dataset.
## Not run: library(pliman) # 1. Semi-Automated 1-Click Labeling with PerSAM: # Click 1 capsule on screen -> PerSAM finds all 40+ capsules and writes YOLO boxes! yolo_dataset_export( "capsulas_raw/", model = "persam", task = "detect", class_names = "capsula", dir = "dataset_capsulas" ) # 2. Zero-Shot Text Prompt Labeling with Grounded-SAM: # Annotate every person in photos automatically: yolo_dataset_export( "crowd_photos/", model = "grounded-sam", prompt = "people", class_names = "person", dir = "dataset_people" ) # 3. Classical Auto-Annotation with analyze_objects: yolo_dataset_export( "cafe_grains/", task = "segment", class_names = "grao_cafe", index = "B", watershed = TRUE ) ## End(Not run)## Not run: library(pliman) # 1. Semi-Automated 1-Click Labeling with PerSAM: # Click 1 capsule on screen -> PerSAM finds all 40+ capsules and writes YOLO boxes! yolo_dataset_export( "capsulas_raw/", model = "persam", task = "detect", class_names = "capsula", dir = "dataset_capsulas" ) # 2. Zero-Shot Text Prompt Labeling with Grounded-SAM: # Annotate every person in photos automatically: yolo_dataset_export( "crowd_photos/", model = "grounded-sam", prompt = "people", class_names = "person", dir = "dataset_people" ) # 3. Classical Auto-Annotation with analyze_objects: yolo_dataset_export( "cafe_grains/", task = "segment", class_names = "grao_cafe", index = "B", watershed = TRUE ) ## End(Not run)
yolo_dataset_filter() isolates specific classes of interest from a multi-class
dataset (or drops unwanted categories). It rewrites all .txt label files, re-indexes
surviving class IDs contiguously from 0 to K-1, updates data.yaml, and optionally
cleans or preserves images that now have zero annotations (as background negatives).
yolo_dataset_filter( data, keep_classes = NULL, drop_classes = NULL, out_dir = "filtered_yolo_dataset", drop_empty_images = TRUE, copy = TRUE, overwrite = FALSE, verbose = TRUE )yolo_dataset_filter( data, keep_classes = NULL, drop_classes = NULL, out_dir = "filtered_yolo_dataset", drop_empty_images = TRUE, copy = TRUE, overwrite = FALSE, verbose = TRUE )
data |
A |
keep_classes |
Character vector of class names to retain. Mutually exclusive with |
drop_classes |
Character vector of class names to exclude. |
out_dir |
Output directory path for the filtered dataset. Defaults to |
drop_empty_images |
Logical. If |
copy |
Logical. Whether to copy files to |
overwrite |
Logical. Whether to overwrite |
verbose |
Logical. Whether to show progress. Defaults to |
A yolo_dataset object pointing to the filtered dataset.
## Not run: library(pliman) # Focus exclusively on 2 classes from a 10-class dataset ds_focused <- yolo_dataset_filter( "dataset_geral", keep_classes = c("ferrugem", "mancha_angular"), out_dir = "dataset_doencas" ) ## End(Not run)## Not run: library(pliman) # Focus exclusively on 2 classes from a 10-class dataset ds_focused <- yolo_dataset_filter( "dataset_geral", keep_classes = c("ferrugem", "mancha_angular"), out_dir = "dataset_doencas" ) ## End(Not run)
Reads an Ultralytics Hub dataset export (.ndjson format), parses dataset metadata,
classes, bounding boxes or segmentation polygons, downloads images before their
signed URLs expire, and writes a complete standard YOLO dataset folder
with images/, labels/, and data.yaml. Optionally packages the entire dataset
into a .zip archive for permanent offline storage and distribution.
yolo_dataset_from_ndjson( file, dir = NULL, splits = c("train", "val", "test"), train_prop = NULL, max_images = NULL, download_images = TRUE, parallel = TRUE, zip = FALSE, overwrite = FALSE, verbose = TRUE ) yolo_dataset_import_ndjson( file, dir = NULL, splits = c("train", "val", "test"), train_prop = NULL, max_images = NULL, download_images = TRUE, parallel = TRUE, zip = FALSE, overwrite = FALSE, verbose = TRUE )yolo_dataset_from_ndjson( file, dir = NULL, splits = c("train", "val", "test"), train_prop = NULL, max_images = NULL, download_images = TRUE, parallel = TRUE, zip = FALSE, overwrite = FALSE, verbose = TRUE ) yolo_dataset_import_ndjson( file, dir = NULL, splits = c("train", "val", "test"), train_prop = NULL, max_images = NULL, download_images = TRUE, parallel = TRUE, zip = FALSE, overwrite = FALSE, verbose = TRUE )
file |
Character. Path to the |
dir |
Character or |
splits |
Character vector. Which splits to process ( |
train_prop |
Numeric or |
max_images |
Integer or |
download_images |
Logical. Whether to download image files. Defaults to |
parallel |
Logical. Whether to download images concurrently using |
zip |
Logical. Whether to create a |
overwrite |
Logical. Whether to overwrite existing files. Defaults to |
verbose |
Logical. Whether to show progress bar and informative messages. Defaults to |
An object of class yolo_dataset with dataset directory paths and classes.
Ultralytics provides a rich repository of ready-to-use open datasets at
https://docs.ultralytics.com/datasets/ and https://platform.ultralytics.com/.
To obtain an .ndjson file to use here:
Visit https://docs.ultralytics.com/datasets/ or log in to the Ultralytics Platform at https://platform.ultralytics.com/.
Browse or search for your desired dataset (e.g. African Wildlife, COCO8, SKU-110k, VisDrone, VOC).
Open the dataset page and navigate to the Versions or Overview tab.
Click the Download (Export) icon in the top header.
Select NDJSON (Newline Delimited JSON) format and download the file (e.g. "african-wildlife.ndjson").
Run yolo_dataset_from_ndjson(file = "african-wildlife.ndjson", zip = TRUE) to download all
images and generate the complete YOLO dataset before the cloud URLs expire!
## Not run: # Download and export the entire dataset permanently before URLs expire: ds <- yolo_dataset_from_ndjson( file = "D:/Downloads/pliman_dl/african-wildlife.ndjson", zip = TRUE ) yolo_dataset_preview(ds) ## End(Not run)## Not run: # Download and export the entire dataset permanently before URLs expire: ds <- yolo_dataset_from_ndjson( file = "D:/Downloads/pliman_dl/african-wildlife.ndjson", zip = TRUE ) yolo_dataset_preview(ds) ## End(Not run)
yolo_dataset_merge() combines two or more YOLO datasets (Detection, Segmentation,
or Classification) into a single, cohesive, conflict-free master dataset.
It handles filename collisions by prepending dataset prefixes, harmonizes class indices
across differing data.yaml definitions (with optional custom class renaming via class_map),
updates label files on-the-fly, and generates a unified master data.yaml.
yolo_dataset_merge( datasets, out_dir = "merged_yolo_dataset", class_map = NULL, copy = TRUE, overwrite = FALSE, verbose = TRUE )yolo_dataset_merge( datasets, out_dir = "merged_yolo_dataset", class_map = NULL, copy = TRUE, overwrite = FALSE, verbose = TRUE )
datasets |
A list or character vector of dataset directory paths or |
out_dir |
Output directory path for the merged dataset. Defaults to |
class_map |
Optional named list or vector mapping old class names to unified names
(e.g., |
copy |
Logical. If |
overwrite |
Logical. If |
verbose |
Logical. Whether to show progress. Defaults to |
A yolo_dataset object pointing to out_dir (ready for yolo_train() or piping |>).
## Not run: library(pliman) # Merge two datasets collected from different seasons ds_total <- yolo_dataset_merge( datasets = list("dataset_2024", "dataset_2025"), out_dir = "dataset_unificado" ) ## End(Not run)## Not run: library(pliman) # Merge two datasets collected from different seasons ds_total <- yolo_dataset_merge( datasets = list("dataset_2024", "dataset_2025"), out_dir = "dataset_unificado" ) ## End(Not run)
Loads sample images and their matching .txt annotation labels from a YOLO
dataset directory and displays them in a multi-panel grid with overlaid segmentation polygons
or bounding boxes. By default, randomly samples n images from the requested split.
yolo_dataset_preview( dir = "yolo_dataset", split = c("train", "val", "test"), pattern = NULL, n = 4L, random = TRUE, seed = NULL, mfrow = NULL, rainbow = TRUE, col = NULL, lwd = 1.5, fill = NULL, show_labels = TRUE, label_bg = FALSE, cex = 0.6, title = TRUE )yolo_dataset_preview( dir = "yolo_dataset", split = c("train", "val", "test"), pattern = NULL, n = 4L, random = TRUE, seed = NULL, mfrow = NULL, rainbow = TRUE, col = NULL, lwd = 1.5, fill = NULL, show_labels = TRUE, label_bg = FALSE, cex = 0.6, title = TRUE )
dir |
Character or |
split |
Character. The subset to preview: |
pattern |
Optional regex pattern to filter specific image names (e.g. |
n |
Integer. Number of sample images to preview. Defaults to |
random |
Logical. If |
seed |
Optional integer seed for reproducible random selection. |
rainbow |
Logical. If |
col |
Border color for bounding boxes/polygons. If provided, overrides |
lwd |
Numeric. Line width for borders. Defaults to |
fill |
Fill color for polygons with transparency (e.g. |
show_labels |
Logical. If |
label_bg |
Logical. If |
cex |
Numeric. Text size for class name labels. Defaults to |
title |
Logical or character. If |
An invisible list of the sampled image file paths.
## Not run: dataset <- yolo_dataset_export(img, dir = "dataset_cafe", model = "persam") yolo_dataset_preview(dataset, n = 4, random = TRUE) plot(dataset, n = 6) ## End(Not run)## Not run: dataset <- yolo_dataset_export(img, dir = "dataset_cafe", model = "persam") yolo_dataset_preview(dataset, n = 4, random = TRUE) plot(dataset, n = 6) ## End(Not run)
yolo_dataset_split() takes any YOLO dataset (flat or previously partitioned)
and redistributes all images and matching .txt labels into new train/, val/,
and optionally test/ splits. It ensures that pairs are preserved and regenerates
an updated data.yaml.
yolo_dataset_split( data, out_dir = "split_yolo_dataset", split = c(train = 0.7, val = 0.2, test = 0.1), seed = 42, copy = TRUE, overwrite = FALSE, verbose = TRUE )yolo_dataset_split( data, out_dir = "split_yolo_dataset", split = c(train = 0.7, val = 0.2, test = 0.1), seed = 42, copy = TRUE, overwrite = FALSE, verbose = TRUE )
data |
A |
out_dir |
Output directory path for the re-split dataset. Defaults to |
split |
Proportions for partitioning (default: |
seed |
Optional random seed for reproducible shuffling (default: 42). |
copy |
Logical. Whether to copy files. Defaults to |
overwrite |
Logical. Overwrite existing |
verbose |
Logical. Whether to show progress. Defaults to |
A yolo_dataset object pointing to the newly split dataset.
## Not run: library(pliman) # Re-stratify into 70% train, 20% validation, 10% test ds_split <- yolo_dataset_split("dataset_cafe", split = c(0.7, 0.2, 0.1)) ## End(Not run)## Not run: library(pliman) # Re-stratify into 70% train, 20% validation, 10% test ds_split <- yolo_dataset_split("dataset_cafe", split = c(0.7, 0.2, 0.1)) ## End(Not run)
yolo_dataset_stats() computes granular distribution metrics for any YOLO dataset.
It reports sample frequencies per split, class proportion percentages, imbalance ratios,
and (for object detection/segmentation) bounding box area distributions.
yolo_dataset_stats(data, verbose = TRUE)yolo_dataset_stats(data, verbose = TRUE)
data |
A |
verbose |
Logical. Display formatted tables in the console. Defaults to |
A data.frame containing summary statistics per class.
## Not run: library(pliman) stats <- yolo_dataset_stats("dataset_flores_yolo") ## End(Not run)## Not run: library(pliman) stats <- yolo_dataset_stats("dataset_flores_yolo") ## End(Not run)
Converts a trained PyTorch YOLO checkpoint (best.pt or any custom .pt model)
into a standalone ONNX model ready for instant C++ execution in image_segment_dl()
or image_detect_dl().
yolo_export( model, output_dir = pliman_model_dir(), output_name = NULL, imgsz = 640, auto_install = TRUE )yolo_export( model, output_dir = pliman_model_dir(), output_name = NULL, imgsz = 640, auto_install = TRUE )
model |
Path to the |
output_dir |
Target directory to save the exported |
output_name |
Filename of the exported model. If |
imgsz |
Input image resolution (default |
auto_install |
Logical. If |
The full path to the exported .onnx model.
## Not run: library(pliman) yolo_export("best.pt", output_name = "custom_model.onnx") ## End(Not run)## Not run: library(pliman) yolo_export("best.pt", output_name = "custom_model.onnx") ## End(Not run)
yolo_fewshot_fit() implements an interactive few-shot visual learning engine powered by
Meta AI's Segment Anything 2.1 (SAM 2.1 / PerSAM). The user selects 3–5 sample instances
of an object (e.g. seeds, beans, logs, leaves, lesions, fruits) by clicking on an image.
Using the PerSAM exemplar matching engine, the function computes visual prototypes from the exemplars and segments all other matching instances across the entire image with high precision.
The user can specify task = "segment" to obtain instance masks and polygonal boundaries
for YOLO segmentation datasets, or task = "detect" for oriented/axis-aligned bounding boxes.
The resulting model object (yolo_fewshot_model) can be inspected, plotted, and directly
propagated to hundreds of unannotated images in a folder using yolo_dataset_autolabel().
yolo_fewshot_fit( img, points = NULL, sample = NULL, label = "object", task = c("segment", "detect"), conf_threshold = 0.5, radius = NULL, min_dist = 12, min_area = NULL, max_area = NULL, max_objects = NULL, method = c("sam", "persam", "adaptive"), engine = c("gpu", "cpu"), device_id = -1, rainbow = TRUE, plot = TRUE, verbose = TRUE )yolo_fewshot_fit( img, points = NULL, sample = NULL, label = "object", task = c("segment", "detect"), conf_threshold = 0.5, radius = NULL, min_dist = 12, min_area = NULL, max_area = NULL, max_objects = NULL, method = c("sam", "persam", "adaptive"), engine = c("gpu", "cpu"), device_id = -1, rainbow = TRUE, plot = TRUE, verbose = TRUE )
img |
An |
points |
Optional $(x, y)$ coordinates of exemplar points. If |
label |
Character vector naming the target class(es). Can be a single class (e.g., |
task |
Target task: |
conf_threshold |
Numeric scalar between 0 and 1 specifying detection confidence/similarity threshold. Defaults to |
radius |
Optional estimated radius in pixels for target objects. If |
min_dist |
Minimum distance in pixels between detected instances. Defaults to |
min_area |
Minimum object area in pixels. If |
max_area |
Maximum object area in pixels. If |
method |
Segmentation method: |
engine |
Execution engine for SAM: |
device_id |
GPU device ID if |
rainbow |
Logical. If |
plot |
Logical. Display the detection and segmentation overlay. Defaults to |
verbose |
Logical. Show progress messages. Defaults to |
An object of class yolo_fewshot_model containing exemplar signatures,
detected instances on the reference image, and parameters for batch propagation.
## Not run: library(pliman) # 1. Fit exemplar model on reference photo (clicks or supplied coordinates) modelo_tora <- yolo_fewshot_fit("toras/toras22.png", label = "tora", task = "segment", method = "sam") # 2. Inspect segmentation overlay on reference photo plot(modelo_tora) # 3. Auto-label entire directory of 300 photos into a YOLO dataset ds <- yolo_dataset_autolabel("toras_raw/", model = modelo_tora, output_dir = "dataset_toras_yolo") ## End(Not run)## Not run: library(pliman) # 1. Fit exemplar model on reference photo (clicks or supplied coordinates) modelo_tora <- yolo_fewshot_fit("toras/toras22.png", label = "tora", task = "segment", method = "sam") # 2. Inspect segmentation overlay on reference photo plot(modelo_tora) # 3. Auto-label entire directory of 300 photos into a YOLO dataset ds <- yolo_dataset_autolabel("toras_raw/", model = modelo_tora, output_dir = "dataset_toras_yolo") ## End(Not run)
Applies a trained yolo_fewshot_model to detect and segment instances in a new image.
yolo_fewshot_predict( model, img, task = model$task, conf_threshold = NULL, max_objects = NULL, engine = "gpu", device_id = -1, plot = FALSE, rainbow = TRUE )yolo_fewshot_predict( model, img, task = model$task, conf_threshold = NULL, max_objects = NULL, engine = "gpu", device_id = -1, plot = FALSE, rainbow = TRUE )
model |
A |
img |
An |
task |
Task override: |
conf_threshold |
Numeric scalar override for detection confidence. Defaults to model threshold. |
max_objects |
Maximum number of instances to detect. |
engine |
Execution engine: |
device_id |
GPU device ID if |
plot |
Logical. Display detection results. Defaults to |
rainbow |
Logical. If |
A list containing boxes (bounding boxes data.frame) and polygons (list of normalized coordinates).
Convenient wrapper function for plot.yolo_train(). Accepts either an existing
yolo_train S3 object, a model name string (e.g. "capsulas_det"), or a direct path
to a results folder.
yolo_plot(x, ...)yolo_plot(x, ...)
x |
An object of class |
... |
Arguments passed directly to |
This function simplifies diagnostic inspections by allowing users to directly pass model names
(e.g. yolo_plot("my_model")) without first having to call yolo_results().
See plot.yolo_train() for full mathematical formulas, statistical definitions of IoU, Confusion Matrix,
Precision, Recall, F1-Score, PR Curve, mAP50, and mAP50-95, and plot interpretation guidelines.
Invisibly returns the yolo_train object or plotted data frame.
plot.yolo_train(), yolo_results(), yolo_train()
## Not run: library(pliman) # Plot full 2x2 vector diagnostic dashboard directly by model name yolo_plot("capsulas_det") # Plot individual evaluation curves in high-resolution vector format: yolo_plot("capsulas_det", which = "confusion_matrix") yolo_plot("capsulas_det", which = "confusion_matrix_norm") yolo_plot("capsulas_det", which = "pr_curve") yolo_plot("capsulas_det", which = "f1_curve") yolo_plot("capsulas_det", which = "metrics") ## End(Not run)## Not run: library(pliman) # Plot full 2x2 vector diagnostic dashboard directly by model name yolo_plot("capsulas_det") # Plot individual evaluation curves in high-resolution vector format: yolo_plot("capsulas_det", which = "confusion_matrix") yolo_plot("capsulas_det", which = "confusion_matrix_norm") yolo_plot("capsulas_det", which = "pr_curve") yolo_plot("capsulas_det", which = "f1_curve") yolo_plot("capsulas_det", which = "metrics") ## End(Not run)
Reconstructs a yolo_train S3 object from an existing model name, .onnx/.pt file,
or results directory without needing to retrain. The resulting object can be directly
printed with print.yolo_train() and visualized with plot.yolo_train() or yolo_plot().
yolo_results(model = NULL, results_dir = NULL, output_dir = pliman_model_dir())yolo_results(model = NULL, results_dir = NULL, output_dir = pliman_model_dir())
model |
Name or path to a trained YOLO model (e.g. |
results_dir |
Optional direct path to the |
output_dir |
Directory where pliman models and results are stored. Defaults to |
When a YOLO model is trained via yolo_train(), all evaluation tables, weights, and logs
are preserved in <output_name>_results. yolo_results() reconstructs the full training
session state by parsing:
results.csv: Epoch-by-epoch loss progressions, precision, recall, mAP50, and mAP50-95.
confusion_matrix.csv: Complete confusion matrix counts including the background class.
confusion_matrix_normalized.csv: Normalized classification rates.
pr_curve.csv: 1,000-point Precision-Recall evaluation curve per class.
f1_curve.csv: 1,000-point F1 vs. Confidence evaluation curve per class.
Model weights: Automatically locates exported .onnx and .pt files.
This enables instant, offline performance inspection, publication-ready vector plotting, and threshold selection for any trained model without needing Python or GPU re-execution.
An object of class c("yolo_train", "list").
plot.yolo_train(), yolo_plot(), yolo_train()
## Not run: library(pliman) # Load diagnostics from a previously trained model res <- yolo_results("capsulas_det") # Inspect training metrics and plot diagnostic dashboard print(res) plot(res) plot(res, which = "confusion_matrix") plot(res, which = "pr_curve") ## End(Not run)## Not run: library(pliman) # Load diagnostics from a previously trained model res <- yolo_results("capsulas_det") # Inspect training metrics and plot diagnostic dashboard print(res) plot(res) plot(res, which = "confusion_matrix") plot(res, which = "pr_curve") ## End(Not run)
High-level training interface for Ultralytics YOLO models (YOLO26, YOLO11, YOLOv8)
in pliman. Supports instance segmentation (task = "segment") and object
detection (task = "detect"), live formatted training progress, early stopping,
automatic .pt and .onnx export, and rich S3 diagnostic visualization (plot()).
yolo_train( data = "yolo_dataset/data.yaml", model = "yolo26n-seg", epochs = 50, imgsz = 640, batch = 16, device = "auto", output_dir = pliman_model_dir(), output_name = NULL, results_dir = NULL, export_pt = TRUE, patience = 15, lr0 = 0.01, lrf = 0.01, optimizer = "auto", close_mosaic = 10, amp = NULL, plots = FALSE, workers = if (.Platform$OS.type == "windows") 0L else 4L, auto_install = TRUE, ... )yolo_train( data = "yolo_dataset/data.yaml", model = "yolo26n-seg", epochs = 50, imgsz = 640, batch = 16, device = "auto", output_dir = pliman_model_dir(), output_name = NULL, results_dir = NULL, export_pt = TRUE, patience = 15, lr0 = 0.01, lrf = 0.01, optimizer = "auto", close_mosaic = 10, amp = NULL, plots = FALSE, workers = if (.Platform$OS.type == "windows") 0L else 4L, auto_install = TRUE, ... )
data |
Path to the |
model |
Base pre-trained model architecture to fine-tune. Defaults to |
epochs |
Number of training epochs (default |
imgsz |
Input image resolution for training (default |
batch |
Batch size (default |
device |
Device to train on: |
output_dir |
Target directory to save the final exported |
output_name |
Filename of the exported model. If |
results_dir |
Directory where training plots, confusion matrices, and |
export_pt |
Logical. If |
patience |
Early stopping patience in epochs. Defaults to |
lr0 |
Initial learning rate (default |
lrf |
Final learning rate fraction (default |
optimizer |
Optimizer to use ( |
close_mosaic |
Disable mosaic augmentation in the last N epochs. Default is |
amp |
Automatic Mixed Precision (AMP). Set to |
plots |
Logical. If |
workers |
Number of worker threads for data loading. Defaults to |
auto_install |
Logical. If |
... |
Additional arguments passed directly to |
Dataset Structure Verification: Inspects bounding box and polygon coordinates in data.yaml
to confirm task configuration, automatically reconciling task mismatches (e.g. bounding box dataset with segmentation model).
Hardware Acceleration: Auto-detects NVIDIA CUDA GPUs with cuDNN acceleration, falling back gracefully to multi-threaded CPU processing.
Pre-trained Weights: Automatically verifies or downloads official pre-trained YOLO weights from NEPEM repositories.
Training Execution: Runs Ultralytics training with real-time CLI feedback, early stopping patience, and automated learning rate scheduling.
Pure Numerical Evaluation Export: Extracts tabular CSV metrics (confusion_matrix.csv,
confusion_matrix_normalized.csv, pr_curve.csv, f1_curve.csv, and results.csv)
while suppressing low-resolution matplotlib raster images.
Dual Model Export: Saves both PyTorch .pt weights (enabling future fine-tuning or transfer learning)
and optimized .onnx models (for pure C++ inference via ONNX Runtime in pliman without requiring Python).
YOLO models optimize a composite multi-task objective balancing bounding box regression, classification, boundary distribution focal loss, and (for instance segmentation) pixel-wise mask prediction:
1. Complete IoU (CIoU) Bounding Box Loss ():
Bounding box regression uses the Complete IoU loss, which penalizes bounding box overlap error, normalized distance
between center coordinates, and aspect ratio discrepancy:
where is the Euclidean distance between the center points of predicted box and ground truth box ,
is the diagonal length of the smallest enclosing bounding box covering both boxes, and quantifies aspect ratio consistency:
2. Classification Loss ():
Class probabilities are optimized using Binary Cross-Entropy (BCE) with sigmoid activation across all classes:
where represents ground truth class membership and is the predicted class probability.
3. Instance Segmentation Mask Loss ():
For segmentation models, a pixel-wise binary cross-entropy loss compares the predicted prototype mask with the ground truth binary mask across mask domain :
4. Distribution Focal Loss ():
DFL models continuous bounding box coordinates as probability distributions over discrete bins around the target edges:
where and are softmax probabilities of adjacent integer anchor bins satisfying .
This enables flexible sub-pixel boundary localization even under heavy occlusion or blurred object boundaries.
5. Cosine Annealing Learning Rate Schedule:
During the warm-up phase (), the learning rate increases linearly from 0 to .
For remaining epochs (), the learning rate decays according to a cosine annealing schedule:
where and .
An object of class yolo_train containing:
model_file: Path to the exported .onnx model ready for pliman.
pt_file: Path to the saved .pt PyTorch weights (if export_pt = TRUE).
results_dir: Directory containing training plots, metrics, and logs.
plots: Named list of file paths to generated diagnostic plots.
metrics: Data frame of per-epoch loss and mAP progressions (results.csv).
confusion_matrix: Data frame of the final confusion matrix (counts).
confusion_matrix_norm: Data frame of the normalized confusion matrix.
pr_curve: Data frame of the Precision-Recall curve.
f1_curve: Data frame of the F1 vs Confidence curve.
best_metrics: Data frame row of the best performing epoch.
epochs: Number of epochs trained.
elapsed_sec: Elapsed training time in seconds.
elapsed_formatted: Formatted training time (e.g. "3h 35m 14s").
task: Task type ("segment" or "detect").
call: Matched function call.
## Not run: library(pliman) # Train a custom coffee grain segmentation model model_res <- yolo_train( data = "dataset_cafe/data.yaml", model = "yolo26n-seg", epochs = 30, output_name = "cafe_seg.onnx" ) # Inspect training summary and plot diagnostic dashboard print(model_res) plot(model_res) # Plot specific evaluation curves: plot(model_res, which = "confusion_matrix") plot(model_res, which = "pr_curve") plot(model_res, which = "metrics") # Run inference with your new model directly in pliman! img <- image_import("cafe.jpeg") seg <- image_segment_dl(img, model = model_res$model_file, type = "highlight") ## End(Not run)## Not run: library(pliman) # Train a custom coffee grain segmentation model model_res <- yolo_train( data = "dataset_cafe/data.yaml", model = "yolo26n-seg", epochs = 30, output_name = "cafe_seg.onnx" ) # Inspect training summary and plot diagnostic dashboard print(model_res) plot(model_res) # Plot specific evaluation curves: plot(model_res, which = "confusion_matrix") plot(model_res, which = "pr_curve") plot(model_res, which = "metrics") # Run inference with your new model directly in pliman! img <- image_import("cafe.jpeg") seg <- image_segment_dl(img, model = model_res$model_file, type = "highlight") ## End(Not run)