Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254

    [c#] colorspace image editing

    Salve,

    Il mio intento era quello di poter fare editing di un'immagine (bufferizzata in un byte[]) con spazio colore UYVY (o YUV) senza la conversione in RGB perchè essenzialmente devo farlo in real time cioè con un immagine ogni 40 millisecondi (eh si sono frame video)

    Ora come ora, qualunque mio sforzo di disegnare su immagini in uyvy o yuv è risultato un disasto... e la trasformazione in rgb è essenzialmente più lenta di 40 ms (solo la trasformazione da yuv a rgb pensare poi la trasformazione contraria.. improponibile)

    La mia domanda è: esistono classi nel framework che possono velocizzare la cosa, o qualcuno conosce metodi per disegnare su immagini in yuv?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    up

  3. #3
    Mi intrometto, non per aiutarti ma per chiedere aiuto.
    Ho un'immagine in YUV format, dimensione 320X240, dimensione del file 153.600 byte (320X240X2).
    Voglio ora sapere di che colore è il pixel alla coordinata x, y. Qual è la formula da usare?
    Come faccio quindi a capire di che colore è il tale pixel sapendo che esso, in formato yuv è rappresentato da 2 byte?

  4. #4
    Per "di che colore è il pixel" tu intendi in RGB, giusto?
    Hai qualche altra informazione su questa immagine? È YUV 8:4:4?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Dovrebbe essere YVU 4:2:0. Potresti spiegare anche cosa significano le caratteristiche 4:2:0?

  6. #6
    http://www.fourcc.org/yuv.php
    http://en.wikipedia.org/wiki/YUV#Y.2...and_Y.27V12.29
    Con ogni probabilità è un formato planare, per cui preparati ad un po' di contorsioni mentali.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    il YUV è un formato un po' rompi.. però ti do una chicca:

    codice:
    int CalculateRGB(WORD red, WORD green, WORD blue, WORD* pixel, bool U)
    {
    
    	unsigned int Rc, Gc, Bc, Rx, Bx;
    	
    	Rc = ((WORD)red * 77) / 256;
    	Gc = ((WORD)green * 150) / 256;
    	Bc = ((WORD)blue * 29) / 256;
    	Rx = ((WORD)red * 180) / 256;
    	Bx = ((WORD)blue * 227) / 256;
    
    	unsigned int Y = Rc + Bc + Gc;
    	unsigned int CR = Rx - Gc - Bc + 128;
    	unsigned int CB = Bx - Gc - Rc + 128;
    
    	if(Y > 255) Y = 255;
    	if(CR > 255) CR = 255;
    	if(CB > 255) CB = 255;
    	if(CR < 0) CR = 0;
    	if(Y < 0) Y = 0;
    	if(CB < 0) CB = 0;
    
    	BYTE* b = (BYTE*)pixel;
    	if(U)
    	{
    		b[0] = Y;
    		b[1] = CR;
    	}
    	else
    	{
    		b[0] = Y;
    		b[1] = CB;
    	}
    
    	return 0;
    }
    il booleano U serve per calcolare sia il YUV che il YUY2.. usa false per il YUV (mi pare)

    da questa formula puoi facilmente fare la cosa oppoeta.. da un YUV ad un RGB

  8. #8
    Il problema è che il suo file è in formato planare, per cui prima ci sono tutti i valori Y campionati a 8 bit, poi tutti gli U e poi i V a 2 bit; non garantisco la correttezza di queste informazioni, in particolare per quanto riguarda il sottocampionamento di U e V e il loro ordine, la documentazione non è chiarissima.

    Per inciso, potresti ottimizzare un pelo quel codice usando gli shift invece delle divisioni per potenze di due e riducendo il numero di variabili (per quanto è probabile che già ci pensi il compilatore). Potresti anche sostituire il confronto con 255 con un & (potenzialmente più veloce):
    codice:
    if(Y And Not 255)
        Y = 255
    . Tutti miglioramenti marginali, ma che, se il codice deve processare frame in realtime, possono aiutare.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Scusa, puoi spiegare meglio?
    La risoluzione 320 x 240.
    Il file è di dimensione 153.600 byte. In quel ordine trovo all'interno i dati?

  10. #10
    Se ho ben capito la documentazione, dovresti trovare prima tutti i valori di Y (1 byte per pixel di valore di Y), poi tutti i valori di U e quindi quelli di V, ma ciascuno relativo ad un'immagine di lato dimezzato rispetto all'originale.
    Teoricamente quindi dovrebbero essere:
    320*240 + 160*120 + 160*120 = 115200
    Tuttavia se, come dici, il file è da 153600 byte, sembrerebbe invece che vengano utilizzati 16 bit per pixel; sicuro che non si tratti di YUV422/YUY2 o roba del genere? In tal caso tutto sarebbe più semplice, visto che i dati dei pixel sono uno in fila all'altro, come sequenze di [Y1 U Y2 V], da interpretarsi come due pixel [Y1 U V], [Y2 U V].
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.