Autore Topic: Ottenere matrice immagine  (Letto 995 volte)

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Ottenere matrice immagine
« il: 08 Luglio 2014, 13:48:17 CEST »
0
Salve ragazzi, sto cercando una libreria simile ad openCV che mi consenta di manipolare i byte di una qualsiasi immagine. Non ho mai fatto elaborazione delle immagini in Android/Java... cosa mi consigliate di fare? Grazie

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Ottenere matrice immagine
« Risposta #1 il: 08 Luglio 2014, 15:31:36 CEST »
0
Il porting delle OpenCV esiste per Android. Il codice e gli esempi si trovano nei sorgenti dell'ultima versione di sviluppo delle OpenCV.

Inviato dal mio Nexus 5

adb logcat | tee /tmp/logcat | grep TAG

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Ottenere matrice immagine
« Risposta #2 il: 08 Luglio 2014, 17:32:58 CEST »
0
Ok ma se io volessi avere solo la matrice dei byte non ho magari soluzioni più semplici rispetto all'utilizzo delle openCV?

Inviato dal mio LG-P500 con Tapatalk 2


Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Ottenere matrice immagine
« Risposta #3 il: 08 Luglio 2014, 17:56:22 CEST »
0
Mi sfugge la richiesta delle OpenCV se dopo non le vuoi usare?

Comunque per leggere i byte di una bitmap puoi farlo con le API di Android copiando la bitmap in un buffer di byte:

http://developer.android.com/reference/android/graphics/Bitmap.html#copyPixelsToBuffer(java.nio.Buffer)

Attento che l'elaborazione di immagini direttamente in Java è una operazione macchinosa e molto lenta.

Inviato dal mio Nexus 5

adb logcat | tee /tmp/logcat | grep TAG

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Ottenere matrice immagine
« Risposta #4 il: 08 Luglio 2014, 18:06:59 CEST »
0
Mi sfugge la richiesta delle OpenCV se dopo non le vuoi usare?

Attento che l'elaborazione di immagini direttamente in Java è una operazione macchinosa e molto lenta.


:) siccome non devo fare operazioni onerosissime mi chiedevo se si potesse evitare di passare per openCV...
Comunque grazie per le delucidazioni.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Ottenere matrice immagine
« Risposta #5 il: 08 Luglio 2014, 20:11:03 CEST »
0
:) siccome non devo fare operazioni onerosissime mi chiedevo se si potesse evitare di passare per openCV...

Possibile è possibile. Ma come dice iceweasel (che è anche sicuramente più esperto di me) l'image processing è un tipo di operazione che non viene fatta in Java, per ovvie ragioni di performance ed efficienza. Per cui c'è difficoltà a trovare qualcosa.

Capita a fagiolo un twit fatto ieri da Carmack (l'inventore di Doom e Quake) che dice : " Java's signed bytes gets me every time I try to do image processing. Easy answer is "Don't do image processing in java", of course. "
https://twitter.com/ID_AA_Carmack/status/486197812644696064
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Ottenere matrice immagine
« Risposta #6 il: 08 Luglio 2014, 20:36:27 CEST »
0
Quello che devo fare è modificare 2 bit di ogni byte dell'immagine... Non mi sembra troppo oneroso. Se poi lo è mi metto a studiare le openCV. Le conosco solo per sentito dire :-D

Inviato dal mio LG-P500 con Tapatalk 2



Post unito: 08 Luglio 2014, 20:46:39 CEST
Ho pensato di procedere così. Mi creo la bitmap a partire dal file immagine; metto la bitmap in un
Codice (Java): [Seleziona]
ByteBuffer e, da quest'ultimo, ricavo l'array di byte con il metodo
Codice (Java): [Seleziona]
buffer.array();; faccio le modifiche sui byte e poi, tramite il metodo
Codice (Java): [Seleziona]
 Bitmap createBitmap (int[] colors, int width, int height, Bitmap.Config config) creo la bitmap modificata usando la config della bitmap originale presa con
Codice (Java): [Seleziona]
bitmap.getConfig()....

A questo punto mi perdo perché non so come salvare la bitmap in un file immagine come quello di partenza!! Non riesco a trovare un metodo...
« Ultima modifica: 08 Luglio 2014, 20:46:39 CEST da lionell88, Reason: Merged DoublePost »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Ottenere matrice immagine
« Risposta #7 il: 08 Luglio 2014, 20:58:55 CEST »
0
Se ho capito bene, più che fare image processing ti interessa accedere ai pixel dell'immagine e fare qualche modifica.

Prova a vedere questo tutorial: Working with Images in Your Android App Development - Developer.com
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Ottenere matrice immagine
« Risposta #8 il: 08 Luglio 2014, 21:12:06 CEST »
0
Molte grazie. Non so se hai letto bene i passi che ho usato per arrivare ... se questa istruzione
Codice (Java): [Seleziona]
 mBitmap.compress(CompressFormat.JPEG, 75, fos); funziona bene su qualsiasi bitmap, mi potrebbe andare a pennello e dunque ti ringrazio ancora di più per averla trovata!
PS. la bitmap  di partenza la creo da un qualsiasi file immagine, anche non JPEG.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Ottenere matrice immagine
« Risposta #9 il: 08 Luglio 2014, 21:27:34 CEST »
0
Quando una immagine viene caricata in memoria il suo legame con il formato di partenza viene perso. La sua rappresentazione in memoria è non compressa con i byte nel ordine richiesto da chi ha programmato le librerie grafiche usate da Android.

Se vuoi salvare una bitmap con le API di Android è possibile farlo:

http://developer.android.com/reference/android/graphics/Bitmap.html#compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream)

I formati sopportati sono PNG (non a perdita), JPEG (a perdita) e dalle ultime versioni di Android il WEBP (con o senza perdita).

Inviato dal mio Nexus 5

adb logcat | tee /tmp/logcat | grep TAG

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Ottenere matrice immagine
« Risposta #10 il: 08 Luglio 2014, 21:43:04 CEST »
0
Bene grazie... farò sapere in seguito se ci sono riuscito o se c'è qualche problema :)

Post unito: 09 Luglio 2014, 10:41:55 CEST
Bene ragazzi. Sono riuscito a salvare l'immagine modificata. L'unico piccolo inconveniente è che la nuova immagine risulta più sgranata, perde in qualità e sono sicuro che non è per le mie modifiche. Penso sia proprio la compressione e questo accade anche se creo una PNG. Sicuramente c'è qualche perdita di informazione... potrei pure accontentarmi ma se vi viene in mente qualcosa è ben accetta ovviamente :)
Grazie ancora per le dritte!!
« Ultima modifica: 09 Luglio 2014, 10:41:55 CEST da lionell88, Reason: Merged DoublePost »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Ottenere matrice immagine
« Risposta #11 il: 10 Luglio 2014, 18:16:22 CEST »
0
Ignoro le modifiche che fai ai bit dell'immagine, comunque il formato PNG non perde informazioni quando comprime una immagine, controlla se effettivamente salvi un file PNG, può capitare, se non si è attenti nel scrivere il codice, di salvare una immagine JPEG con estensione PNG.

Inviato dal mio Nexus 5

adb logcat | tee /tmp/logcat | grep TAG

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Ottenere matrice immagine
« Risposta #12 il: 10 Luglio 2014, 18:46:52 CEST »
0
Vado a modificare gli ultimi due bit di ogni byte della bitmap... solitamente lo faccio su delle jpeg che ho nel dispositivo.

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Ottenere matrice immagine
« Risposta #13 il: 10 Luglio 2014, 18:54:27 CEST »
0
Risolto. Grazie mille ancora.

Post unito: [time]11 Luglio 2014, 00:44:27 CEST[/time]
Ragazzi eccomi qua tutto sconfortato perché ho notato che non ho risolto. Ecco il problema: dall'immagine originale lavoro sulla bitmap, poi salvo una nuova immagine PNG da questa bitmap modificata. Poi, per verifica, ricavo nuovamente la bitmap da quest'ultima immagine png e, analizzando i byte alla stessa maniera, non corrispondono a come li avevo salvati! C'è qualcosa che cambia quando va a creare il file PNG! Non so proprio come fare :(

EDIT: Ok mi do del pollo da solo. Praticamente ho notato che il quarto byte della bitmap ripresa dalla png precedentemente salvata è sempre posto a 255. Se non erro, quel byte è l'alpha channel e, evidentemente, la classe di Android lo setta sempre a 255 durante la compressione.
Conclusioni: si, la compressione PNG è di tipo lossless, quindi le info sui colori non vengono perse, dunque la bitmap ricostruita ha esattamente gli stessi bit di quella usata per salvare la PNG ad eccezione del byte sul canale alpha (cioè il 4° byte). Per ogni sequenza, devo ignorare il 4° byte.
« Ultima modifica: 11 Luglio 2014, 12:04:16 CEST da lionell88 »