Nelineárna citlivosť ľudského oka

Page

Stránky / LED /

Ľudské oko nemá rovnakú citlivosť na zmenu jasu. Prejaví sa to tak, že ak si pomocou Arduina odskúšame PWM na LED medzi hodnotami 0 a 255, budeme mať pocit, že sa LED strašne rýchlo rozsvieti a na konci už prakticky nevidíme rozdiel v zmene jasu. Toto vnímanie ľudského oka môžeme ćiastočne kompenzovať vhodne upravenými hodnotami jasu.

for(int i=0;i<255;i++) {
  analogWrite(3,i);
  delay(10);
}

Toto možno upraviť pomocou exponenciálnej zmeny jasu. V zjednodušenej podobe možno algoritmus zapísať takto.

for(int i=0;i<255;i++) {
  analogWrite(3,funkcia_exponencialna(i));
  delay(10);
}

Pôvodne som chcel napísať celý program na simulovanie tohoto javu pomocou dvoch LED. Na jednej by sa zobrazoval pôvodný algoritmus a na druhej modifikovaný. Ale potom som našiel presne to isté napísané v knihe Michaela Margolisa Arduino Cookbook v kapitole 17.3 Storing and Retrieving Numeric Values in Program Memory.

V tejto ukážke vidíme dve LED, ovládané pomocou PWM. LED vľavo má nastavený jas lineárne od 0 po 255. LED vpravo ju má nastavenú nelineárne, tak aby bola viac prispôsobená citlivosti ľudského oka. Veľmi zreteľne vidíme, že pri lineárnej zmene máme pocit, že sa LED rozsvieti náhle a počas väčšiny času ju vnímame ako trvale svietiacu, aj keď technicky to tak nie je.

Môj fotoaparát nie je úplne nadšený z prudkej zmeny jasu na diódach, takže video nie je dokonalé, ale na urobenie predstavy o tom, čo sa tam deje to hádam postačí.

Zdrojový kód

Zdrojový kód programu k ukážeke je prístupný na GitHub.


13.07.2016


Menu