|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
[C] Libreria filtri 2d per immagini
Sto facendo un programma in java per gestire delle immagini come voglio io. In fase di anteprima devo fare il resize al volo di immagini fino a 5000 pixel. Il semplice draw delle immagini, seppure veloce, non rende bene le immagini perchè non sono opportunamente filtrate. Le funzioni classi interne di java sono troppo lente. La libreria java image non mi soddisfano perchè, oltre a non essere velocissima, sui grossi rescaling (10%) sono abbastanza scadenti.
A questo punto volevo chiamare del codice nativo in c per avere più efficienza e maggiore qualità. Poichè la funzione draw del java è abbastanza veloce, credo che mi basti applicare un semplice filtro low pass alle immagini da riscalare. Un semplice filtro gaussiano dovrebbe bastare. Qualcuno mi può suggerire una libreria adatta a questo scopo? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2006
Messaggi: 22462
|
semmai c++, con le classi è già più semplice trovare qualcosa, hai guardato la libreria allegro?
__________________
amd a64x2 4400+ sk939;asus a8n-sli; 2x1gb ddr400; x850 crossfire; 2 x western digital abys 320gb|| asus g1
Se striscia fulmina, se svolazza l'ammazza |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
in realtà preferirei in c per semplicità: io pensavo a funzioni che operano su array di interi, non vorrei dover passare per la costruzioni di oggetti perchè ciò complicherebbe il discorso della chiamata al codice nativo
sto dando un occhiata alla libreria allegro, ma mi sembra orientata allo sviluppo dei videogame, non ci sono librerie un po' più essenziali? |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Ho letto che usi la libreria "java image": presumo tu ti riferisca al package java.awt.image Non so se ti possa interessare ma ti posto due link che ritengo utili per il tuo problema: 1) javadoc, package javax.imageio (non so se questo package può tornarti utile, ma se non lo hai usato magari ti torna comodo darci un occhio) 2) chet haase blog on performance Chet Haase è un ingegnere della Sun che lavora su Java da anni e mastica particolarmente bene proprio la gestione grafica e delle immagini in particolare: se non conoscevi questa risorsa allora considerala una miniera di informazioni e tecniche di programmazione utilissime per lavorare con le immagini in ambiente Java: da non perdere. Buonanotte ![]() |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
Quote:
La libreria java che avevo usato a suo tempo era la JAI (http://java.sun.com/javase/technolog...top/media/jai/) che ha incluse alcune operazioni di resize, ma sugli scaling pesanti lasciano un po' a desiderare, senza contare che erano un po' lentine. Ho provato anche il metodo getScaledInstance della classe image java, ma è lento pure lui. Poichè il visualizzatore di immagini di windows è molto veloce e offre risultati molto buoni ho pensato che una funzione C avrebbe fatto al caso mio. Purtroppo anche se conosco un po' l'elaborazione delle immagini, non conosco i metodi efficienti per ottenere determinati risultati (altrimenti la scriverei io la funzione in c). Ora provo a guardare un po' le librerie della intel |
|
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Tratto proprio dal link alla pagina del blog di Chet Haase:
Quote:
Mettila così: (ammesso che le prestazioni che vuoi ottenere siano raggiungibili nella pratica, e scommetto di sì se si usano sapientemente BufferedImage, Graphics e si imparano i "trucchi del mestiere", vedi blog di Chet) se ce la fai con Java non solo hai tutto in pure-Java (portabilità, in teoria) ma hai anche la soddisfazione di aver acquisito conoscenze maggiori e specifiche nell'ambito della manipolazione di immagini, un campo piuttosto interessante (manipolare bene, e con tutte le sottigliezze del caso le immagini può tornare molto utile per riutilizzare questa conoscenza anche in altri contesti più stuzzicanti, tipo la gestione degli sprites in un videogioco, per esempio) Se non si è capito faccio il tifo per Java, e per te che lo usi: devi solo decidere di dedicare un po' di tempo allo studio delle info nel blog del tizio della Sun prima di scatenare le ditine sulla testiera ![]() Faccio il tifo per te ![]() @EDIT: Quote:
Purtroppo ho perso il link della pagina, ti allego direttamente tutto il file: algorithms-faq Ultima modifica di banryu79 : 01-04-2008 alle 17:08. |
||
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
la funzione drawImage infatti la uso, ed è molto veloce, solo che se la si applica direttamente all'immagine originale produce uno strano effetto che io chiamo "brillantante", nel senso che i piccoli dettagli influenzano pesantemente l'immagine finale
è per questo che volevo applicare un filtro passabasso, tipo il gaussian blur: in questo modo si eliminano i dettagli così quando si chiama drawImage la resa dovrebbe essere corretta quello che dovrei fare io è trovare i coefficienti della matrice 3x3 o 5x5 per ottenere l'approssimazione migliore di un filtro con frequenza di taglio desiderata su uno scalamento del 10%, la frequenza di taglio normalizzata dovrebbe essere 0.05, nota la frequenza di taglio posso determinare la varianza della gaussiana e posso trovare i coefficienti della matrice (in realtà mi basta un vettore e filtrare per righe e per colonne) magari posso provare a scrivere io in java la funzione, ma non so se è sufficientemente veloce per fare un filtraggio al volo |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:02.