Riscalatura di immagini senza perdita, o quasi

Conoscevo questo video (è stato linkato qualche tempo fa su vari “planet”), ma dopo la segnalazione letta in MessageBox (grazie Dedo!) ho pensato che forse era il caso di mostrarvelo:

L’ingegnoso metodo studiato dal Dr. Ariel Shamir si basa sull’individuazione di “linee di forza” all’interno dell’immagine, che definiscono regioni contigue e “opzionalmente obbligatorie”¹.


Durante una riscalatura, queste regioni, riconosciute automaticamente o anche tracciate manualmente, possono essere eliminate o mantenute in maniera “naturale” o simile a come opererebbe il nostro cevello. In tal modo potremmo ridimensionare immagini senza eccessiva perdita di informazioni.

Non so quanto ve ne possa fregare, ma pollycoke gioverebbe tantissimo di questa nuova tecnologia, dal momento che per ottenere la massima compatibilità con il maggior numero di dispositivi, cerco di usare un layout che ho definito “semiliquido” (ossia: liquido ma con dei limiti) e le immagini non possono mai superare i 550px in larghezza (verificate voi stessi).

Con questo nuovo metodo potrei inserire le immagini senza curarmi delle dimensioni, magari impostando un valore “width=99%” del div contenitore, e il motore html potrebbe gestirsi il ridimensionamento in maniera automatica, aggiungendo o sottraendo informazioni.

Decisamente interessante


[¹] Ha! Cosa ho detto?

56 pensieri su “Riscalatura di immagini senza perdita, o quasi

  1. @squalo:

    roba vecchia…

    E allora? Ma secondo te sono qui a fare il giornalista a caccia dell’ultimo scoop? Il bello è che l’ho pure scritto che il video era già stato segnalato tempo fa da varie fonti.

    @Xander:
    Al momento c’è solo una pubblicazione del prof suddetto. Non so se come e quando questa tecnologia verrà resa disponibile per tutti noi. E a che livello.

  2. @ Opal: LOL! Come non quotarti..

    @Felipe: Grazie per la precisazione. Aspetterò ragguagli in futuro..

    :)

  3. mi è piaciuta soprattutto l’esempio della spiaggia o l’ultima foto, in città, per il resto speso le foto si deformano, anche se in maniera impercettibile, e quindi penso che lo scaling, sia, in quel caso, la soluzione migliore.

  4. interessante.
    ancora + interessante sarebbe l’applicazione automatica dell’algoritmo a immagini caricate con dimensioni impostate in larghezza a 100% :D
    mi sa che c’è bisogno di un nuovo plugin per firefox eheheh :D

  5. questa tecnologia sara integrata a breve in adobe CS suite dato che uno dei creatori e stato assunto dalla nota multinazionale, sono sollo curioso se un programmatore interessato a introdurre una funzionalità simile in gimp incappa in problemi di patenti (o forse no dato che si tratta di un algoritmo?)

  6. C’è anche un wish request per digikam: http://bugs.kde.org/show_bug.cgi?id=149485
    Non sarebbe male averlo direttamente integrato in kde, così che qualsiasi applicazione possa usarla senza doverla rifare di nuovo da zero.
    In quel link ci sono anche diversi url di implementazioni, in python, c++, dovrebbe esserci anche una cosa in matlab che avevo trovato tempo fa. C’è anche un plugin per photoshop che funziona discretamente…e uno per gimp che non sono ancora riuscito a provare

  7. Accidenti, il mio cervellino ha dovuto lavorare per un po’ per afferrare il funzionamento e convincersi che non si tratta di un semplice ridimensionamento ma di una “reinterpretazione” intelligente dell’ immagine in base allo spazio disponibile, e non sono nemmeno sicuro di poterne afferrare appieno le potenzialità, certo sembra lavorare molto bene la cosa..

  8. Ma esistono già versioni funzionanti? Sembrerebbe molto interessante…

    Tempo fa mi era capitato di usare soluzioni simili ma molto più grossolone, tipo questa (http://webdesign.html.it/articoli/stampa/2228/un-sito-ottimizzato-per-wii/) che legge dallo UserAgent il browser utilizzato e fornisce una versioni “lite” della pagina, con immagini e testo ridimensionati, se viene riconosiuto un browser embedded (wii, iphone, opera for symbian, …). Inutile dire che gestire 2/3 diverse versioni per ogni pagina del sito è un casino.

    Con questa soluzione basterebbe scrivere una sola versione della pagina e poi si adatterebbe automaticamente! sbav!

  9. @ felipe
    era un infelice (evidentemente) tentativo di fare un commento ironico.
    Ho scritto che era vecchio proprio perché l’avevi detto tu…

    :-)

  10. grazie gpz500 provato il plugin e funziona anche con gimp 2.3(dicono testato con gimp 2.2) , e sollo che sembra un po lento, ma le imagini dell video sono trasformate in tempo reale o e una di quelle presentazioni tecniche fate per stupire?

  11. Ciao, un plugin per gimp c’è già in effetti. Si trova nel plugin registry http://registry.gimp.org e si chiama Liquid Rescale, oppure per problemi e maggiori informazioni su http://web.tiscali.it/carlobaldassi . Ci sono anche dei pacchetti per Feisty e Gutsy (occhio che sono fatti con checkinstall).

    Per ora è un po’ lento ma i risultati sono spettacolari.
    Tra l’altro se c’è qualcuno che ha voglia di tradurre l’help in italiano…

    Ciao a tutti, fatemi sapere.
    Carlo

  12. letto giusto stamattina su ziobudda.net; interessante. Vedo che esiste il plugin di gimp. Il metodo che descrivi tu dovrebbe essere integrato nel browser, se non ho capito male: un po’ poco generale.
    Però potrebbe essere invece a carico del server: con un po’ troppo carico, forse.
    E allora? boooooh ;-) Magari una soluzione server-side con una cache che contiene versioni della stessa immagine da 100, 200, 300 ….1000 pixel? può esse.

  13. domanda: a cosa servono le immagini sul un sito web? a riempire gli spazi lasciati vuoti? a rendere appetibile una notizia letta? a dare colore a un blog?
    l’immagine è comunicazione.
    che si tratti del NYT o di pollycoke, l’immagine deve contenere un concetto, un’immediatezza che si rende complementare a ciò che è stato scritto. Se vedo uno screenshot di kde4, dove l’algoritmo mi taglia via mezzo ‘raptor’, che vantaggio ne avremo ottenuto ad usare questa tecnologia?
    nel video stesso si vede cosa succede se lo schermo dell’utente è troppo piccolo… perdita di informazione!
    immaginate di fare lo stesso con un commento di questo tipo:
    “Dai Giacomo lascia perdere, non sei uno stronzo!”
    confrontato con questo:
    “Giacomo sei stronzo!”
    Capite perché questa tecnologia è figlia del puro utilitarismo grafico? spero non diventi un ‘must’ della rete….

  14. Da quanto ho capito l’immagine viene modificata in modo da perdere la minima informazione possibile (quindi la perdita di informazione c’è ma è minima).
    Questo comportamento, per quanto spettacolare, non è sempre desiderabile, soprattutto perchè si modificano le proporzioni degli oggetti.

    Come viene mostrato nell’ultima parte del filmato, un modo per evitare che questo accada è “proteggere” una parte dell’immagine, ma questo vuol dire, da parte di chi la produce, *aggiungere* informazioni all’immagine stessa, senza in ogni caso eliminare il problema della modifica delle proporzioni.

    Quindi non so come questa tecnica possa sostituire la normale interpolazione/mediazione del “rescaling” standard nell’uso quotidiano di un desktop environment o di un browser. Sarebbe molto comodo per chi progetta il layout di una pagina, ma i risultati possono essere imprevedibili, a meno di non dotare l’immagine di molta più informazione, caso per caso.

    L’idea è bella e mi sembra che funzioni anche bene, mi sembra perfetta per il fotoritocco e per immagini a basso contenuto informativo (come i paesaggi con gli alberi e le montagne… togliendo qualche albero e pezzi di montagna rimangono sempre alberi e montagne), ma troppo complesso per l’uso automatico e generalista (la scelta della energy function può dipendere dal tipo di soggetto, dal contesto e dalla volontà di chi produce l’immagine, come risulta evidente dal filmato).

  15. @squalo:
    Scusami allora, non avevo colto l’ironia. Ma sai non è facile… già è una vittoria aver quasi del tutto eliminato le stupide sfilze di “primo!” :)

    @flo:
    Grazie mille, interessantissimo.

    @gpz500:
    Veramente ottimo, il plugin di Carlo Baldassi funziona già adesso, e in maniera assolutamente spettacolare!

    @carlo:
    Complimenti vivissimi. Se ho tempo voglio fare un post con delle immagini campione per stimolare eventuali traduttori in ascolto.

  16. @drmauro:
    Interessante obiezione, specie riferita al contesto linguistico. In realtà sappiamo tutti che molto fa il contesto, per cui nel caso da te riportato evidentemente andava fatta una scalatura normale, ma guarda questo esempio:

    1. Sai Giacomo, ho avuto modo di notare che sei un po’ presuntuoso
    2. Giacomo sei presuntuoso

    Direi che in questo caso specifico (da verificare volta per volta? forse per ora sì) il messaggio è molto simile, il risparmio di circa il 60% Non male :)

  17. Video visto poco tempo fa ed è una tecnologia pazzesca secondo me che se implementata in programmi di fotoritocco li renderebbe infinitivamente migliori. Quella parte del video in cui cancella le persone dalla spiaggia facendo rimanere lo sfondo alle loro spalle è qualcosa di pazzesco!

  18. Anche secondo me il risultato è bello perché probabilmente è stato utilizzato un soggetto particolarmente “comprimibile”. Ci stanno ancora lavorando in Adobe, dovrebbe essere la caratteristica principale della nuova versione di Photoshop.
    Dovesse funzionare sarebbe davvero innovativo e soprattutto libererebbe da molti vincoli (spesso era necessario tagliare le foto).
    Pagare e farsi rovinare le vacanze: ADESSO BASTA!

  19. ho fatto una prova. son diventato un gigante in spiaggia :-)
    cmq come si fa a proteggere una parte di contenuto? ho selezionato il quadratino, ma non mi fare sia riuscito troppo…

  20. @kasmol: in realtà non rimane lo sfondo dietro, elimina la parte ed aggiunge informazioni che già ci sono, si vede bene anche ad occhio nudo nel video. E’ una cosa pazzesca.

    @carlo: non ho ancora il tempo di vedere il tuo sito, ma il sorgente del plugin è aperto? Mi piacerebbe proprio leggerlo.

  21. @felipe: grazie :)

    @davide: devi creare un nuovo layer trasparente per le zone che vuoi preservare e uno per le zone che vuoi rimuovere e disegnarci sopra con il pennello. Poi selezioni il layer che vuoi ridimensionare, lanci il plugin e imposti i layer per la protezione/eliminazione. Quando hai finito elimini i layer extra oppure li rendi invisibili.

    @DierRe: ovvio che il sorgente è aperto, aperto e commentato, che domande! :) Fra un po’ comunque ci rimetto mano pesantemente, le idee ce le ho, mi manca il tempo…

    Dimenticavo che il plugin per gimp sarà introdotto in Debian dalla prossima release, nel pacchetto gimp-plugin-registry.

  22. >Con questo nuovo metodo potrei inserire le immagini
    >senza curarmi delle dimensioni, magari impostando
    >un valore “width=99%” del div contenitore, e il motore
    >html potrebbe gestirsi il ridimensionamento in maniera
    >automatica, aggiungendo o sottraendo informazioni.

    Hai colto in pieno il segno!!! Soprattutto in aplicazioni web troverebbe spazio, più che sul desktop dove il problema resta meramente di design grafico di apparenza. Mentre sul web si potrebbe parlare di usabilità dei contenuti (ma alla fine è quasi sempre una questione di design). Tuttavia, ricordo che in questo modo si ha solo l’effetto ottico che l’immagine non abbia perso contenuti, anche perchè se ne perdono le proporzioni e la forma, quindi potrà andar bene solo per un certo tipo di immagine e solo in alcuni casi. Resta il fatto però che è una gran cosa!!! :D

    La stavo per segnalare anche io sul blog dopo averla letta nella messagebox… ;)

  23. come specificato da qualcuno, personalmente, ritengo questa tecnologia interessante in ambito di fotoritocco, vedasi “l’elimiazione” di alcune delle persone sulla spiaggia nel video o cose simili.

    E’ poi OVVIO (ma non sempre così) che bisogna utilizzare ogni tecnologia nel verso giusto. I problemi riscontrabili che sono stati segnalati non implicano il fatto che questa tecnologia sia una boiata come mi sembra invece di percepire da alcuni commenti.

    Ricordiamoci che dietro la macchina ci deve essere un essere pensante che utilizzi gli strumenti giusti, nel modo giusto e nell’ambito giusto…

  24. P.S.
    Ovviamente un algoritmo del genere in programmi di editing di immagine non farebbe assolutamente male, aldilà degli utilizzi reali che se potrebbero fare in ambiente desktop e web. Vabe’ ma questo già era stato detto! ;)

  25. ottimo. lo userò per rimuovermi dai fotogrammi usati per incriminarmi di (in ordine cronologico):
    – tradimento
    – bancarotta fraudolenta
    – rapina in banca
    – rissa
    – guida ubriaco.

    :-)

    pensate all’ottimo uso che potrebbe farne Corona, prende una foto pubblica di un vip/politico/attrice e cancella i pixel fino a farlo abbracciare con personaggi di dubbio gusto!
    quasi quasi mi metto anche io a crear dei falsi ;-)

    scusate il commento idiota.
    cmq interessante come algoritmo.
    lo si può paragonare anche questo a mp3/ogg et similia ma nel campo della grafica?

  26. merita il nobel… :D
    Forse esagero cmq e` un grande risultato… Complimenti al Dr. Ariel Shamir

  27. Carlo sei veramente grande! :O

    Ho provato il tuo plugin per togliere una persona da una foto ed è venuta molto bene! :D

    C’è ancora qualche margine di miglioramento (ad esempio qualche parte della foto è venuta un po’ deformata, ma mi sa che avevo esagerato con il resizing! XD

    Veramente complimenti! ;)

  28. @Dedo: grazie, troppo buono. Il merito preincipale va ovviamente agli ideatori dell’algoritmo, io ho solo “trascritto”.

  29. @Carlo

    Il tuo plug-in è eccezionale.
    Sto facendo delle prove e, a parte qualche sbavatura, va alla grande!

  30. @Felipe: hai ragione, il tuo è un ottimo contro-esempio, ma equivale sempre ad una semplificazione della semantica (spero di non dire castronerie). Il problema che sollevo è che la perdita di informazioni a volte potrebbe far perdere le sfumature: se il cielo in una immagine è il centro focale rispetto all’orizzonte più insipido, togliendolo come farebbe questo algoritmo annullerebbe il significato della foto!

    comunque ribadisco, spero solo che venga applicato con giudizio! effettivamente per ciò che riguarda la pura impaginazione web, sarebbe sicuramente un grande rivoluzione, a prescindere dai concetti un po’ sofistici in cui si può cadere!

  31. Avevo letto da qualche parte che uno dei due autori, sia già stato assunto da Adobe.
    In ogni caso è una tecnica dagli enormi sbocchi nel fotoritocco

  32. Si potrebbe precalcolare e memorizzare la sequenza
    di linee con meno energia, quindi partire da un’immagine
    grande e togliere via via le linee prescelte.

    Per ogni linea basta memorizzare x e y, lasciando perdere
    le informazioni sul colore. Prendendo un’immagine da
    400righex300colonne, ogni colonna tolta sono 400×2=800
    int da memorizzare (cioè un nulla)

    Ad esempio
    punto 1 …
    [[x1a y1a] [x2a y2a]] riga a
    [[x1b y2b] [x2b y2b]] …

    Bisognerebbe cmq avere un plugin di renderizzazione
    apposito, perchè che io sappia Flash di elaborazione
    dell’immagine non si occupa.

    Che qualcuno mi contraddica se dico castronerie!

  33. Hrm, guardando bene che non diventi troppo lento, essendoci anche già una implementazione molto basilare in codice…. perché no?
    Ci penso proprio ad inserirlo in digikam (se quelli del team non ci hanno già pensato), oltre a sembrarmi veramente carino, trovo la manipolazione delle immagini una delle cose più divertenti da fare con il software!
    Grazie felipe per la segnalazione, potrebbe divenire un nuovo tool di digikam (o addirittura un plugin di kipi, quindi utilizzabile da quasi tutte le app grafiche di KDE) questo video.
    Per ora mi appunto il link!

  34. @Wyrmskull, Riccardo Iaconelli: Credo che stiate parlando dell’implementazione per il web o simili, no? In questo caso ci sono una notizia buona e una cattiva:

    La buona è che l’implementazione di una cosa del genere è davvero semplice: per una data immagine, si fa girare l’algoritmo eliminando una linea alla volta, poi sull’immagine originale si crea una mappa dove ad ogni pixel si assegna il numero della striscia, così i pixel della striscia eliminata per prima avranno valore 1, quelli della seconda valore 2 ecc. A partire da questa mappa, diventa immediato ridurre l’immagine: prendiamo un’immagine larga 400 pixel, vogliamo ridurla a 300: basta visualizzare solo i pixel che hanno un valore sulla mappa maggiore di 100 ! Per l’estensione è quasi uguale, si tratta di aggiungere dei pixel in mezzo all’immagine (nei posti giusti) con valori negativi della mappa, et voilà! Scaling in tempo reale al costo di un numero intero per pixel in più (tutto ciò è sempre dovuto agli autori dell’lavoro originale, beninteso…).

    Notare che il codice per il plugin di gimp che ho fatto era stato originariamente concepito in questo modo, dunque il core di un codice per un visualizzatore è già pronto, è l’interfaccia di GIMP che non permette di accedervi (per ora). Tra l’altro il codice è commentato, con l’articolo dovrebbe diventare semplice, se chiunque avesse delle domande/dubbi/richiestedichiarimenti/progettideliranti mi può scrivere.

    Adesso la cattiva notizia… la cosa funziona in una sola dimensione alla volta. Dunque si possono creare immagini cosiddette multi-size, ma ridimensionabili o in orizzontale o in verticale. Gli ideatori dell’algoritmo hanno anche pensato a un metodo per creare immagini riscalabili in due dimensioni, ma ha delle forti limitazioni che lo rendono piuttosto inutile, credo.

    Vabbé direi che basta… :)

  35. Bhe roba vecchia mica tanto… Non so quando sia stata fatta la ricerca vera e propria, ma se e’ stata presentata al siggraph di san diego 2007 stiamo parlando di pochi mesi fa :D mica anni. Io non l’avevo mai vista questa tecnica, e’ un’ottima idea.

  36. @ felipe: ma questo sistema è già un programma? o è solo un prototipo? e in chiave opensource?? potrebbero queste nuove frontiere estendersi al nostro caro pinguinozzo:)?

  37. @ carlo
    Hai ragione, infatti intendevo proprio quello
    [ 1 [x1 y1 ] [x2 y2] … [xn yn] ] –> minima energia
    [ 2 [x1 y2] [x2 y2] … [xn yn] ] –> successiva minima energia
    Visualizza solo righe > 100 = togli 100 righe

    Dici che la ridimensione può essere fatta in una sola dimensione alla volta… beh, non c’è il modo di fare prima una e poi l’altra con risultati decenti? E poi se l’applicazione è veramente il web, allora la cosa è ancora più semplice! Dato che il layout delle pagine web è per consuetudine verticale, basterebbe ridimensionare orizzontalmente.

    Io attualmente non ho tempo a sufficienza e non so come si faccia un plugin di visualizzazione per un qualunque web browser, ma penso che una cosa come la vuole Felipe con pazienza si possa fare.

  38. @Wyrmskull
    Il ridimensionamento si può certamente fare in entrambe dimensioni, quello che intendevo è che la mappa che poi permette di farlo al volo (che dovrebbe essere memorizzata assieme all’immagine originale, e il tutto venire letto con plugin apposito) può essere solo orizzontale o verticale. Se uno calcola entrambe le mappe, e poi ridimensiona per es. in orizzontale, la mappa verticale diventa inutile e viceversa, perché non sono coerenti.

    Se poi a uno basta il ridimensionamento orizzontale non c’è problema :)

    Neanche io so come si fa un plugin per un browser, ma se qualcuno volesse farlo è tutto praticamente già pronto, basterebbe definire in modo preciso il formato. Poi il codice per leggere l’immagine multi-size e trasformarla in una normale per il bowser c’è.

  39. (anche se quello di snipshot mi sa tanto che è un AJAX
    che lascia tutto il lavoro di render al server e il client si
    pappa l’immagine finita)

  40. Più che altro mi sembra utile per ridimensionamenti che non si curano delle proporzioni originali, che ovviamente vengono alterate. È una tecnologia veramente molto bella e promettente, ma rimango dell’idea che per varie cose si userà ancora la scalatura tradizionale.

    Sinceramente non la vedrei bene applicata alle immagini nei browser… :-P

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...