PDA

View Full Version : [JAVA & non] Manipolazione Pixel


Fuzzo
23-08-2005, 16:29
Salve! :)
Per l'esame di Elaborazione delle Immagini devo realizzare un programmino che applichi qualche filtro :rolleyes:

Il mio problema riguarda la luminosità, che aumenta si >1 e diminuisce se <1:
se sommo arbitrariamente una costante K per es. ad un pixel RGB 255 255 3, risulterebbe 255 255 3+K.
Il fatto è che non è più luminosa, ma solo più blu!!!

Mi serve un algoritmo che aumenti la luminosità in base al peso dei canali del pixel e non arbitrariamente, per preservare i colori.

Me ne serve uno anche per il contrasto :Perfido:

Grazie! :cincin:

cdimauro
24-08-2005, 08:35
1) Converti il pixel dallo spazio RGB a HSV;
2) cambiagli luminosità e contrasto (con questo spazio colore è facile farlo);
3) riconvertilo in RBG.

franksisca
24-08-2005, 09:21
1) Converti il pixel dallo spazio RGB a HSV;
2) cambiagli luminosità e contrasto (con questo spazio colore è facile farlo);
3) riconvertilo in RBG.
:yeah: :sborone: :yeah:

Fuzzo
25-08-2005, 13:24
Grazie per la dritta ma devo fare il filtro sui pixel RGB, vi ricordo che è per un esame altrimenti avrei potuto usare anche il metodo nativo dell'API di Java :fagiano:

Altre idee o semplicemente link da segnalarmi? :mbe:

Mark0
25-08-2005, 14:13
Puoi usare GIMP unitamente a gluas (http://pippin.gimp.org/plug-ins/gluas/), un'interfaccia di scripting per GIMP basata su Lua (http://www.lua.org/).

Io tra l'altro sto facendo qualcosa del genere, mantenendo la compatibilità con le funzioni e le variabili di gluas, per un software di painting e animazione, Project Dogwaffle (http://www.thebest3d.com/dogwaffle/dan/dogwaffle-readme.html). Praticamente si tratta di un plugin che implementa la possibilità di creare e testare script al volo: DogLua (http://mark0.net/plugins-doglua-e.html)

GIMP + gluas mi sembra la soluzione ideale per la tua problematica. Sul sito di gluas dai un'occhiata alla carrellata di esempi; c'è anche un ottimo tutorial sulla teoria dell'elaborazione delle immagini.

Bye!

^TiGeRShArK^
25-08-2005, 14:38
Salve! :)
Per l'esame di Elaborazione delle Immagini devo realizzare un programmino che applichi qualche filtro :rolleyes:

Il mio problema riguarda la luminosità, che aumenta si >1 e diminuisce se <1:
se sommo arbitrariamente una costante K per es. ad un pixel RGB 255 255 3, risulterebbe 255 255 3+K.
Il fatto è che non è più luminosa, ma solo più blu!!!

Mi serve un algoritmo che aumenti la luminosità in base al peso dei canali del pixel e non arbitrariamente, per preservare i colori.

Me ne serve uno anche per il contrasto :Perfido:

Grazie! :cincin:
ehm.....ma vedi ke i ltuo modo di operare è corretto nello spazio RGB.....
essendo il limite di 255 oltre nn puoi andare, quindi i colori tendono ad andare in saturazione.....
inoltre nn è affatto vero ke il punto diventerà più blu.......
invece tenderà di più al bianco passando dal giallo acceso a una specie di celestino (penso) x poi diventare bianco qdo raggiungerai il limite di 255 x il blu........
questo avviene perkè i colori RGB dei fosfori del monitor sfruttano una sintesi additiva....praticamente le componenti dei colori ivengono sommate e quanto è + alto il valore quanto più l'immagine sarà kiara.
invece, qdo ad esempio utilizzi i colori a tempera, stai utilizzando una sintesi sottrattiva.
Infatti se mescoli i colori primari (ke in quel caso di solito sono blu, giallo, rosso, oppure CMYK km nel caso delle stampanti) otterrai al posto del bianco un grigio "cromatico" molto scuro.
Infatti il modo per aumentare o diminuire la luminosità nello spazio cmyk è estremamente semplice..... è sufficiente diminuire il contributo del black.
Nello spazio RGB invece devi agire sui 3 canali separatamente, ma se 6 in saturazione ovviamente otterrai delle distorsioni cromatiche, ke però tendono sempre a far salire la luminosità.
ma cmq hai provato ad utilizzare questo metodo della somma di k sui 3 canali kn un immagine reale??? il risultato non dovrebbe essere troppo osceno, a meno di un'immagine già saturata in partenza.
X quanto riguarda il contrasto invece.......
boh.....in effetti nn so esattamente km agisce, penso sia una compressione o espansione dello spazio dei colori.......
ad esempio.... se i tuoi 256 livelli per colore li esprimi con 512 livelli mantenendo le soglie di nero e bianco a 0 e 512 e ricavando proporzionalmente i valori dei colori, il contrasto dovrebbe dimezzarsi intuitivamente..... se invece esprimi tutto in una scala di 128 livelli il contrasto dovrebbe aumentare, essendo le variazioni più repentine......
Spero si sia capito qualcosa...e inoltre la parte del contrasto nn so se è una kazzata dato ke c pensavo mentre scrivevo :p

cdimauro
26-08-2005, 09:58
Grazie per la dritta ma devo fare il filtro sui pixel RGB, vi ricordo che è per un esame altrimenti avrei potuto usare anche il metodo nativo dell'API di Java :fagiano:

Altre idee o semplicemente link da segnalarmi? :mbe:
Ascoltami, anch'io ho sostenuto l'esame di elaborazione delle immagini, e ho avuto a che fare con gli stessi problemi. Una cosa che insegnano al corso è che bisogna usare lo spazio colore giusto a seconda del tipo di problema che si deve risolvere: altrimenti cosa li hanno inventati a fare?

Alla fine, per risolvere il tuo problema, saresti comunque costretto a "simulare" una conversione in uno spazio colore, per poterne cambiare la luminosità e/o il contrasto.

Mi spiego meglio. Vuoi cambiare la luminosità del 10% di un pixel? Bene, sai che devi aumentare 3 * 10% il rosso, del 6 * 10% il verde e dell' 1 * 10% il blu, e poi normalizzare, controllando che ogni componente non abbia superato il valore 255, che il massimo possibile.

Cos'hai fatto? Nient'altro che usare la media pesata (approssimata agli interi: è solo un esempio didattico, eh! :p) delle tre componenti che serve per calcolare il valore della luminosità nello spazio HSV, applicare il cambiamento, e "tornare" allo spazio RGB.

Sì, puoi dire di non esser passato allo spazio HSV, ma è soltanto un'operazione di facciata, fittizia: in realtà è quel che hai fatto.

Quindi, ti consiglio di operare come ti ho suggerito prima. Converti i valori RGB in HSV, applica la trasformazione che t'interessa, e li riconverti in RGB. Non devi usare nessuna API: devi soltanto applicare le nozioni che hai imparato a lezione, che poi è lo scopo per cui si fanno questi esercizi.

Fidati, che ci sono passato pure io... ;)