Struttura dei file per la memorizzazione dei pixel che sono cambiati da un'immagine all'altra

1

Hai due immagini con le stesse dimensioni.

Voglio creare un file che contenga informazioni su quali pixel sono diversi tra le due immagini. Il file dovrebbe anche dirmi il valore del nuovo pixel (numero intero).

Un esempio di tale file è

230,8528
291,920
550,1500

Che mi dice che il pixel all'indice 230 è cambiato in 8528. Quello a 291 ora è il valore 920. E il pixel a 550 ha valore 1500.

Ho già i mezzi per ottenere tutti questi dati (gli indici in cui cambiano e i loro nuovi valori interi). Il mio problema è la memorizzazione di tali informazioni, che devono essere il più piccole possibile e, naturalmente, facili da iterare quando il mio programma ha bisogno di leggere questi dati.

Quello che ho attualmente è il seguente formato di file:

[pixel color], [index], [index], [index], ...
[pixel color], [index], ...
[pixel color], [index], [index], ...

Fondamentalmente, ogni linea rappresenta un colore di pixel che è cambiato, e quindi separati da virgole sono gli indici dei pixel che cambieranno in tale colore.

Esiste una struttura di file più adatta / efficiente per ottenere questo tipo di archiviazione dei dati?

    
posta Omega 27.03.2016 - 22:51
fonte

1 risposta

1

Dipende molto da ciò che le modifiche sono .

Se hai lotti di modifiche, potresti creare una immagine differenza e codificarla utilizzando un algoritmo come PNG, sfruttando le sue funzionalità di compressione dei dati.

Se hai diverse modifiche allo stesso colore , il tuo approccio potrebbe funzionare.

Se hai diverse modifiche nelle aree fisse, quindi memorizzare le coordinate e i colori in modo indipendente potrebbe dare dei vantaggi.

Anche l'algoritmo di lettura dei file ha il suo peso. Se si memorizzano i pixel nello stesso ordine in cui sono quando si legge l'immagine (quindi, ad esempio:

Y:X,C;X,C;X,C
Y:X,C;X,C;X,C

quindi sarai in grado di decodificare l'immagine in un unico passaggio senza archiviare tutto in memoria. Poiché sia la lettura delle immagini che la lettura dei file delle differenze sono sequenziali, puoi utilizzare una qualsiasi delle numerose librerie compressione per comprimere il file delle differenze.

Nell'esempio sopra, X è la coordinata X. Dal momento che sono ordinati, è possibile memorizzare il primo numero così com'è e i numeri successivi come differenze (a base zero, offset di 1). Quindi le tre coordinate X 17, 25 e 27 diventano 17, 7 e 1. Il vantaggio è che questo aumenta la probabilità che si verifichino numeri più piccoli; durante la compressione, avere alcuni simboli più probabili di altri si traduce in prestazioni di compressione migliori.

Se sai che le tue coordinate non supereranno mai, per esempio, 65535, puoi memorizzarle come parole binarie di 16 bit. Quindi non è necessario alcun separatore tra i numeri; ogni numero è rappresentato esattamente da due byte.

Ma come vedi, tutto dipende da ciò che i tuoi dati di input effettivamente sono .

Aggiornamento : in realtà dipende anche da cosa devi fare. Se si desidera memorizzare un delta tra due file, è possibile che in alcuni scenari si possa essere meglio serviti utilizzando un'utilità come rdiff invece di rotolare (e dover eseguire il debug e la manutenzione!) Il proprio "motore di differenze".

    
risposta data 27.03.2016 - 23:14
fonte