PDA

View Full Version : [java] effettuare dct su una matrice


antedesk
02-09-2010, 16:07
Salve a tutti!
ho un problema un pò più serio questa volta, dovrei effettuare il calcolo della trasformata discreta del coseno(dct) su una matrice di interi, che rappresenta l'immagine.
il codice per il calcolo della dct è una semplice formula matematica che ho trovato in rete e riconvertita in codice java. Il problema è che così su immagini molto grandi di mette un eternità, tempo che non sono disposto ad aspettare :D
Studiando un pò di materiale sulla compressione jpeg dove viene utilizzata la dct e dove:

"Ogni matrice saràsuccessivamente divisa in blocchi di dimensione 8x8, ovvero ogni blocco conterrà 64 pixel dell’immagine originale. Quindi se M o N non risultano multipli di 8, sono aggiunte delle copie dell’ultima riga o dell’ultima colonna alla matrice dell’immagine originale, sino a che la dimensione della nuova matrice non diventi un multiplo di 8.
Ad ogni blocco è applicata la trasformata DCT bidimensionale, che restituisce ancora un bloccodi dimensioni 8x8."



il problema è che nono so proprio dove mettere le mani per suddividere la matrice in blocchetti 8x8 e di aggiungere una riga qualora non dovesse essere un multiplo di 8

potete aiutarmi? se serve posso postare il codice della funzione dct.

Grazie a tutti, spero di avere risposta

Vheon
03-09-2010, 00:49
se usi una matrice bidimensionale, basta che al metodo passi la matrice intera ed i rispettivi indici di partenza, no? ovvero se la matrice per esempio e' una 16x16 (sciocchezza) hai 4 blocchi da 8x8, se al metodo passi la matrice intera e deve elaborare il secondo blocco della prima fila, passerai anche gli indici (0, 8) ovvero partira' dalla prima riga ed ottava colonna, ed il metodo poi incrementera' gli indici solamente di 8... Non so se mi sono spiegato bene. Per il fatto di aggiungere la riga quello basta fare un controllo all'inizio e in caso riallocare la matrice in una piu grande... Cmq dato che devi fare l'operazione su piu blocchi, ed e' sempre la stessa operazione, non so se qui l'utilizzo dei thread puo' aiutare... fai un tentativo..

antedesk
03-09-2010, 15:01
ok provo a fare un tentativo come mi hai appena suggerito :)
tentar non nuoce tanto :P

ps: avevo trovato una soluzione moooolto meno elegante dove scorrevo la matrice riga per riga e applicavo l'algoritmo per il calcolo della dct(quindi usando un metodo d'appoggio) ma , tralasciando che lo devo ancora testare per capire cosa mi ritorna, penso che non mi dia la dct come abbiamo studiato nel corso di TLC(in alto a sinistra le basse frequenze ed in basso a destra le alte frequenze)