charisma provides a standardized, reproducible framework for characterizing discrete color classes in digital images of biological organisms.
charisma automatically classifies colors in images into 10
human-visible categories using a biologically-inspired Color Look-Up
Table (CLUT):
Black Β· Blue Β· Brown Β· Green Β· Grey Β· Orange Β· Purple Β· Red Β· White Β· Yellow
β¨ Fully Reproducible: Complete provenance tracking of all operations
π¨ 10 Color Classes: Biologically-relevant discrete color categories
π§ Flexible Workflows: From fully automated to completely manual
π Evolutionary Integration: Seamless compatibility with geiger,
phytools, pavo
β‘ High-Throughput: Designed for analyzing large image datasets
π Validated CLUT: Non-overlapping HSV color space partitions
charisma depends on spatial R packages that require system-level
libraries. Install these first:
macOS (via Homebrew):
brew install udunits gdal proj geosUbuntu/Debian:
sudo apt-get install libudunits2-dev libgdal-dev libgeos-dev libproj-devFedora/RedHat:
sudo dnf install udunits2-devel gdal-devel geos-devel proj-develinstall.packages("charisma")# install.packages("remotes")
remotes::install_github("shawntz/charisma")library(charisma)
# Load example image
img <- system.file(
"extdata",
"Tangara_fastuosa_LACM60421.png",
package = "charisma"
)
# Basic analysis
result <- charisma(img, threshold = 0.05)
# Visualize
plot(result)
# Interactive mode with manual curation
result_interactive <- charisma(
img,
interactive = TRUE,
threshold = 0.0
)
# Save outputs
result_saved <- charisma(
img,
threshold = 0.05,
logdir = file.path(tempdir(), "charisma_outputs")
)The charisma pipeline consists of three stages:
Uses recolorize to perform
spatial-color binning, removing noisy pixels and creating a smoothed
representation of dominant colors.
Converts RGB cluster centers to HSV and matches against the CLUT using
color2label():
color2label(c(255, 0, 0)) # "red"
color2label(c(0, 0, 255)) # "blue"
color2label(c(255, 255, 0)) # "yellow"In interactive mode:
- Merge color clusters (e.g.,
c(2,3)) - Replace pixels between clusters
- Full operation history maintained for reproducibility
The charisma object contains:
- Color classifications: Discrete labels for each cluster
- Proportions: Pixel counts and proportions per color
- Operation history: Complete log of merges and replacements
- Pavo statistics: Color pattern geometry metrics (optional)
# Load previous analysis
obj <- system.file("extdata", "Tangara_fastuosa.RDS", package = "charisma")
obj <- readRDS(obj)
# Apply different threshold
result2 <- charisma2(
obj,
new.threshold = 0.10
)
# Revert to specific state
result3 <- charisma2(
obj,
which.state = "merge",
state.index = 2
)# Create custom CLUT
my_clut <- charisma::clut # Start with default
# ... modify HSV ranges ...
# Validate completeness
validate(clut = my_clut)
# Use in analysis
result <- charisma(img, clut = my_clut)# Batch process images
results <- lapply(image_paths, function(img) {
charisma(img, threshold = 0.05)
})
# Extract color presence/absence
color_matrix <- do.call(rbind, lapply(results, summarize))
# Phylogenetic analyses with geiger
library(geiger)
fit_er <- fitDiscrete(
phylogeny,
color_matrix[, "blue"],
model = "ER"
)
fit_ard <- fitDiscrete(
phylogeny,
color_matrix[, "blue"],
model = "ARD"
)If you use charisma in your research, please cite:
Schwartz, S.T., Tsai, W.L.E., Karan, E.A., Juhn, M.S., Shultz, A.J., McCormack, J.E., Smith, T.B., and Alfaro, M.E. (2025). charisma: An R package to perform reproducible color characterization of digital images for biological studies. (In Review).
π Documentation
π Report Issues
π§ Email: [email protected]
charisma integrates with:
recolorize(Weller et al.Β 2024) - Image preprocessingpavo(Maia et al.Β 2019) - Color pattern geometry
MIT Β© 2025 Shawn T. Schwartz

