Värinvähennyskokeilut

11.11.2021

Yksi kiinnostukseni aiheista on retrotietokoneet sekä niitä varten kehitetyt graafiset formaatit ja kikat. Erityisesti kiin­nostaa kuvan esitys vähemmillä väreillä, kuin nyky­ään käy­tetään, eli kun kuvan väri­syvyys pudo­tetaan 24 bitistä johon­kin paljon mata­lampaan. Olen itse sitä ikä­polvea, joka käytti lap­suu­dessa Windows 9x:ää ja myö­hemmin XP:tä, joten valta­osa näistä asioista edeltää omaa aikaani.

En tiedä, miten englannin sanat dither ja dithering kään­net­täisiin suomeksi; Wiki­sana­kirja ehdotti "koos­tamista", mutta tämä ei kuulosta oikealta, joten käytän vain laina­sanoja ditheräys ja ditheröidä.

Alkuperäinen IBM PC, malli 5150, aloitti elämänsä kahdella grafiikka­kortti­optiolla: saatavilla oli joko yksivärinen, vain yhtä 80×25-teksti­moodia tukeva MDA (kiinteällä, muuttu­matto­malla fontilla), tai sitten kuutta­toista väriä ja monta teksti- ja grafiikka­moodia 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 (Mikro­Mikko?), kuus­nelosia, ja Amigoja. (Miten Amiga kuuluisi taivuttaa suomeksi? Amiga, Amigoja, Amigia, Amigoita? Alku­peräis­kielen feminiini a-pääte muuttuu pakosti o:ksi. Kolme­tavuiset -a-päät­tyiset substan­iivit taipuvat vissiin ole­tuksena kuten kulki­ja, kulki­jat, kulki­joiden, kulki­joita, kulki­joihin.)

CGA:ssa oli varsin järkevä 16-värinen väri­paletti teksti­moodissa ja matalan reso­luution (160×100) grafiikka­moodissa. Ruskea väri "tumman­keltaisen", sinapin­keltaisen tai lähes vihreän ( #AA0 ) luotiin 5153-mallin näytössä, eikä itse CGA-kortissa, ja kaikkien haitaksi tätä ominai­suutta ei duplikoitu uudempien korttien yhteen­sopivuus­moodien 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 tausta­värinä on musta ja toiseksi väriksi voi valita minkä tahansa näistä 16 väristä. Toisissa grafiikka­tiloissa, joiden resoluutiona on 320×200 pikseliä, voi valita vain yhden näistä kuudesta paletista (joissa musta on vaihdet­tavissa johonkin toiseen kuudesta­toista 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ä.

Neljä värillistä neliötä. Jokaisessa vasemmassa yläkulmassa on vihreä, oikeassa yläkulmassa sinertävä väri, vasemmassa alakulmassa punainen tai keltainen, oikeassa magenta tai pinkki.

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.

Samat neliöt kuin ennen, mutta joista on valittu ja laajennettu tietyt värit.

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öinti­algo­rit­milla pudottaa värineliöt näihin CGA-paletteihin. Tässä muutama kokeilu.

Mustaa, syaania, magentaa ja valkoista.

Mielenkiintoista, että algoritmi ei päättänyt muutta punaista magentan ja mustan sekoitukseksi.

Mustaa, vihreää, punaista ja keltaista.

Värivalinnat tässä on hieman kivempia.

Kaikki värit, ditheröitynä.

Kaikki 16 CGA-väriä, ditheröitynä. Värit ovat aika lähellä alkuperäistä.

Kaikki värit, ilman ditheröintiä.

Ilman ditheröintiä. Piikikkäät reunat värien välillä ovat jänniä.

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.

Musta reppu, jonka etuosassa on reikä, jota ympäröi moni liestynyt lanka.

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. ████████

Sama kuva, pienennettynä ja täysin mustavalkoisena. Sama kuva, mutta lisäksi kahdella harmaan sävyllä.

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ä.

Sama kuva, mustalla ja valkoisella ja kuudella muulla värillä. Kaikkia näitä värejä ei käytetä.

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.

Sama kuva, mustalla ja valkoisella ja kuudella muulla värillä. Kuva on värikkäämpi kuin aiempi.

Tiedostokoot ovat lähempänä 2-bittistä kuin 1-bittistä kuvaa tällä menetelmällä, ja detailia on enemmän. Eron huomaa etenkin ala­vasem­man kulman värissä; alla on suuren­noksia kysei­sestä alueesta. Suoraan 3-bittiseen palettiin ditheröitynä (keskim­mäinen rivi, vasem­man­puoleisin) algorit­milla on hanka­luuksia päättää, onko ruskea pikseli enemmän val­koinen, enemmän punainen vai enemmän keltainen, joten loppu­tuloksena alue näyttää pinkiltä. Kun R-, G- ja B-kanavat (ylä­rivin kes­kim­mäi­set kol­me) erottaa ja ditheröi erikseen (keski­rivin keskim­mäiset kolme) saadaan eri­lai­sempia dithe­röinti­kuvioita kuhunkin väri­kanavaan. Kun kanavat yhdistää (keski­rivi, oikean­puoleisin) saadaan parempia väri­approksi­maatioita, kuin toisella mene­tel­mällä. Ylä­rivin oikean­puoleisin on suu­ren­nus samasta alu­eesta kaksi­bitti­sessä kuvassa.

14 pikselöitynyttä pikkukuvaa.

Alim­malla 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 suuren­nettuna alku­peräinen mene­telmä sekä uusi mene­telmä. Huomaa, että alku­peräinen mene­telmä käytti dithe­röin­nissään magentoja pik­se­leitä ja väri­dithe­röin­nissä ei käyt­tänyt mustaa, eikä tum­missa alu­eissa käyt­tä­nyt mitään muuta kuin mus­taa tai val­koi­sta. Etenkin tämä mustan puute hei­kensi väri­approksi­maati­oita.

Kun kuvan­käsittely­ohjelman antoi itse valita värit, niin ditheröidyistä kuvista tuli paljon alkuperäistä läheisempiä. Tässä on neljällä ohjelman valitsemalla värillä.

Sama kuva, seepiansävyisillä ruskean sävyillä esitettynä.

Ja tässä kuudella­toista ohjelman valitse­malla värillä. Nopealla vilkai­sulla se näyttää alku­peräi­seltä kuvalta, niin moni sävy on nyt taas mahdol­linen. Yksityis­kohtia riittää.

Sama kuva, lähes alkuperäisen näköisenä, mutta tässä oikeasti on vain 16 tarkoin valittua väriä.

Lisää kuva­kokeiluja löytyy täältä.