Värinvähennyskokeilut
11.11.2021
Yksi kiinnostukseni aiheista on retrotietokoneet sekä niitä varten kehitetyt graafiset formaatit ja kikat. Erityisesti kiinnostaa kuvan esitys vähemmillä väreillä, kuin nykyään käytetään, eli kun kuvan värisyvyys pudotetaan 24 bitistä johonkin paljon matalampaan. Olen itse sitä ikäpolvea, joka käytti lapsuudessa Windows 9x:ää ja myöhemmin XP:tä, joten valtaosa näistä asioista edeltää omaa aikaani.
En tiedä, miten englannin sanat dither ja dithering käännettäisiin suomeksi; Wikisanakirja ehdotti "koostamista", mutta tämä ei kuulosta oikealta, joten käytän vain lainasanoja ditheräys ja ditheröidä.
Alkuperäinen IBM PC, malli 5150, aloitti elämänsä kahdella grafiikkakorttioptiolla: saatavilla oli joko yksivärinen, vain yhtä 80×25-tekstimoodia tukeva MDA (kiinteällä, muuttumattomalla fontilla), tai sitten kuuttatoista väriä ja monta teksti- ja grafiikkamoodia tukeva CGA, Color Graphics Adapter. CGA-kortin sai adapterilla kiinni NTSC-telkkariin, en sitten tiedä mitä sen kanssa täällä Euroopassa tehtiin, mutta kaipa täällä käytettiin pikemmin paikallisia PC-klooneja (MikroMikko?), kuusnelosia, ja Amigoja. (Miten Amiga kuuluisi taivuttaa suomeksi? Amiga, Amigoja, Amigia, Amigoita? Alkuperäiskielen feminiini a-pääte muuttuu pakosti o:ksi. Kolmetavuiset -a-päättyiset substaniivit taipuvat vissiin oletuksena kuten kulkija, kulkijat, kulkijoiden, kulkijoita, kulkijoihin.)
CGA:ssa oli varsin järkevä 16-värinen väripaletti tekstimoodissa ja matalan resoluution (160×100) grafiikkamoodissa. Ruskea väri "tummankeltaisen", sinapinkeltaisen tai lähes vihreän ( #AA0 ) luotiin 5153-mallin näytössä, eikä itse CGA-kortissa, ja kaikkien haitaksi tätä ominaisuutta ei duplikoitu uudempien korttien yhteensopivuusmoodien kanssa. (Kiintoisasti näyttöliitin ei ollut analoginen liitin kuin VGA, vaan digitaalinen, neljällä rinnakkaisella bitti bittipiuhalla.)
#000 | #00A | #0A0 | #0AA |
#A00 | #A0A | #A50 | #AAA |
#555 | #55F | #5F5 | #5FF |
#F55 | #F5F | #FF5 | #FFF |
Korkeimmassa 640×200 pikselin resoluutiossa taustavärinä on musta ja toiseksi väriksi voi valita minkä tahansa näistä 16 väristä. Toisissa grafiikkatiloissa, joiden resoluutiona on 320×200 pikseliä, voi valita vain yhden näistä kuudesta paletista (joissa musta on vaihdettavissa johonkin toiseen kuudestatoista väristä):
 0  |  2  |  4  |  6  |
 0  |  10  |  12  |  14  |
 0  |  3  |  5  |  7  |
 0  |  11  |  13  |  15  |
 0  |  3  |  4  |  7  |
 0  |  11  |  12  |  15  |
Nämä ovat hyvin omituisia värivalikoimia, eikä kovin hyödyllisiä. NTSC-näyttöön liitettynä tietyt pikselisarjat tuppasivat muuttumaan toisiksi varsin erilaisiksi väreiksi, mutta ilman sellaista näyttöä värit ovat varsin kauheita, ja väriavaruudet pieniä.
YUV-väriavaruudessa (ja läheisessä YCbCr-avaruudessa), jota käytetään kuvan- ja videonkäsittelyssä laajasti, kirkkaus erotetaan kaksiulotteisesta värisävystä. Värisävyn ulottuvuudet ovat punaisuus Cr ja sinisyys Cb, jotka mitataan −1:stä +1:een. Ylläolevassa kuvassa punaisuus on yläreunassa -1, alareunassa +1, ja sinisyys on vasemmassa reunassa -1, oikeassa +1. Kun molemmat koordinaatit ovat nolla, ei värisävyä ole, joten ihan keskellä neliöitä on harmaan eri sävyjä. Ainoa suure, joka muuttuu neliöiden välillä, on kirkkaussuure Y: ylävasemmalla 0.25, oikealla 0.5, alavasemmalla 0.75, oikealla 1.
Väriavaruutena YUV/YCbCr toimii ihan kivasti, ja riittävällä mietinnällä käy hyvin järkeen: vihreä on erittäin ei-punainen ja ei-sininen, sininen taas on erittäin sininen ja ei-punainen, ja pinkki on erittäin punainen, erittäin sininen ja vaalea. Koska ruskea on himmeää oranssia, niin hieman punaiset värit ovat matalilla kirkkauksilla ruskeaa, korkeammilla oranssia, ja täydellä kirkkaudella keltaisia; keltaisuus on hyvin kirkasta punaista.
Mutta jäin miettimään CGA:n palettien kummallisia värivalintoja, ja millaisia värejä ditheringillä saisi aikaan. Varsin paljon käytetty syaani-magenta-valkoinen paletti valitsee värinsä yhdeltä reunalta värineliötä, ja viher-puna-ruskea valitsee ne toiselta reunalta. Teknisesti ottaen eri värimoodissa (moodi 5, eikä 4) oleva syaani-puna-valkoinen valitsee ne vinottaisella akselilta.
Kokeilin muutamalla GIMPin tarjoamalla ditheröintialgoritmilla pudottaa värineliöt näihin CGA-paletteihin. Tässä muutama kokeilu.
Lisää näitä kuvia löytyy täältä.
Lähdin sitten kokeilemaan valokuvan ditheröintiä. Alkuperäinen valokuva on repustani, joka on tulossa tiensä päähän. Valokuvana tämä ei ole kovinkaan hieno, ja sen värimaailma on varsin suppea, mutta onpahan se ainakin kuva.
Ensiksi tein mustavalkoiset versiot. Yhdessä käytetään yhden bitin palettia, eli vain täysin mustia ja valkoisia pikseleiä, ja tosiessan on kahden bitin paletti, eli mustan ja valkoisen lisäksi kaksi harmaan sävyä: tummempi #555 ja vaaleampi #AAA. ████████
Vain kahdella lisäharmaalla saa huomattavasti enemmän yksityiskohtia.
Seuraavaksi otin kolmebittisen paletin, eli kahdeksan väriä; mustan ja valkoisen lisäksi kuusi väriä. ████████
Yksityiskohtia tuntuisi olevan vähemmän kuin neljällä harmaalla, ja värejä käytetään varsin vähän. Tiedostokokokin on pienempi, 5,6 kilotavua versus 8,9 kt. Tämä voisi ainakin osin selittyä sillä, että muunnin kuvan suoraan 3-bittiseen palettiin. Alla on versio, jossa ensiksi pilkoin kuvan puna-, viher- ja sinivärikanavat erikseen, ditheröin ne erikseen 1-bittisellä paletilla, ja sitten yhdistin ne 3-bittiseksi kuvaksi.
Tiedostokoot ovat lähempänä 2-bittistä kuin 1-bittistä kuvaa tällä menetelmällä, ja detailia on enemmän. Eron huomaa etenkin alavasemman kulman värissä; alla on suurennoksia kyseisestä alueesta. Suoraan 3-bittiseen palettiin ditheröitynä (keskimmäinen rivi, vasemmanpuoleisin) algoritmilla on hankaluuksia päättää, onko ruskea pikseli enemmän valkoinen, enemmän punainen vai enemmän keltainen, joten lopputuloksena alue näyttää pinkiltä. Kun R-, G- ja B-kanavat (ylärivin keskimmäiset kolme) erottaa ja ditheröi erikseen (keskirivin keskimmäiset kolme) saadaan erilaisempia ditheröintikuvioita kuhunkin värikanavaan. Kun kanavat yhdistää (keskirivi, oikeanpuoleisin) saadaan parempia väriapproksimaatioita, kuin toisella menetelmällä. Ylärivin oikeanpuoleisin on suurennus samasta alueesta kaksibittisessä kuvassa.
Alimmalla rivillä on alkuperäisestä menetelmästä kaikki ne pikselit, jotka eivät ole valkoisia; alkuperäinen menetelmä, mutta jossa värejä on hieman muokattu jotta punaisen ja violetin sekä keltaisen ja valkoisen erottaisi paremmin; ja vielä enemmän suurennettuna alkuperäinen menetelmä sekä uusi menetelmä. Huomaa, että alkuperäinen menetelmä käytti ditheröinnissään magentoja pikseleitä ja väriditheröinnissä ei käyttänyt mustaa, eikä tummissa alueissa käyttänyt mitään muuta kuin mustaa tai valkoista. Etenkin tämä mustan puute heikensi väriapproksimaatioita.
Kun kuvankäsittelyohjelman antoi itse valita värit, niin ditheröidyistä kuvista tuli paljon alkuperäistä läheisempiä. Tässä on neljällä ohjelman valitsemalla värillä.
Ja tässä kuudellatoista ohjelman valitsemalla värillä. Nopealla vilkaisulla se näyttää alkuperäiseltä kuvalta, niin moni sävy on nyt taas mahdollinen. Yksityiskohtia riittää.