Extracting colorschemes from images
You can extract a colorscheme from an image. For example, here's an image of a famous painting:
Use the extract()
function to create a color scheme from the original image:
using ColorSchemeTools
monalisa = extract("monalisa.jpg", 10, 15, 0.01; shrink=2)
which in this example creates a 10-color ColorScheme object (using 15 iterations and with a tolerance of 0.01; the image can be reduced in size, here by 2, before processing, to save time).
ColorSchemes.ColorScheme(ColorTypes.RGB{Float64}[
RGB{Float64}(0.0406901,0.0412985,0.0423865),
RGB{Float64}(0.823493,0.611246,0.234261),
RGB{Float64}(0.374688,0.363066,0.182004),
RGB{Float64}(0.262235,0.239368,0.110915),
RGB{Float64}(0.614806,0.428448,0.112495),
RGB{Float64}(0.139384,0.124466,0.0715472),
RGB{Float64}(0.627381,0.597513,0.340734),
RGB{Float64}(0.955276,0.775304,0.37135),
RGB{Float64}(0.497517,0.4913,0.269587),
RGB{Float64}(0.880421,0.851357,0.538013),
RGB{Float64}(0.738879,0.709218,0.441082)
], "", "")
(Extracting color schemes from images may require you to install image importing and exporting abilities. These are platform-specific. On Linux/UNIX, ImageMagick.jl can be used for importing and exporting images. Use QuartzImageIO.jl on macOS.)
Sorting color schemes
Use sortcolorscheme()
to sort a scheme non-destructively in the LUV color space:
using ColorSchemes
sortcolorscheme(ColorSchemes.leonardo)
sortcolorscheme(ColorSchemes.leonardo, rev=true)
The default is to sort colors by their LUV luminance value, but you could try specifying the :u
or :v
LUV fields instead (sorting colors is another problem domain not really addressed in this package...):
sortcolorscheme(ColorSchemes.leonardo, :u)
Weighted colorschemes
Sometimes an image is dominated by some colors with others occurring less frequently. For example, there may be much more brown than yellow in a particular image. A weighted colorscheme derived from this image can reflect this. You can extract both a set of colors and a set of numerical values or weights that indicate the relative proportions of colors in the image.
cs, wts = extract_weighted_colors("monalisa.jpg", 10, 15, 0.01; shrink=2)
The ColorScheme is now in cs
, and wts
holds the various weights of each color:
wts
10-element Array{Float64,1}:
0.0521126446851636
0.20025391828582884
0.08954703056671294
0.09603605342678319
0.09507086696018234
0.119987526821047
0.08042973071297582
0.08863381567908292
0.08599068966285295
0.09193772319937041
With the ColorScheme and the weights, you can make a new color scheme in which the more common colors take up more space in the scheme. Use colorscheme_weighted()
:
len = 50
colorscheme_weighted(cs, wts, len)
Or in one go:
colorscheme_weighted(extract_weighted_colors("monalisa.jpg" # ...
Compare the weighted and unweighted versions of schemes extracted from the Hokusai image "The Great Wave":