Любое растравае малюнак можна ўявіць у выглядзе двухмернай матрыцы. Калі гаворка заходзіць аб колерах, ідэю можна развіць, разглядаючы малюнак у выглядзе трохмернай матрыцы, У якой дадатковыя вымярэння выкарыстоўваюцца для захоўвання дадзеных па кожным з кветак.
Калі разглядаць выніковы колер як камбінацыю т.зв. асноўных колераў (чырвонага, зялёнага і сіняга), у нашай трохмернай матрыцы вызначаем тры плоскасці: першая для чырвонага колеру, другая для зялёнага і апошняя для сіняга.
Будзем называць кожную кропку ў гэтай матрыцы пікселем (элементам выявы). Кожны піксель змяшчае інфармацыю аб інтэнсіўнасці (звычайна ў выглядзе лікавага значэнне) кожнага колеру. Напрыклад, чырвоны піксель азначае, што ў ім 0 зялёнага колеру, 0 сіняга і максімум чырвонага. Піксель ружовага колеру можа быць сфарміраваны з дапамогай камбінацыі трох колераў. Выкарыстоўваючы лікавы дыяпазон ад 0 да 255, ружовы піксель вызначаецца як Чырвоны = 255, Зялёны = 192 и Сіні = 203.
Артыкул апублікаваны пры падтрымцы кампаніі EDISON.
Для прадстаўлення кветак, з якіх складаецца выява, ёсць нямала і іншых мадэляў. Напрыклад, можна выкарыстоўваць індэксаваную палітру, у якой запатрабуецца толькі адзін байт для падання кожнага пікселя, замест трох, неабходных пры выкарыстанні мадэлі RGB. У такой мадэлі можна выкарыстоўваць 2D-матрыцу замест 3D-матрыцы для падання кожнага колеру. Гэта эканоміць памяць, але дае меншую каляровую гаму.
RGB
Напрыклад, зірніце на гэтую карцінку ніжэй. Першы твар поўнасцю афарбаваны. Іншыя - гэта чырвоная, зялёная і сіняя плоскасці (інтэнсіўнасць адпаведных кветак паказана ў градацыі шэрага).
Бачым, што адценні чырвонага ў арыгінале будуць у тых жа месцах, у якіх назіраюцца самыя яркія часткі другой асобы. У той час як уклад сіняга колеру ў асноўным можна ўбачыць толькі ў вачах Марыё (апошняе твар) і элементах яго адзення. Звярніце ўвагу, куды ўсе тры каляровыя плоскасці ўносяць найменшы ўклад (самыя цёмныя часткі малюнкаў) - гэта ў вусы Марыё.
Для захоўвання інтэнсіўнасці кожнага колеру патрабуецца вызначанай колькасці бітаў - гэтая велічыня завецца бітавай глыбінёй. Дапушчальны, марнуецца 8 біт (зыходзячы са значэння ад 0 да 255) на адну каляровую плоскасць. Тады маем глыбіню колеру ў 24 біта (8 біт * 3 плоскасці R/G/B).
Іншая ўласцівасць малюнка - гэта дазвол, якое прадстаўляе з сябе колькасць пікселяў у адным вымярэнні. Часцяком пазначаецца як шырыня × вышыня, як ніжэй на малюнак-прыклады 4 на 4.
Яшчэ адна ўласцівасць, з якой маем справу пры рабоце з выявамі/відэа — гэта суадносіны бакоў, якое апісвае звычайную прапарцыйную ўзаемасувязь паміж шырынёй і вышынёй выявы або пікселя.
Калі кажуць, што нейкі фільм ці карцінка маюць памер 16 на 9, звычайна маецца на ўвазе суадносіны бакоў дысплея (DAR - ад Суадносіны бакоў экрана). Аднак часам могуць быць розныя формы асобных пікселяў – у гэтым выпадку гаворка ідзе пра суадносінах пікселяў (PAR - ад Pixel Aspect Ratio).
Гаспадыні на нататку: DVD адпавядае DAR 4 на 3
Хоць рэальны дазвол DVD складае 704х480, тым не менш яно захоўвае суадносіны бакоў 4:3, паколькі PAR мае значэнне 10:11 (704х10 / 480х11).
Ну і, нарэшце, можам вызначыць відэа як паслядоўнасць з n кадраў за перыяд часу, якое можна лічыць дадатковым вымярэннем. А n тады - гэта частата кадраў або колькасць кадраў у секунду (FPS - ад Кадраў у секунду).
Колькасць біт у секунду, неабходнае для паказу відэа, з'яўляецца яго хуткасцю перадачы - бітрэйтам.
бітрэйт = шырыня * вышыня * біт глыбіня * кадраў у секунду
Напрыклад, для відэа з 30 кадрамі ў секунду, 24 бітамі на піксель, дазволам 480×240 запатрабуецца 82,944,000 біт у секунду ці 82,944 Мбіт/з (30×480x240x24) – але гэта калі не выкарыстоўваецца які-небудзь з метадаў сціску.
Калі хуткасць перадачы амаль пастаянная, то яна называецца сталай хуткасцю перадачы (ЦБР - ад constant bit rate). Але яна таксама можа і вар'іравацца, у гэтым выпадку называецца зменнай хуткасцю перадачы (VBR - ад зменны бітрэйт).
Гэты графік дэманструе абмежаваны VBR, калі марнуецца не занадта шмат бітаў у выпадку цалкам цёмнага кадра.
Першапачаткова інжынеры распрацавалі метад падваення ўспрыманай частаты кадраў відэадысплея без выкарыстання дадатковай паласы прапускання. Гэты спосаб вядомы як празрадковае відэа; у асноўным, ён адпраўляе палову экрана ў першым "кадры", а іншую палову - у наступным "кадры".
У цяперашні час візуалізацыя сцэн, у асноўным, адбываецца з выкарыстаннем тэхналогіі прагрэсіўнага сканавання. Гэта спосаб адлюстравання, захоўванні ці перадачы якія рухаюцца малюнкаў, у якім усе лініі кожнага кадра прамалёўваюцца паслядоўна.
Ну што ж! Цяпер мы ў курсе, як малюнак уяўляецца ў лічбавым выглядзе, як уладкованыя яго колеру, колькі біт у секунду мы трацім, каб паказаць відэа, калі хуткасць перадачы пастаянная (CBR) або пераменная (VBR). Ведаем пра зададзены дазвол з выкарыстаннем зададзенай частаты кадраў, азнаёміліся са шматлікімі іншымі тэрмінамі, такія як празрадковае відэа, PAR і некаторымі іншымі.
Выдаленне надмернасці
Вядома, што відэа без сціску нармальна выкарыстоўваць немагчыма. Гадзіннае відэа з дазволам 720p і частатой 30 кадраў у секунду займала б 278 Гб. Да такога значэння прыходзім, перамножыўшы 1280 x 720 x 24 x 30 x 3600 (шырыня, вышыня, біты на піксель, FPS і час у секундах).
Выкарыстанне алгарытмаў сціску без страт, накшталт DEFLATE (выкарыстоўваецца ў PKZIP, Gzip і PNG), не дасць дастатковага памяншэння неабходнай паласы прапускання. Даводзіцца шукаць іншыя спосабы сціску відэа.
Для гэтага можна выкарыстоўваць асаблівасці нашага зроку. Мы лепш адрозніваем яркасць, чым колеры. Відэа гэта набор паслядоўных малюнкаў, якія паўтараюцца з часам. Паміж суседнімі кадрамі адной сцэны адрозненні невялікія. Акрамя таго, кожны кадр утрымоўвае шмат абласцей, якія выкарыстоўваюць адзін і той жа (або падобны) колер.
Колер, яркасць і нашы вочы
Нашы вочы больш адчувальныя да яркасці, чым да колеру. Вы можаце пераканацца ў гэтым самі, паглядзеўшы на гэтую карцінку.
Калі вы не бачыце, што ў левай палове выявы колеру квадратаў A и B на самой справе аднолькавыя, то гэта нармальна. Наш мозг прымушае нас надаваць больш увагі святлаценю, а не колеру. З правага боку паміж азначанымі квадратамі ёсць перамычка таго ж колеру - таму мы (г.зн. наш мозг) лёгка вызначаем, што, насамрэч, там адзін і той жа колер.
Давайце разбяром (спрошчана) як працуюць нашы вочы. Вока - складаны орган, які складаецца з многіх частак. Аднак нас больш за ўсё цікавяць колбачкамі і палачкі. Вока змяшчае каля 120 мільёнаў палачак і 6 мільёнаў колбачак.
Разгледзім успрыманне колеру і яркасці як асобныя функцыі пэўных частак вока (насамрэч, усё ідзе некалькі складаней, але мы спросцім). Палачковыя клеткі, у асноўным, адказваюць за яркасць, у той час як колбачкавыя клеткі адказваюць за колер. Колбачкі падпадзяляюцца на тры тыпу, у залежнасці ад які змяшчаецца пігмента: S-колбачкі (сіні колер), M-колбачкі (зялёны колер) і L-колбачкі (чырвоны колер).
Паколькі ў нас значна больш палачак (яркасць), чым колбачак (колер), можна зрабіць выснову, што мы больш здольныя адрозніваць пераходы паміж цемрай і святлом, чым колеры.
Функцыі кантраснай адчувальнасці
Даследнікі эксперыментальнай псіхалогіі і шматлікіх іншых абласцей распрацавалі мноства тэорый чалавечага зроку. І адна з іх называецца функцыямі кантраснай адчувальнасці. Яны звязаны з прасторавым і часовым асвятленнем. Калі коратка, то гаворка пра тое, колькі патрабуецца змен, перш чым назіральнік іх заўважыць. Звярніце ўвагу на множны лік слова "функцыя". Гэта злучана з тым, што мы можам вымяраць функцыі адчувальнасці да кантрасту не толькі да чорна-белага малюнка, але і каляроваму. Вынікі гэтых эксперыментаў паказваюць, што ў большасці выпадкаў нашы вочы больш адчувальныя да яркасці, чым да колеру.
Раз вядома, што мы больш адчувальныя да яркасці выявы, можна паспрабаваць выкарыстаць гэты факт.
Каляровая мадэль
Мы крышку разабраліся, як працаваць з каляровымі выявамі, выкарыстоўваючы RGB-схему. Ёсць і іншыя мадэлі. Існуе мадэль, якая адлучае яркасць ад каляровасці і яна вядомая як YCbCr. Дарэчы, ёсць і іншыя мадэлі, якія робяць аналагічны падзел, але мы разгледзім толькі гэтую.
У гэтай каляровай мадэлі Y - гэта прадстаўленне яркасці, а таксама выкарыстоўваюцца два каляровых канала: Cb (насычаны сіні) і Cr (насычаны чырвоны). YCbCr можа быць атрыманы з RGB, роўна як магчыма і зваротнае пераўтварэнне. Выкарыстоўваючы гэтую мадэль, мы можам ствараць поўнакаляровыя выявы, як бачым ніжэй:
Пераўтварэнне паміж YCbCr і RGB
Хтосьці запярэчыць: як магчыма атрымаць усе колеры, калі не выкарыстоўваецца зялёны?
Каб адказаць на гэтае пытанне, пераўтворым RGB у YCbCr. Скарыстаемся каэфіцыентамі, прынятымі ў стандарце БТ.601, які быў рэкамендаваны падраздзяленнем МСЭ-Р. Гэта падраздзяленне вызначае стандарты лічбавым відэа. Напрыклад: што такое 4K? Якія павінны быць частата кадраў, адрознівальная здольнасць, каляровая мадэль?
Спачатку вылічым яркасць. Скарыстаемся канстантамі, прапанаваныя МСЭ, і заменім значэнні RGB.
Y = 0.299R 0.587 +G 0.114 +B
Пасля таго, як мы атрымалі яркасць, аддзелім сіні і чырвоны колер:
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
І мы таксама можам пераўтварыць назад і нават атрымаць зялёны з дапамогай YCbCr:
R = Y 1.402 +Cr
B = Y 1.772 +Cb
G = Y - 0.344Cb - 0.714Cr
Як правіла, дысплеі (маніторы, тэлевізары, экраны і т. д.) выкарыстоўваюць толькі мадэль RGB. Але гэтая мадэль можа быць арганізавана па-рознаму:
Каляровая субдыскрэтызацыя
З выявай, прадстаўленым у выглядзе камбінацыі яркасці і каляровасці, мы можам выкарыстоўваць больш высокую адчувальнасць чалавечай глядзельнай сістэмы да яркасці, чым да каляровасці, калі будзем выбарачна выдаляць інфармацыю. Каляровая субдыскрэтызацыя - гэта метад кадавання малюнкаў, з выкарыстаннем меншага дазволу для каляровасці, чым для яркасці.
Наколькі дапушчальна памяншаць дазвол каляровасці?! Аказваецца, ужо ёсць некаторыя схемы, якія апісваюць, як апрацоўваць дазвол і зліццё (Выніковы колер = Y + Cb + Cr ).
Гэтыя схемы вядомыя як сістэмы субдыкрэтызацыі і выяўляюцца ў выглядзе 3-разовага суадносін - a:x:y, Якое вызначае колькасць выбарак яркасных і цветоразностных сігналаў.
a - Эталон гарызантальнай выбаркі (як правіла, роўны 4) x - Колькасць выбарак каляровасці ў першым радку пікселяў (гарызантальнае дазвол у адносінах да a) y - колькасць змен выбарак каляровасці паміж першым і другім радкамі пікселяў.
Выключэнне складае 4:1:0, Якое забяспечвае адну выбарку каляровасці ў кожным блоку дазволу яркасці 4 на 4.
Агульныя схемы, якія выкарыстоўваюцца ў сучасных кодэках:
4:4:4 (без субдыкрэтызацыі)
4:2:2
4:1:1
4:2:0
4:1:0
3:1:1
YCbCr 4: 2: 0 - прыклад зліцця
Вось аб'яднаны фрагмент выявы з выкарыстаннем YCbCr 4:2:0. Звярніце ўвагу, што мы трацім толькі 12 біт на піксель.
Вось так выглядае адна і тая ж выява, закадаванае асноўнымі тыпамі каляровай субдыскрэтызацыі. Першы шэраг - гэта канчатковы YCbCr, ніжні шэраг паказвае дазвол каляровасці. Вельмі годныя вынікі, улічваючы невялікія страты ў якасці.
Памятаеце, мы налічылі 278 Гб дыскавай прасторы для захоўвання гадзіннікавага відэафайла з дазволам 720p і 30 кадрамі за секунду? Калі скарыстаемся YCbCr 4:2:0, то гэты памер скароціцца напалову – 139 Гб. Пакуль усё роўна далёка да прымальнага выніку.
Вы можаце самі атрымаць гістаграму YCbCr з дапамогай FFmpeg. У гэтым малюнку сіняе пераважае над чырвоным, што добра відаць на самой гістаграме.
Каляровасць, яркасць, каляровая гама - відэаагляд
Рэкамендуецца да прагляду вось гэтае ачмуральнае відэа. Тут тлумачыцца, што такое яркасць, ды і наогул расстаўлены ўсе кропкі над ё аб яркасці і колеры.
Тыпы кадраў
Рухаемся далей. Паспрабуем ухіліць надмернасць па часе. Але спачатку давайце вызначым некаторую базавую тэрміналогію. Дапусцім, у нас ёсць фільм з 30 кадрамі ў секунду, вось яго першыя 4 кадры:
Мы можам бачыць шмат паўтораў у кадрах: напрыклад, сіні фон, які не змяняецца ад кадра да кадра. Каб вырашыць гэтую праблему, мы можам абстрактна класіфікаваць іх як тры тыпы кадраў.
I-кадр (Intro Frame)
I-кадр (кадр-спасылка, ключавы кадр, унутраны кадр) з'яўляецца аўтаномным. Па-за залежнасцю ад таго, што трэба візуалізаваць, I-кадр з'яўляецца, у сутнасці, статычнай фатаграфіяй. Першы кадр звычайна з'яўляецца I-кадрам, аднак будзем рэгулярна назіраць I-кадры і сярод далёка не першых кадраў.
P-кадр (Predicted Frame)
P-кадр (прагназуемы кадр) выкарыстоўвае перавагу таго факту, што амаль заўсёды бягучае выява можа быць прайграна з выкарыстаннем папярэдняга кадра. Напрыклад, у другім кадры адзінай зменай з'яўляецца мяч, які рухаецца наперад. Мы можам атрымаць кадр 2 проста крыху відазмяніўшы кадр 1, толькі выкарыстоўваючы розніцу паміж гэтымі кадрамі. Для пабудовы кадра 2 спасылаемся на папярэдні яму кадр 1.
←
B-кадр (Bi-predictive Frame)
А як наконт спасылак не толькі на мінулыя, а заадно і на будучыя кадры, каб забяспечыць яшчэ лепшы сціск?! Гэта, у асноўным і ёсць B-кадр (двунакіраваны кадр).
← →
Прамежкавы вывад
Гэтыя тыпы кадраў выкарыстоўваюцца для забеспячэння найлепшага сціску. Мы разбяром, як гэта адбываецца, у наступным раздзеле. А пакуль адзначым, што найболей "дарагім" па затрачанай памяці з'яўляецца I-кадр, P-кадр абыходзіцца прыкметна танней, а вось самым выгодным варыянтам для відэа з'яўляецца B-кадр.
Часавая надмернасць (міжкадравае прагназаванне)
Давайце разгледзім якія ў нас ёсць магчымасці для мінімізацыі паўтораў па часе. Гэты тып надмернасці вырашым з дапамогай метадаў узаемнага прагназавання.
Паспрабуем выдаткаваць як мага менш бітаў для кадавання паслядоўнасці кадраў 0 і 1.
Мы можам зрабіць адніманне, проста адымаем кадр 1 з кадра 0. Атрымліваем кадр 1, толькі выкарыстоўваны розніцу паміж ім і папярэднім кадрам, фактычна кадуем толькі атрымоўваны астатак.
Але што, калі я вам скажу, што есць яшчэ больш лепшы метад, які выкарыстоўвае яшчэ менш бітаў?! Спачатку давайце разаб'ём frame 0 на дакладную сетку, якая складаецца з блокаў. А затым паспрабуем супаставіць блокі з кадра 0 з кадрам 1. Іншымі словамі, ацэнім рух паміж кадрамі.
З Вікіпедыі блокавая кампенсацыі руху
Блокавая кампенсацыя руху дзеліць бягучы кадр на неперасякальныя блокі і вектар кампенсацыі руху паведамляе, паходжанне блокаў (распаўсюджаная памылка складаецца ў тым, што папярэдні кадр дзеліцца на неперасякальныя блокі, а вектары кампенсацыі руху паведамляюць, куды пераходзяць гэтыя блокі. А фактычна наадварот - аналізуецца не папярэдні кадр, а наступны, высвятляецца не куды перамяшчаюцца блокі, а адкуль яны з'явіліся). Звычайна зыходныя блокі перакрываюцца ў зыходным кадры. Некаторыя алгарытмы сціску відэа збіраюць бягучы кадр з частак нават не аднаго, а адразу некалькіх раней перададзеных кадраў.
У працэсе ацэньвання бачым, што шар перамясціўся з (x= 0, y=25) на (x= 6, y=26), значэння x и y вызначаюць вектар руху. Яшчэ адзін крок, які мы можам зрабіць, каб захаваць біты, - гэта кадзіраваць толькі рознасць вектараў руху паміж апошняй пазіцыяй блока і прагназуемай, таму канчатковы вектар руху будзе (x=6-0=6, y=26-25=1).
У рэальнай сітуацыі гэты шарык быў бы падзелены на n блокаў, але сутнасці справы гэта не мяняе.
Аб'екты ў кадры перамяшчаюцца ў трох вымярэннях, таму пры руху шарыка ён можа стаць візуальна менш (ці больш, калі рухаецца ў бок гледача). Гэта нармальна, што не будзе ідэальнай адпаведнасці паміж блокамі. Вось сумешчаны від нашай ацэнкі і рэальнай карціны.
Але бачым, што калі ўжываем адзнаку руху, дадзеных для кадавання прыкметна менш, чым пры выкарыстанні прасцейшага метаду вылічвання дэльты паміж кадрамі.
Як будзе выглядаць рэальнае кампенсаванне руху
Гэтая методыка прымяняецца адразу да ўсіх блокаў. Часцяком наш умоўны які рухаецца мячык будзе разбіты адразу на некалькі блокаў.
Вы можаце самі памацаць гэтыя канцэпцыі, выкарыстоўваючы Юпітэр.
Каб убачыць вектары руху можна стварыць відэа з вонкавым прадказаннем з дапамогай ffmpeg.
Яшчэ можна скарыстацца Intel Video Pro Analyzer (ён платны, але ёсць бясплатная пробная версія, якая абмежавана толькі першымі дзесяццю кадрамі).
Прасторавая надмернасць (унутраны прагноз)
Калі прааналізаваць кожны кадр у відэа, то выявім мноства ўзаемазлучаных абласцей.
Пройдземся па гэтым прыкладзе. Гэтая сцэна ў асноўным складаецца з сіняга і белага колераў.
Гэта першы кадр. Папярэднія кадры для прагназавання ўзяць не можам, але атрымаецца яго сціснуць. Закадуем вылучэнне чырвонага блока. Калі мы паглядзім на яго суседзяў, то заўважаем, што вакол яго ёсць сякія-такія каляровыя тэндэнцыі.
Мяркуем, што ў кадры колеры распаўсюджваюцца па вертыкалі. Што азначае, што колер невядомых пікселяў будуць змяшчаць значэнні яго суседзяў.
Такі прагноз можа аказацца і няслушным. Менавіта па гэтай прычыне трэба прымяніць гэты метад (унутраны прагноз), а затым яшчэ адняць рэальныя значэння. Гэта дасць нам рэшткавы блок, што прывядзе да значна больш сціснутай матрыцы ў параўнанні з арыгіналам.
Калі жадаеце папрактыкавацца з унутранымі прадказаннямі, то можаце стварыць відэа з макраблокамі і іх прадказаннямі з дапамогай ffmpeg. Каб зразумець значэнне кожнага колеру блока давядзецца азнаёміцца з дакументацыяй ffmpeg.
Ці ж можна выкарыстоўваць Intel Video Pro Analyzer (як я ўжо згадваў вышэй, у выпрабавальнай бясплатнай версіі абмежаванне на першыя 10 кадраў, але вам гэтага на першую пару хопіць).