Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Code to extract colors from an image based on k-means
library(jpeg)
# Custom function similar to print.palette(...)
RenderPal <- function(x,name){
if ((missing(x)) || (missing(name))){
stop("Internal error, please troubleshoot")
}
n <- length(x)
old <- graphics::par(mar = c(0.5, 0.5, 0.5, 0.5))
on.exit(graphics::par(old))
graphics::image(1:n, 1, as.matrix(1:n), col = x,
ylab = "", xaxt = "n", yaxt = "n", bty = "n")
graphics::rect(0, 0.9, n + 1, 1.1, col = grDevices::rgb(1, 1, 1, 0.8), border = NA)
graphics::text((n + 1) / 2, 1, labels = name, cex = 2, family = "serif")
}
# -------------------------------------------------------------------------
# Read in image
img=readJPEG(...)
# find dimensions of your image
imgDm=dim(img)
# Convert image to rgb data.frame
imgRGB <- data.frame(
x = rep(1:imgDm[2], each = imgDm[1]),
y = rep(imgDm[1]:1, imgDm[2]),
R = as.vector(img[,,1]),
G = as.vector(img[,,2]),
B = as.vector(img[,,3])
)
# How many clusters?
kClusters=10
# Determine kmean cluster based on the number of clusters provided
kMean=kmeans(imgRGB[, c("R", "G", "B")], centers = kClusters)
# Extract the kmean colors
kColours <- rgb(kMean$centers[kMean$cluster,])
# Summary of colors
cols = unique(kColours)
# How are the colors distributed
sort(table(kColours)/sum(table(kColours))*100)
# What is your final palette
RenderPal(cols,"My Palette")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.