Hlavní navigace

Vlákno názorů k článku Programujeme JPEG: transformace a podvzorkování barev od Clock - Ja jsem psal dekoder JPEGu do Linkse a...

  • Článek je starý, nové názory již nelze přidávat.
  • 21. 12. 2006 13:22

    Clock (neregistrovaný)
    Ja jsem psal dekoder JPEGu do Linkse a jestli se dobre pamatuju, z JPEGu neleze YCbCr jak se tu snazi autor naznacit, ale Y'CbCr. Ono YCbCr by ani nemelo smysl protoze by pak zaokrouhlovaci chyby byly vyrazne videt na tmavych partiich a nevyrazne na bilych - takhle se to rozlozi rovnomerne.

    Kdyz si nekdo bude podle tohohle clanku myslet ze z JPEGu jde YCbCr a napise podle toho software, tak ten software bude zobrazovat JPEGy vyblite jakoby v mlze.

    Nema smysl to ani narychlo konvertovat nejakou 8-bitovou gamma korekci protoze se pak udelaj v tmavsich partiich schodovite prouzky na barevnych prechodech kvuli degradaci barevneho rozliseni.
  • 21. 12. 2006 13:38

    Pavel Tišnovský
    Kdyz se mrknete na ten druhy demonstracni priklad, tak je patrne, ze jsou tam pouzity oba typy prevodu, jak RGB->YCbCr, tak i YCbCr->RGB. K zadnym chybam tam nedochazi (samozrejme pri velikosti bloku 1x1 pixel). Slozka Y se zadnym zpusobem nemeni, podvzorkovavaji se pouze Cb a Cr.

    Ale mozna mate ma mysli "matematicke" Y'CbCr, kde se slozka Y' opravdu koriguje pomoci gamma faktoru a navic plati, ze ma rozsah pouze <16,235>, coz neni "nas" pripad, protoze zde ma Y plny rozsah <0,255>.

    Klasicka analogova Y'CbCr pouziva jine konstanty a rozsahy jsou:
    Y lezi v [0,1]
    Cb lezi v [-0.5, 0.5]
    Cr lezi v [-0.5, 0.5]

    Takovy barvovy model se nekdy oznacuje spis jako YPbPr
  • 21. 12. 2006 15:41

    anonymní
    Jasne OK, YCbCr je luma a chroma (gamma korigovane hodnoty vzhledem k fyzikalnimu poctu fotonu). Problem je ale, ze RGB -> YCbCr transformace se neda delat takhle jednoduse - to je jako predpoklada, ze (a+b)^n=a^n+b^n. Je potreba to RGB nejdriv prevyst do fotometricky reprezentace (umocnit na 2.2), v tom pak udelat to podvzorkovani 2x2, a pak to zase prevyst na YCbCr umocnenim na 0.45

    Kdyz maji sousedni pixely podobnou barvu, moc chyby tim nevznika. Kdyz maji ale rozdilnou, vznika chyba:
    http://en.wikipedia.org/wiki/Image:Color-bars-vegas-dv.gif
    Na rozhrani mezi zelenou a fialovou je pruh sedozelene, ktery je tmavsi nez jak ta zelena i ta fialova - neni mozne aby kdyz mame jasy (luma) rekneme 0.3 a 0.4, aby jejich zprumerovanim vzniklo 0.2

    "Chroma subsampling deviates from color science in that the luma and chroma components are formed as a weighted sum of gamma-corrected (tristimulus) R'G'B' components instead of linear (tristimulus) RGB components. As a result, luminance and color detail are not completely independent of one another. There is some "bleeding" of luminance and color information between the luma and chroma components. The error is greatest for highly-saturated colors and can be somewhat noticeable in between the magenta and green bars of a color bars test pattern (that has chroma subsampling applied). This engineering approximation (by reversing the order of operations between gamma correction and forming the weighted sum) allows color subsampling to be more easily implemented."

    Sice se to zda rychlejsi na implementaci, ale to se da zase nahnat tim, ze misto C++ nebo Javy budeme psat v C, jako jsem to udelal v Linksu - v Linksu se pocita vsechno ve 48-bitovym fotometrickym prostoru, vzdycky se ditheruje, a jeste je to jeden z nejrychlejsich prohlizecu, ve srovnani s temi zbylymi co to pocitaj ve 24 bitech a na gammu a takovyhle veci vetsinou kaslou.
  • 21. 12. 2006 15:58

    Pavel Tišnovský

    Jasne, tu nesmyslnost pri scitani (prumerovani) beru, pri nekterych kontrastnich prechodech (zejmena barev na opacne strane spektra) se ta chyba vizualne projevi. Asi by se tedy misto RGB melo psat sRGB, kdyz uz se teda Microsoft se zbytkem sveta dohodl na γ=2.2. Nejsem si vsak zdaleka jisty, jestli tuto korekci provadi vsechny kodery a dekodery JPEGu, neni k dispozici nejaky testovaci obrazek - takova ta typicka dvojice s ditherovanymi prechody?