Category: Photo & Video

Black or white text on a colour background?

How to calculate programmatically whether black text or white text is more readable on a colour background?

Here are some algorithms to calculate the brightness of a color. The example code is written in PHP, but you should be able to adapt the code examples to any other programming language. All of the algorithmns are applied on the following color map to have a first impression how they perform.

Arithmetic Mean

f'(x)= \frac{a+b+c}{3}

In Code, this looks like:

function arithmeticMean($hex)
{
    $rgb = ColorUtils::hex2rgb($hex);
    return ($rgb[0] + $rgb[1] + $rgb[2]) / 3;
}

This results in an output for black/white text like:

This is a very simple and effective algorithm. Unfortunately it fails between the green and turquoise region:

The quick brown fox jumps over the lazy dog

Geometric Mean

f'(x)=\sqrt[n]{rgb}

In Code, this looks like:

function geometricMean($hex)
{
    var $rgb = ColorUtils::hex2rgb($hex);
    return pow($rgb[0] * $rgb[1] * $rgb[2], 1/3);
}

This results in an output for black/white text like:

Now the text is much better with the green background, but now the brightness of the yellow is wrong:

The quick brown fox jumps over the lazy dog

Quadratic Mean

f'(x)= \sqrt{\frac{r^2 +g^2+ b^2}{3}}

In Code, this looks like:

function quadraticMean($hex)
{
    var $rgb = ColorUtils::hex2rgb($hex);
    return sqrt( (pow($rgb[0], 2) + pow($rgb[1], 2) + pow($rgb[2], 2)) / 3);
}

This results in an output for black/white text like:

Works really well for all dark colours. Fails on purple.

The quick brown fox jumps over the lazy dog

HSV Value (Brightest Component)

f'(x)= max(r,g,b)

In Code, this looks like:

function valueFromHSV($hex)
{
    var $hsv = ColorUtils::hex2hsv($hex);
    return $hsv[2] * 255;
}

This results in an output for black/white text like:

Dark colours are ok, Fails when the r, g or b value is close to 0x99.

Darkest Component

f'(x)= min(r,g,b)

In Code, this looks like:

function valueFromHSV($hex)
{
    var $rgb = ColorUtils::hex2rgb($hex);
    return min($rgb[0], $rgb[1], $rgb[2]);
}

This results in an output for black/white text like:

Only the very bright colours work fine with this algorithm.

The quick brown fox jumps over the lazy dog

3D distance in RGB space

f'(x)= \sqrt{r^2 +g^2+ b^2}

In Code, this looks like:

function distanceIn3D($hex)
{
    var $rgb = ColorUtils::hex2rgb($hex);
    return sqrt( pow($rgb[0], 2) + pow($rgb[1], 2) + pow($rgb[2], 2));
}

This results in an output for black/white text like:

Worse than using the V component of the HSV representation.

The quick brown fox jumps over the lazy dog

Lightness From HSL

In Code, this looks like:

function lightnessFromHSL($hex)
{
    var $hsl = ColorUtils::hex2hsl($hex);
    return $hsl[2] * 255;
}

This results in an output for black/white text like:

The best unweighted formula. Fails on yellow around 0xeeee00.

The quick brown fox jumps over the lazy dog

Weighted W3C Formula

Natural formulas don’t take into consideration that the human eye perceives some of the primary colours darker than others.

Eg pure green(0xff0000) is perceived brighter than pure blue(0x00ff00).
According to the W3C consortium, this biased perception can be modelled with the following weights:

r *= .299
g *= .587
b *= .111
f'(x)= r\cdot0.299 +g\cdot0.587+ b\cdot0.111

In Code, this looks like:

function weightedW3C($hex)
{
    var $rgb = ColorUtils::hex2rgb($hex);
    return $rgb[0] * 0.299 + $rgb[1] * 0.587 + $rgb[2] * 0.114;
}

This results in an output for black/white text like:

Very good algorithm, works really well.
Source: http://www.w3.org/TR/AERT#color-contrast

The quick brown fox jumps over the lazy dog

Weighted Distance in 3D RGB Space

f'(x)= \sqrt{r^2\cdot0.241 +g^2\cdot0.691+ b^2\cdot0.068}

In Code, this looks like:

function weightedDistanceIn3D($hex)
{
    var $rgb = ColorUtils::hex2rgb($hex);
    return sqrt(pow($rgb[0], 2) * 0.241 + pow($rgb[1], 2) * 0.691 + pow($rgb[2], 2) * 0.068);
}

This results in an output for black/white text like:

This is an improved version of the W3C fomula.
Source: http://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx

The quick brown fox jumps over the lazy dog

ColorUtils

The used ColorUtils class above consists of methods that are used to convert colors between different color spaces. The library is available here.

If you are interested in the source code to generate the color map examples above:


Photo by Markus Spiske on Unsplash. Image map by Wikimedia Commons.

Cinematic-Look für Videoaufnahmen

Framerate

Die für das menschliche Auge angenehmste Framerate liegt bei 24fps. Daher werden Kinofilme auch meist (mit wenigen Ausnahmen) in dieser Rate gezeigt. Man sollte ein Video also gleich in dieser Framerate aufnehmen. Bei Zeitraffer- oder Slowmotion-Aufnahmen (also anderen Frameraten) ist es ratsam, diese dann mit 24fps abzuspielen.

Farbprofil

Ein C-LOG (Custom LOG) Farbprofil verwenden. C-LOG erweitert den Dynamikbereich von Schatten. Dies bedeutet, dass die Glanzlichter besser belichtet werden und der Dynamikbereich eines Videos maximiert werden kann.

Nicht alle Canon-Kameras können Videos im C-LOG Farbprofil erstellen, man kann allerdings ein Farbprofil so einstellen, um dem möglichst Nahe zu kommen:

Kamerawinkel

Neutral, also in direkter Augenhöhe des Betrachters, wirkt auch neutral. In diesem Winkel ist der Horizont etwa in der Mitte der Aufnahme.

Ein Kamerawinkel von oben auf eine Person eher erniedrigend bzw. der dargestellten Person überlegen. In diesem Winkel ist fast nur Boden zu sehen. Beachten sollte man dabei, dass der Hintergrund nicht zu unaufgeräumt bzw. dreckig aussieht, um der Aufnahme keine ungewollten Störungen einzubringen.

Im Gegensatz dazu hebt ein Kamerawinkel von unten eine Person bzw. auf ein Objekt hervor. Dieser lässt eine Person überlegen erscheinen, fast majestätisch. Hierbei ist fast nur Himmel (oder ähnliches) im Hintergrund zu sehen, was die Aufnahme auch mehr aufgeräumt und “ruhig” wirken lässt.

Was fehlt?

Du hast weitere Tipps für einen Cinematic-Look von Videoaufnahmen? Schreibe es einfach in die Kommentare.

Bildquelle unsplash.com

Ladeprobleme des Akku LP-E6 mit dem Ladegerät LC-E6 beheben

LP-E6 ist der Akku für die Canon-Modelle EOS 5D Mark III, EOS 6D, EOS 70D, …

Sollte sich ein Akku LP-E6 (egal ob es der Akku einer neuen Kamera oder ein Ersatzakku ist) mit dem dazugehörigen Ladegerät LC-E6 nicht laden lassen, dann kann das Problem möglicherweise mit den nachfolgenden Schritten selbst behoben werden:

  1. Canon Akku LP-E6 in das Canon Akkuladegerät LC-E6 einlegen und an die Steckdose anschließen. 20 Sekunden warten.
  2. Unter normalen Umständen blinkt die orangefarbene Lampe während dieser Zeit langsam (einmal pro Sekunde), und der Akkuladevorgang wird gestartet. Nehmen Sie den Akku erst dann aus dem Ladegerät, wenn der Akkuladevorgang abgeschlossen ist und die grüne Lampe leuchtet. Wenn die orangefarbene Lampe des Ladegeräts schnell blinkt, kann der Akku nicht aufgeladen werden. Bitte fahren Sie mit Schritt 3 dieser Anleitung fort.
  3. Wenn die orangefarbene Lampe schnell blinkt, entfernen Sie den Canon Akku LP-E6 aus dem Canon Akkuladegerät LC-E6. Warten Sie 10 Sekunden.
  4. Legen Sie den Canon Akku LP-E6 erneut in das Canon Akkuladegerät LC-E6 ein.
  5. Wenn die orangefarbene Lampe des Canon Akkuladegeräts LC-E6 langsam zu blinken beginnt (einmal pro Sekunde), startet der Ladevorgang.

Hinweis: Wenn die orangefarbene Leuchte erneut schnell blinkt, wiederholen Sie die Schritte 3 bis 5.  Wenn nach einem dritten Versuch der Canon Akku LP-E6 nicht aufgeladen wird, wenden Sie sich bitte an den Canon Service.