JPEG. Kunprema algoritmo

Saluton denove! Mi trovis ĉi tiun artikolon skribitan en majo 2019. Ĉi tio estas daŭrigo de serio de artikoloj pri WAVE kaj JPEG, ĉi tie unue. Ĉi tiu publikigo inkluzivos informojn pri la bilda kodigoritmo kaj la formato mem entute.

Pinĉo de historio

Kulero da Vikipedio-artikolo:

JPEG (Joint Photographic Experts Group) estas unu el la popularaj rastrumaj grafikaj formatoj uzataj por stoki fotojn kaj similajn bildojn.

Ĉi tiu normo estis evoluigita fare de la Joint Photographic Experts Group reen en 1991 por efika bildkunpremo.

Kiel bildoj iras de krudaj al JPEG?

Iuj homoj opinias, ke JPEG-bildoj estas krudaj datumoj kunpremitaj per la Huffman-metodo, sed ĉi tio ne estas vera. Antaŭ kontrola kunpremo, datumoj vojaĝas longan vojon.

Unue, la kolormodelo estas ŝanĝita de RGB al YCbCr. Estas eĉ speciala algoritmo por ĉi tio - tie. Y ne estas tuŝita, ĉar ĝi respondecas pri brilo, kaj ĝia ŝanĝo estos rimarkebla.

La unua afero por fari kun la bildo estas "maldikiĝo" (subspecimenado). Estas facile kompreni: 2x2-a tabelo de pikseloj estas prenita, tiam Cb kaj Cr estas prenitaj - la averaĝaj valoroj de ĉiu el la YCbCr-komponentoj de ĉi tiuj 4 pikseloj. Do, ni gajnis 6 bajtojn, anstataŭ 4 Y, 4 Cb, 4 Cr ni ricevis 4 Y kaj la samajn Cb kaj Cr por ĉiu el ili (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Eĉ je skalo 2x2, perda kunpremo kun 2:1 kunprema proporcio sonas solida. Ĉi tio validas por la tuta bildo. Kaj tiel - ili falis duonon de grandeco. Kaj ni povas uzi ĉi tiun teknikon danke al nia kolorpercepto. Homo facile rimarkos diferencon en brilo, sed ne en koloro, se ĝi estas averaĝata super malgranda bloko de pikseloj. Maldikiĝo ankaŭ povas esti farita en linio, 4 pikseloj horizontale kaj vertikale. La unua opcio estas uzata pli ofte. Se bildkvalito estas grava, tiam malkresko tute ne estas farita.
Vida ilustraĵo de maldikiĝo (Habr ne permesis al mi enmeti gifon) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

La ĉefa parto de la preparado

Dkp

Nun venas la plej malfacila kaj plej necesa parto. La tuta bildo estas dividita en 8x8 blokojn (plenigo estas uzata se la rezolucio ne estas oblo de la blokflanko).

Nun apliki al ĉiu bloko DCT (Diskreta Kosinusa Transformo). En ĉi tiu parto, ĉio nenecesa estas prenita el la bildo. Uzante DCT, vi devas kompreni ĉu donita bloko (8×8) priskribas iun monotonan parton de la bildo: la ĉielo, la muro; aŭ ĝi enhavas kompleksan strukturon (haroj, simboloj, ktp.). Estas logike, ke 64 pikseloj de simila koloro povas esti priskribitaj per nur 1, ĉar la blokgrandeco jam estas konata. Tiom pri la kunpremo: 64 ĝis 1.

DCT turnas la blokon en spektron, kaj kie la valoroj ŝanĝiĝas akre, la koeficiento iĝas pozitiva, kaj ju pli akra la transiro, des pli alta la produktaĵo estos. Kie la koeficiento estas pli alta, la bildo montras klarajn transirojn en koloro kaj brilo, kie ĝi estas pli malalta - malfortaj (glataj) ŝanĝoj en la valoroj de la YCbCr-komponentoj en la bloko.

Kvantigo

Kunpremaj agordoj jam estas aplikataj ĉi tie. Ĉiu el la koeficientoj en ĉiu el la 8x8 matricoj estas dividita per certa nombro. Se vi ne reduktos la bildkvaliton post ĉiuj ĝiaj modifoj, tiam la dividanto devus esti unu. Se la memoro okupata de ĉi tiu foto estas pli grava por vi, tiam la dividanto estos pli granda ol 1, kaj la kvociento estos rondigita. Montriĝas, ke post rondigo oni ofte finiĝas kun multaj nuloj.

Kvantigo estas farita por krei la eblecon de eĉ pli granda kunpremado. Jen kiel ĝi aspektas uzante la ekzemplon de kvantigado de la grafeo y = sin(x):

JPEG. Kunprema algoritmo

Kunpremo

Unue ni trapasas la matricon en zig-zaga ŝablono:

JPEG. Kunprema algoritmo

Ni ricevas unudimensian tabelon kun nombroj. Ni vidas, ke estas multaj nuloj en ĝi, ili povas esti forigitaj. Por fari tion, anstataŭ vico de multaj nuloj, ni enmetas 1 nulon kaj post ĝi nombron indikantan ilian nombron en la sinsekvo. Tiel vi povas restarigi al 1/3 la grandeco de la tuta tabelo. Kaj tiam ni simple kunpremas ĉi tiun tabelon uzante la Huffman-metodon kaj skribas ĝin en la dosieron mem.

Kie estas uzata

Ĉie. Kiel PNG, JPEG estas uzata en fotiloj, OS-oj (kiel firmaaj emblemoj, aplikaj ikonoj, bildetoj) kaj en ĉiuj eblaj areoj kie bildoj devas esti efike konservitaj.

konkludo

Nuntempe la scio pri JPEG estas nun valora nur por edukaj celoj, ĉar ĝi estas jam ĉie enkonstruita kaj optimumigita de grandaj grupoj de homoj, sed la granito de scienco ankoraŭ estas bongusta.

Fontoj

Artikolo pri YCbCr en Vikipedio
Vikipedia artikolo pri JPEG
Iom pri PrEP el la afiŝo de Pikabu
Vikipedia artikolo pri PrEP

fonto: www.habr.com

Aldoni komenton