Secondo capitolo:
Qualsiasi immagine raster può essere rappresentata come una matrice bidimensionale . Quando parliamo di colori, l'idea può essere sviluppata considerando l'immagine comeuna matrice tridimensionale , dove le dimensioni aggiuntive vengono utilizzate per memorizzare i dati per ciascun colore.Se consideriamo il colore finale come una combinazione dei cosiddetti colori primari (rosso, verde e blu), nella nostra matrice tridimensionale definiamo tre piani: il primo per il colore rosso, il secondo per il verde e l'ultimo per il blu.
Chiamiamo ogni punto in questa matrice pixel (elemento dell'immagine). Ogni pixel contiene informazioni sull'intensità (solitamente sotto forma di valore numerico) di ciascun colore. Ad esempio,
un pixel rosso significa che contiene 0 verde, 0 blu e massimo rosso. Un pixel di colore rosa può essere formato utilizzando una combinazione dei tre colori. Utilizzando un intervallo numerico da 0 a 255, un pixel rosa è definito come Rosso = 255 Verde = 192, Blu = 203 e L'articolo è pubblicato con il supporto di EDISON..
Sviluppiamoapplicazioni per videosorveglianza, streaming video della registrazione video in sala operatoria .
Per rappresentare i colori di cui è composta l'immagine, ci sono molte altre modalità. Ad esempio, si può utilizzare una palette indicizzata, dove è sufficiente un solo byte per rappresentare ciascun pixel, invece dei tre necessari utilizzando il modello RGB. In questo modello si può utilizzare una matrice 2D al posto di una matrice 3D per rappresentare ciascun colore. Questo risparmia memoria, ma offre una gamma di colori ridotta.
RGB

Ad esempio, guarda questa immagine qui sotto. Il primo volto è completamente colorato. Gli altri sono i piani di rosso, verde e blu (l'intensità dei colori corrispondenti è mostrata in scala di grigi).
Vediamo che le sfumature di rosso nell'originale saranno negli stessi luoghi in cui si osservano le parti più luminose del secondo volto. Mentre il contributo del blu può essere visto principalmente solo negli occhi di Mario (l'ultimo volto) e negli elementi del suo abbigliamento. Nota dove tutti e tre i piani colorati contribuiscono di meno (le parti più scure delle immagini) — sono nei baffi di Mario.

Per memorizzare l'intensità di ciascun colore è necessario un certo numero di bit — questa grandezza è chiamata
profondità di colore . Supponiamo di impiegare 8 bit (partendo da un valore da 0 a 255) per un piano di colore. Allora abbiamo una profondità di colore di 24 bit (8 bit * 3 piani R/G/B).Un'altra proprietà dell'immagine è
la risoluzione , che rappresenta il numero di pixel in una dimensione. Spesso è indicata comelarghezza × altezza , come in questo esempio di immagine 4 per 4.Un'altra proprietà con cui ci confrontiamo quando lavoriamo con immagini/video è

il rapporto d'aspetto , che descrive la relazione proporzionale normale tra larghezza e altezza dell'immagine o del pixel.Quando si dice che un certo film o immagine ha una dimensione di 16 per 9, di solito si fa riferimento a
rapporto d'aspetto del display DAR (Display Aspect Ratio — da rapporto di pixelPAR Pixel Aspect Ratio (Nota per la padrona di casa: — da DVD).


DAR 4 per 3 Sebbene la risoluzione reale del DVD sia 704×480, mantiene comunque un rapporto d'aspetto di 4:3, poiché il PAR è di 10:11 (704×10 / 480×11). corrisponde a Infine, possiamo definire
come una sequenza di
frame nel tempo video , che può essere considerato una dimensione aggiuntiva. E n poi — è la frequenza dei fotogrammi o il numero di fotogrammi al secondo ( tempoFrames per Second n Il numero di bit al secondo necessario per visualizzare un video è il suobitrate — da bitrate = larghezza * altezza * profondità di bit * fotogrammi al secondo).

Ad esempio, per un video con 30 fotogrammi al secondo, 24 bit per pixel, una risoluzione di 480×240 saranno necessari 82.944.000 bit al secondo o 82,944 Mbit/s (30x480x240x24) — ma solo se non viene utilizzato alcuno dei metodi di compressione. Se il bitrate — è quasi costante.
, allora si chiama
bitrate costante
CBR constant bit rate). Ma può anche variare, in questo caso si chiama bitrate variabile (VBR — da variable bit rateQuesto grafico mostra un VBR limitato, dove vengono utilizzati pochi bit in caso di un fotogramma completamente scuro. Inizialmente, gli ingegneri hanno sviluppato un metodo per raddoppiare la frequenza percepita del frame del display video senza utilizzare ulteriore larghezza di banda. Questo metodo è conosciuto come (video interlacciato — da bit rate variabile).
Questo grafico dimostra un VBR limitato, quando non vengono spesi troppi bit in caso di fotogramma completamente scuro.

Inizialmente, gli ingegneri hanno sviluppato un metodo per raddoppiare la frequenza percepita dei fotogrammi del display video senza utilizzare larghezza di banda aggiuntiva. Questo metodo è conosciuto come video interlacciato; principalmente, invia metà dello schermo nel primo «frame» e l'altra metà nel successivo «frame».
Attualmente, la visualizzazione delle scene avviene principalmente utilizzando la tecnologia di scansione progressiva. Questo è un metodo per visualizzare, memorizzare o trasmettere immagini in movimento in cui tutte le linee di ogni fotogramma vengono disegnate in sequenza.

Bene! Ora sappiamo come un'immagine è rappresentata digitalmente, come sono composti i suoi colori, quanti bit al secondo utilizziamo per mostrare video, sia che la velocità di trasmissione sia costante (CBR) o variabile (VBR). Abbiamo compreso la risoluzione assegnata utilizzando una determinata frequenza di fotogrammi e ci siamo familiarizzati con molti altri termini come video interlacciato, PAR e alcuni altri.
Rimozione della ridondanza
È noto che non è possibile utilizzare video non compressi in modo pratico. Un'ora di video in risoluzione 720p e a 30 fotogrammi al secondo occuperebbe 278 GB. Questo valore si ottiene moltiplicando 1280 x 720 x 24 x 30 x 3600 (larghezza, altezza, bit per pixel, FPS e tempo in secondi).
L'utilizzo di algoritmi di compressione senza perdita, come DEFLATE (utilizzato in PKZIP, Gzip e PNG), non offrirebbe una riduzione sufficiente della larghezza di banda necessaria. Dobbiamo cercare altri modi per comprimere il video.
Per fare questo, possiamo sfruttare le peculiarità della nostra visione. Riusciamo a percepire meglio la luminosità rispetto ai colori. Il video è un insieme di immagini sequentiali che si ripetono nel tempo. Tra fotogrammi adiacenti di una stessa scena, le differenze sono minime. Inoltre, ogni fotogramma contiene molte aree che utilizzano lo stesso (o simile) colore.
Colore, luminosità e i nostri occhi
I nostri occhi sono più sensibili alla luminosità che al colore. Puoi verificarlo tu stesso osservando questa immagine.

Se non riesci a vedere che nella metà sinistra dell'immagine i colori dei quadrati A e B sono in realtà uguali, va tutto bene. Il nostro cervello ci fa prestare più attenzione alle tonalità che ai colori. A destra, tra i quadrati contrassegnati, c'è un ponte dello stesso colore — quindi noi (cioè il nostro cervello) identifichiamo facilmente che in realtà c'è lo stesso colore.
Analizziamo (semplificando) come funzionano i nostri occhi. L'occhio è un organo complesso, costituito da molte parti. Tuttavia, ciò che ci interessa di più sono i coni e i bastoncelli. L'occhio contiene circa 120 milioni di bastoncelli e 6 milioni di coni.
Esaminiamo la percezione del colore e della luminosità come funzioni separate di alcune parti dell'occhio (in realtà, la situazione è un po' più complessa, ma semplificheremo). Le cellule a bastoncino sono principalmente responsabili della luminosità, mentre le cellule a cono si occupano del colore. I coni si dividono in tre tipi, a seconda del pigmento presente: coni S (blu), coni M (verde) e coni L (rosso).
Poiché abbiamo molte più cellule a bastoncino (luminosità) rispetto ai coni (colore), si può dedurre che siamo più capaci di distinguere le transizioni tra scuro e chiaro piuttosto che tra colori.
Funzioni di sensibilità al contrasto
I ricercatori di psicologia sperimentale e di molte altre aree hanno sviluppato numerose teorie sulla visione umana. E una di esse è chiamata funzioni di sensibilità al contrasto. Sono collegate all'illuminazione spaziale e temporale. In breve, si tratta di quante variazioni servono prima che l'osservatore le noti. Si noti il plurale della parola «funzione». Questo è dovuto al fatto che possiamo misurare le funzioni di sensibilità al contrasto non solo per immagini in bianco e nero, ma anche per quelle a colori. I risultati di questi esperimenti mostrano che, nella maggior parte dei casi, i nostri occhi sono più sensibili alla luminosità che al colore.
Poiché è noto che siamo più sensibili alla luminosità dell'immagine, possiamo tentare di sfruttare questo fatto.
Modello di colore
Abbiamo accennato a come lavorare con immagini a colori utilizzando lo schema RGB. Esistono anche altri modelli. Ce n'è uno che separa la luminosità dalla cromaticità ed è noto come YCbCr. A proposito, esistono altri modelli che fanno una separazione simile, ma noi ci concentreremo solo su questo.
In questo modello di colore Y — è la rappresentazione della luminosità, e vengono utilizzati due canali di colore: Cb (blu saturo) e (rosso saturo). YCbCr può essere ottenuto da RGB, così come è possibile la trasformazione inversa. Utilizzando questo modello, possiamo creare immagini a colori pieni, come vediamo qui sotto: (rosso intenso). YCbCr può essere ottenuto da RGB, così come è possibile anche la conversione inversa. Utilizzando questo modello, possiamo creare immagini a colori completi, come vediamo di seguito:

Trasformazione tra YCbCr e RGB
Qualcuno potrebbe obiettare: come è possibile ottenere tutti i colori se il verde non è utilizzato?
Per rispondere a questa domanda, convertiamo RGB in YCbCr. Utilizziamo i coefficienti stabiliti nello standard BT.601, raccomandato dall'agenzia ITU-R. Questa agenzia definisce gli standard per il video digitale. Ad esempio: che cos'è il 4K? Quali dovrebbero essere la frequenza dei fotogrammi, la risoluzione, il modello di colore?
Per prima cosa calcoliamo la luminosità. Utilizziamo le costanti proposte dall'ITU e sostituitiamo i valori RGB.
Y = 0.299R + 0.587G + 0.114B
Dopo aver ottenuto la luminosità, separiamo il colore blu e rosso:
Cb = 0.564(B — Y)
(rosso saturo). YCbCr può essere ottenuto da RGB, così come è possibile la trasformazione inversa. Utilizzando questo modello, possiamo creare immagini a colori pieni, come vediamo qui sotto: = 0.713(R — Y)
E possiamo anche convertire di nuovo e persino ottenere il verde usando YCbCr:
R = Y + 1.402(rosso saturo). YCbCr può essere ottenuto da RGB, così come è possibile la trasformazione inversa. Utilizzando questo modello, possiamo creare immagini a colori pieni, come vediamo qui sotto:
B = Y + 1.772Cb
G = Y — 0.344Cb — 0.714(rosso saturo). YCbCr può essere ottenuto da RGB, così come è possibile la trasformazione inversa. Utilizzando questo modello, possiamo creare immagini a colori pieni, come vediamo qui sotto:
In generale, i dispositivi (monitor, televisori, schermi, ecc.) utilizzano solo il modello RGB. Tuttavia, questo modello può essere organizzato in modi diversi:

Sottocampionamento del colore
Con un'immagine rappresentata come una combinazione di luminosità e crominanza, possiamo sfruttare la maggiore sensibilità della visione umana alla luminosità rispetto alla crominanza, eliminando informazioni in modo selettivo. La subsampling del colore è un metodo di codifica delle immagini che utilizza una risoluzione più bassa per la crominanza rispetto alla luminosità.

Fino a che punto è accettabile ridurre la risoluzione della crominanza?! Si scopre che ci sono già schemi che descrivono come gestire la risoluzione e la fusione (Colore finale = Y + Cb + Cr).
Questi schemi sono noti come sistemi di subsampling e si esprimono in un rapporto 3:1 — a:x:y, che definisce il numero di campioni dei segnali di luminosità e crominanza.
a — campionamento orizzontale di riferimento (di solito pari a 4)
x — numero di campioni di crominanza nella prima riga di pixel (risoluzione orizzontale rispetto a a)
y — numero di cambiamenti nei campioni di crominanza tra la prima e la seconda riga di pixel.
L'eccezione è 4:1:0, che fornisce un campione di crominanza in ogni blocco di risoluzione di luminosità 4x4.
Schemi comuni utilizzati nei codec moderni:
- 4:4:4 (senza subsampling)
- 4:2:2
- 4:1:1
- 4:2:0
- 4:1:0
- 3:1:1
YCbCr 4:2:0 — esempio di fusione
Ecco un frammento combinato dell'immagine usando YCbCr 4:2:0. Nota che utilizziamo solo 12 bit per pixel.
Ecco come appare la stessa immagine codificata nei principali tipi di subsampling del colore. La prima riga è il finale YCbCr, la riga in basso mostra la risoluzione della crominanza. Risultati piuttosto buoni, considerando le minime perdite di qualità.

Ricordi, abbiamo calcolato 278 GB di spazio su disco per memorizzare un file video di un'ora con risoluzione 720p e 30 fotogrammi al secondo? Se utilizziamo YCbCr 4:2:0, questa dimensione si ridurrà a metà: 139 GB. Siamo comunque lontani da un risultato accettabile.
Puoi creare tu stesso un istogramma YCbCr utilizzando FFmpeg. In questa immagine, il blu prevale sul rosso, il che è ben visibile nell'istogramma stesso.

Crominanza, luminosità, gamma di colori — video recensione
Ti consiglio di guardare questo fantastico video. Spiega cos'è la luminosità e chiarisce diversi punti sulla e la luminosità e il colore.
Tipi di fotogrammi
Procediamo. Proviamo a eliminare la ridondanza temporale. Ma prima definiamo una terminologia di base. Supponiamo di avere un film a 30 fotogrammi al secondo, ecco i suoi primi 4 fotogrammi:

Possiamo vedere molte ripetizioni nei fotogrammi: ad esempio, uno sfondo blu che non cambia da un fotogramma all'altro. Per risolvere questo problema, possiamo astrattamente classificarli in tre tipi di fotogrammi.
I-frame (IIntro Frame)
L'I-frame (fotogramma di riferimento, fotogramma chiave, fotogramma interno) è autonomo. Indipendentemente da ciò che deve essere visualizzato, l'I-frame è fondamentalmente una fotografia statica. Il primo fotogramma è solitamente un I-frame, anche se continueremo a vedere I-frame tra fotogrammi non di apertura.

P-frame (PPredicted Frame)
Il P-frame (fotogramma previsto) sfrutta il fatto che quasi sempre l'immagine attuale può essere riprodotta utilizzando il fotogramma precedente. Ad esempio, nel secondo fotogramma, l'unico cambiamento è la palla che si muove in avanti. Possiamo ottenere il fotogramma 2 semplicemente modificando leggermente il fotogramma 1, utilizzando solo la differenza tra questi fotogrammi. Per costruire il fotogramma 2 ci riferiamo al fotogramma che lo precede, il fotogramma 1.
← 
B-frame (BBi-predictive Frame)
E che dire dei riferimenti non solo ai fotogrammi passati, ma anche a quelli futuri, per garantire una compressione ancora migliore?! Questo è, fondamentalmente, ciò che fa il B-frame (fotogramma bidirezionale).
←
→ 
Conclusione intermedia
Questi tipi di fotogrammi vengono utilizzati per garantire la migliore compressione. Esamineremo come avviene questo nel prossimo paragrafo. Per ora, notiamo che il fotogramma più 'costoso' in termini di spazio è l'I-frame, il P-frame costa notevolmente meno, mentre il B-frame risulta essere l'opzione più vantaggiosa per i video.

Ridondanza temporale (previsione interfotogrammi)
Esploriamo quali sono le nostre opzioni per ridurre le ripetizioni temporali. Questo tipo di ridondanza sarà affrontato con metodi di previsione reciproca.
Cerchiamo di spendere il minor numero possibile di bit per codificare una sequenza di fotogrammi 0 e 1.

Possiamo effettuare una sottrazione, semplicemente sottraendo il fotogramma 1 dal fotogramma 0. Otteniamo il fotogramma 1 utilizzando solo la differenza tra esso e il fotogramma precedente, codificando effettivamente solo il residuo risultante.

Ma cosa direste se vi dicessi che esiste un metodo ancora migliore che utilizza ancora meno bit?! Iniziamo a suddividere il fotogramma 0 in una griglia chiara formata da blocchi. E poi cerchiamo di abbinare i blocchi del fotogramma 0 con il fotogramma 1. In altre parole, valutiamo il movimento tra i fotogrammi.
Da Wikipedia — compensazione di movimento a blocchi
La compensazione di movimento a blocchi suddivide il fotogramma corrente in blocchi non sovrapposti e il vettore di compensazione di movimento indica l'origine dei blocchi (un errore comune è pensare che il fotogramma precedente sia suddiviso in blocchi non sovrapposti, mentre i vettori di compensazione di movimento indicano dove si muovono questi blocchi. In realtà, è l'opposto: non si analizza il fotogramma precedente, ma quello successivo; non si determina dove si muovono i blocchi, ma da dove sono apparsi). Di solito, i blocchi di origine si sovrappongono nel fotogramma originale. Alcuni algoritmi di compressione video ricompongono il fotogramma corrente a partire da parti di più fotogrammi precedentemente trasmessi.

Durante la valutazione, vediamo che la palla si è spostata da (x=0, y=25) a (x=6, y=26), i valori x e y definiscono il vettore di movimento. Un ulteriore passo che possiamo compiere per risparmiare bit è codificare solo la differenza tra il vettore di movimento della posizione finale del blocco e quella prevista, quindi il vettore di movimento finale sarà (x=6-0=6, y=26-25=1).
Nella realtà, questo pallina sarebbe suddivisa in n blocchi, ma questo non cambia il concetto.
Gli oggetti nel fotogramma si muovono in tre dimensioni, quindi quando la palla si muove, essa può apparire visivamente più piccola (o più grande, se si muove verso lo spettatore). È normale che non ci sia corrispondenza perfetta tra i blocchi. Ecco una vista sovrapposta della nostra valutazione rispetto alla realtà.

Vediamo però che quando applichiamo la valutazione del movimento, i dati da codificare sono notevolmente inferiori rispetto all'utilizzo di un metodo più semplice per calcolare la delta tra i fotogrammi.

Come apparirebbe la vera compensazione di movimento
Questa metodologia si applica a tutti i blocchi contemporaneamente. Spesso la nostra palla in movimento sarà suddivisa in più blocchi.

Puoi stesso verificare queste concetti utilizzando .
Per visualizzare i vettori di movimento, puoi creare un video con previsione esterna utilizzando .

Puoi anche utilizzare (è a pagamento, ma c'è una versione di prova gratuita che è limitata ai primi dieci fotogrammi).

Ridondanza spaziale (previsione interna)
Analizzando ogni fotogramma in un video, scopriamo molte aree interconnesse.

Facciamo un esempio. Questa scena consiste principalmente di colori blu e bianco.

Questo è un I-frame. Non possiamo utilizzare i fotogrammi precedenti per la previsione, ma possiamo comprimerlo. Codifichiamo l'area del blocco rosso. Se osserviamo i suoi vicini, notiamo che ci sono alcune tendenze cromatiche attorno ad esso.

Supponiamo che i colori nel fotogramma si diffondano verticalmente. Questo significa che i colori dei picchetti sconosciuti conterranno i valori dei vicini.

Tale previsione potrebbe anche essere errata. Proprio per questo motivo è necessario applicare questo metodo (previsione interna) e poi sottrarre i valori reali. Questo ci darà un blocco residuo, il che porterà a una matrice molto più compressa rispetto all'originale.

Se vuoi praticare con le previsioni interne, puoi creare un video con macroblocchi e le loro previsioni usando ffmpeg. Per capire il significato di ciascun colore del blocco, dovrai consultare la documentazione di ffmpeg.

In alternativa, puoi utilizzare Intel Video Pro Analyzer (come menzionato sopra, la versione di prova gratuita è limitata ai primi 10 fotogrammi, ma questo dovrebbe essere sufficiente per le prime volte).

Secondo capitolo:
Fonte: habr.com



