jwmerrill / Color.jl

Basic color manipulation utilities.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Color

This library provides a wide array of functions for dealing with color. This includes conversion between colorspaces, measuring distance between colors, simulating color blindness, and generating color scales for graphics, among other things.

Colorspaces

What follows is a synopsis of every colorspace implemented in Color.jl. Any color value can be converted to a similar value in any other colorspace using the convert function.

E.g.

convert(RGB, HSL(270, 0.5, 0.5))

Depending on the source and destination colorspace, this may not be perfectly lossless.

RGB

The sRGB colorspace.

immutable RGB <: ColorValue
    r::Float64 # Red in [0,1]
    g::Float64 # Green in [0,1]
    b::Float64 # Blue in [0,1]
end

HSV

Hue-Saturation-Value. A common projection of RGB to cylindrical coordinates. This is also sometimes called "HSB" for Hue-Saturation-Brightness.

immutable HSV <: ColorValue
    h::Float64 # Hue in [0,360]
    s::Float64 # Saturation in [0,1]
    v::Float64 # Value in [0,1]
end

HSL

Hue-Saturation-Lightness. Another common projection of RGB to cylindrical coordinates.

immutable HSL <: ColorValue
    h::Float64 # Hue in [0,360]
    s::Float64 # Saturation in [0,1]
    l::Float64 # Lightness in [0,1]
end

XYZ

The XYZ colorspace standardized by the CIE in 1931, based on experimental measurements of color perception culminating in the CIE standard observer (see cie_color_match)

immutable XYZ <: ColorValue
    x::Float64
    y::Float64
    z::Float64
end

xyY

The xyY colorspace is another CIE standardized color space, based directly off of a transformation from XYZ. It was developed specifically because the xy chromaticity space is invariant to the lightness of the patch.

immutable xyY <: ColorValue
    x::Float64
    y::Float64
    Y::Float64
end

LAB

A percuptually uniform colorpsace standardized by the CIE in 1976. See also LUV, the associated colorspace standardized the same year.

immutable LAB <: ColorValue
    l::Float64 # Luminance in approximately [0,100]
    a::Float64 # Red/Green
    b::Float64 # Blue/Yellow
end

LUV

A perceptually uniform colorpsace standardized by the CIE in 1976. See also LAB, a similar colorspace standardized the same year.

immutable LUV <: ColorValue
    l::Float64 # Luminance
    u::Float64 # Red/Green
    v::Float64 # Blue/Yellow
end

LCHab

The LAB colorspace reparameterized using cylindrical coordinates.

immutable LCHab <: ColorValue
    l::Float64 # Luminance in [0,100]
    c::Float64 # Chroma
    h::Float64 # Hue in [0,360]
end

LCHuv

The LUV colorspace reparameterized using cylindrical coordinates.

immutable LCHuv <: ColorValue
    l::Float64 # Luminance
    c::Float64 # Chroma
    h::Float64 # Hue

DIN99

The DIN99 uniform colorspace as described in the DIN 6176 specification.

immutable DIN99 <: ColorValue
    l::Float64 # L99 (Lightness)
    a::Float64 # a99 (Red/Green)
    b::Float64 # b99 (Blue/Yellow)

DIN99d

The DIN99d uniform colorspace is an improvement on the DIN99 color space that adds a correction to the X tristimulus value in order to emulate the rotation term present in the DeltaE2000 equation.

immutable DIN99d <: ColorValue
    l::Float64 # L99d (Lightness)
    a::Float64 # a99d (Redish/Greenish)
    b::Float64 # b99d (Blueish/Yellowish)

DIN99o

Revised version of the DIN99 uniform colorspace with modified coefficients for an improved metric. Similar to DIN99d X correction and the DeltaE2000 rotation term, DIN99o achieves comparable results by optimized a*/b*rotation and chroma compression terms.

immutable DIN99o <: ColorValue
    l::Float64 # L99o (Lightness)
    a::Float64 # a99o (Red/Green)
    b::Float64 # b99o (Blue/Yellow)

LMS

Long-Medium-Short cone response values. Multiple methods of converting to LMS space have been defined. Here the CAT02 chromatic adaptation matrix is used.

immutable LMS <: ColorValue
    l::Float64 # Long
    m::Float64 # Medium
    s::Float64 # Short
end

RGB24

An RGB color represented as 8-bit values packed into a 32-bit integer.

immutable RGB24 <: ColorValue
    color::Uint32
end

Color Parsing

color(desc::String)

Parse a CSS color specification. It will parse any CSS color syntax with the exception of transparent, rgba(), hsla() (since this library has no notion of transparency), and currentColor.

All CSS/SVG named colors are supported, in addition to X11 named colors, when their definitions do not clash with SVG.

A RGB color is returned, except when the hsl() syntax is used, which returns a HSL value.

CIE Standard Observer

cie_color_match(wavelen::Real)

The CIE defines a standard observer, defining typical frequency response curve for each of the three human cones. This function returns an XYZ color corresponding to a wavelength specified in nanometers.

Chromatic Adaptation (white balance)

whitebalance{T <: ColorValue}(c::T, src_white::ColorValue, ref_white::ColorValue)

Convert a color c viewed under conditions with a given source whitepoint src_whitepoint, to appear the same under a different conditions specified by a reference whitepoint ref_white.

Color Difference

colordiff(a::ColorValue, b::ColorValue)

Evaluate the CIEDE2000 color difference formula. This gives an approximate measure of the perceptual difference between two colors to a typical viewer. A large number is returned for increasingly distinguishable colors.

colordiff(a::ColorValue, b::ColorValue, m::DifferenceMetric)

Evaluate the color difference formula specified by the supplied DifferenceMetric. Options are as follows:

DE_2000(kl::Float64, kc::Float64, kh::Float64) DE_2000()

Specify the color difference using the recommended CIEDE2000 equation, with weighting parameters kl, kc, and kh as provided for in the recommendation. When not provided, these parameters default to 1.

DE_94(kl::Float64, kc::Float64, kh::Float64) DE_94()

Specify the color difference using the recommended CIEDE94 equation, with weighting parameters kl, kc, and kh as provided for in the recommendation. When not provided, these parameters default to 1.

DE_JPC79()

Specify McDonald's "JP Coates Thread Company" color difference formula.

DE_CMC(kl::Float64, kc::Float64) DE_CMC()

Specify the color difference using the CMC equation, with weighting parameters kl and kc. When not provided, these parameters default to 1.

DE_BFD(wp::XYZ, kl::Float64, kc::Float64) DE_BFD(kl::Float64, kc::Float64) DE_BFD()

Specify the color difference using the BFD equation, with weighting parameters kl and kc. Additionally, a white point can be specified, because the BFD equation must convert between XYZ and LAB during the computation. When not specified, the constants default to 1, and the white point defaults to CIE D65.

DE_AB()

Specify the original, Euclidian color difference equation.

DE_DIN99()

Specify the Euclidian color difference equation applied in the DIN99 uniform color space.

DE_DIN99d()

Specify the Euclidian color difference equation applied in the DIN99 uniform color space.

DE_DIN99o()

Specify the Euclidian color difference equation applied in the DIN99 uniform color space.

Simulation of color deficiency ("color blindness")

protanopic(c::ColorValue)
deuteranopic(c::ColorValue)
tritanopic(c::ColorValue)

Three functions are provided that map colors to a reduced gamut to simulate different types of dichromacy, the loss one the three types of human photopigments. Protanopia, deuteranopia, and tritanopia are the loss of long, middle, and short wavelength photopigment, respectively.

These functions take a color and return a new, altered color is the same colorspace .

protanopic(c::ColorValue, p::Float64)
deuteranopic(c::ColorValue, p::Float64)
tritanopic(c::ColorValue, p::Float64)

Also provided are versions of these functions with an extra parameter p in [0,1], giving the degree of photopigment loss. Where 1.0 is a complete loss, and 0.0 is no loss at all.

Color Scales

distinguishable_colors(n::Integer, transform::Function, seed::ColorValue, ls::Vector{Float64}, cs::Vector{Float64}, hs::Vector{Float64})

Generate n maximally distinguishable colors in LCHab space.

The algorithm builds up the palette starting from a color seed, and choosing the other n-1 over the Cartesian product of provided possible lightness (ls), chroma (cs), and hue (hs) values.

Distinguishability is maximized with respect to the CIEDE2000 color difference formula (see colordiff), after first applying a transformation function (transform). I.e. the difference between two colors a and b is computed as colordiff(transform(a), transform(b)).

linspace(c1::ColorValue, c2::ColorValue, n=100)

Generates n colors in a linearly interpolated ramp from c1 to c2, inclusive, returning an Array of colors

weighted_color_mean(w1::Real, c1::ColorValue, c2::ColorValue)

Returns a color that is the weighted mean of c1 and c2, where c1 has a weight 0 ≤ w1 ≤ 1.

MSC(h)

Returns the most saturated color for a given hue h (defined in LCHuv space, i.e. in range [0, 360]). Optionally the lightness l can also be given like MSC(h, l). The color is found by finding the edge of the LCHuv space for a given angle (hue).

Colormaps

colormap(cname::String [, N::Int=100; mid=0.5, logscale=false, kvs...])

Returns a predefined sequential or diverging colormap computed using the algorithm by Wijffelaars, M., et al. (2008). Optional arguments are the number of colors N, position of the middle point mid and possibility to switch to log scaling with logscale keyword.

Colormaps computed by this algorithm are ensured to have an increasing perceived depth or saturation making them ideal for data visualization. This also means that they are (in most cases) colorblind friendly and suitable for black-and-white printing.

Currently supported colormap names are:

Sequential

  • Blues
  • Greens
  • Grays
  • Oranges
  • Purples
  • Reds

Diverging

  • RdBu (from red to blue)

It is also possible to create your own colormaps by using the sequential_palette(h, [N::Int=100; c=0.88, s=0.6, b=0.75, w=0.15, d=0.0, wcolor=RGB(1,1,0), dcolor=RGB(0,0,1), logscale=false])

function that creates a sequential map for a hue h (defined in LCHuv space). Other possible parameters that you can fine-tune are:

  • N - number of colors
  • c - the overall lightness contrast [0,1]
  • s - saturation [0,1]
  • b - brightness [0,1]
  • w - cold/warm parameter, i.e. the strength of the starting color [0,1]
  • d - depth of the ending color [0,1]
  • wcolor - starting color (usually defined to be yellow)
  • dcolor - ending color (depth)
  • logscale - true/false for toggling logspacing

Two sequential maps can also be combined into a diverging colormap by using the

diverging_palette(h1, h2 [, N::Int=100; mid=0.5,c=0.88, s=0.6, b=0.75, w=0.15, d1=0.0, d2=0.0, wcolor=RGB(1,1,0), dcolor1=RGB(1,0,0), dcolor2=RGB(0,0,1), logscale=false])

where the arguments are

  • h1 - the main hue of the left side [0,360]
  • h2 - the main hue of the right side [0,360]

and optional arguments

  • N - number of colors
  • c - the overall lightness contrast [0,1]
  • s - saturation [0,1]
  • b - brightness [0,1]
  • w - cold/warm parameter, i.e. the strength of the middle color [0,1]
  • d1 - depth of the ending color in the left side [0,1]
  • d2 - depth of the ending color in the right side [0,1]
  • wcolor - starting color i.e. the middle color (warmness, usually defined to be yellow)
  • dcolor1 - ending color of the left side (depth)
  • dcolor2 - ending color of the right side (depth)
  • logscale - true/false for toggling logspacing

References

What perceptually uniform colorspaces are and why you should be using them:

Functions in this library were mostly implemented according to:

About

Basic color manipulation utilities.

License:Other