Moving Media As Convoluzione


La sfocatura per principianti Introduzione Questo è un breve tutorial su sfocatura tecniche per i principianti. Quando stavo imparando questa roba, c'era molto poco materiale a disposizione che era molto utile. Quello non è vero, naturalmente - c'era masse di materiale, ma la metà di esso era troppo semplice e l'altra metà ha cominciato Sia T una funzione vettoriale valutata nell'intervallo semiaperto. ed era pieno di molto spaventosi equazioni multilinea con quei grandi simboli Sigma e le cose. Questo articolo ha lo scopo di porre rimedio a questo. parlare male di vari tipi di sfocatura e gli effetti si possono utilizzare per, con il codice sorgente di Java. A Nota Ogni volta che la sfocatura menzionato, c'è sempre qualcuno che dice Hey Quello non è un vero e proprio motion blur, o scrive lettere arrabbiati in inchiostro verde lamentano che la matematica è dubbia o che theres un modo molto più veloce per farlo usando i registri sponglerizer sul HAL -9000. Ignorare queste persone. Questo è un grande soggetto, e questo articolo è solo per i principianti (di cui posso dire con orgoglio io sono uno). Ciò che conta è ottenere i risultati che sei volte per, e se i risultati youre puntando richiede dubbie la matematica, allora così sia. Se i risultati youre puntando aspetto orribile per me, allora questo è bene, a patto che si guardano bene a voi. Un altro codice sorgente di responsabilità Theres in Java per tutto abbastanza bene parlo qui. Non faccio affermazioni che questi sono ottimizzati in alcun modo - Ive optato per la semplicità sulla velocità ovunque e youll probabilmente in grado di fare la maggior parte di queste cose andare più veloce, con un po 'di sforzo. È possibile utilizzare il codice sorgente per tutto quello che vuoi, anche a fini commerciali, ma c'è alcuna responsabilità. Se il sistema centrale o missile nucleare non riesce a causa di una sfocatura improprio, non è colpa mia. Cosa è la sfocatura Sappiamo tutti cosa è la sfocatura, dont noi La sua quella cosa che si verifica quando la fotocamera è fuori fuoco o il cane ruba gli occhiali. Quello che succede è che ciò che dovrebbe essere visto come un punto tagliente viene spalmato fuori, di solito in una forma di disco. In termini di immagine, ciò significa che ogni pixel dell'immagine sorgente viene distribuito su e mescolato in pixel circostanti. Un altro modo di guardare a questo è che ogni pixel nell'immagine di destinazione è costituito da una miscela di circostante pixel dall'immagine sorgente. L'operazione è necessario per questo è chiamato convoluzione. Sembra complicato, ma questo è solo perché i matematici piace fare le cose sembrare complicato in modo da mantenere che l'aria di magia e mantenere il finanziamento a rotazione. Bene, Im su di loro e posso rivelare che spira non è così complicato (al mio livello comunque) . Il modo in cui funziona è questo: immaginiamo scorrere una matrice rettangolare di numeri sopra la nostra immagine. Questo vettore è chiamato il nucleo di convoluzione. Per ogni pixel dell'immagine, prendiamo i numeri corrispondenti dal kernel ei pixel sono sopra, li moltiplichiamo insieme e aggiungere tutti i risultati insieme per rendere il nuovo pixel. Ad esempio, immaginiamo che vogliamo fare davvero un semplice sfocatura dove abbiamo appena media insieme ogni pixel ei suoi otto immediati vicini. Il kernel abbiamo bisogno è: Si noti che questi tutti aggiungere fino a 1, il che significa che la nostra immagine risultante sarà altrettanto brillante come l'originale. Senza ulteriori indugi, lascia sfocatura dell'immagine in Java. Tutta quella roba convoluzione suona difficile da implementare, ma per fortuna Java viene fornito con un built-in e l'operatore pronto per l'uso di fare esattamente questo. Im parlando ConvolveOp qui. Ecco il codice: Fantastico Un'immagine sfocata La sua non è molto sfocata però. Consente di fare davvero un grande sfocatura in questo modo: Hmmmmmm. Beh, quello non è così buono. Non solo ci vuole un sacco di tempo, ma il risultato è un po 'strano - tutto sembra, beh, una sorta di piazza, e ciò che sulla terra è accaduto attorno ai bordi Prima i bordi: ConvolveOp è una timida cosa sdolcinato che è paura di cadere dal bordo dell'immagine. Se il kernel sovrapporsi al bordo dell'immagine, dà solo su e lascia solo il pixel invariato. È possibile modificare questo passando EDGEZEROFILL invece di EDGENOOP, ma questo è ancora peggio - i pixel intorno al bordo solo ottenere set a zero e in modo efficace scomparire. Che cosa dobbiamo fare Beh, potremmo pad l'immagine fuori intorno ai bordi prima di sfocatura e ritagliare il risultato, ma questo è solo cedere, e inoltre ci andrei imparare qualcosa. Invece, ben scrivere una vera e propria, senza paura, operatore di no-nonsense che costerà paura dei bordi. Bene chiamano ConvolveFilter per distinguerlo da ConvolveOp. Im non andando a fare nei dettagli della fonte di questo articolo - non ce n'è abbastanza tempo o spazio e abbiamo un sacco di filtri di ricerca di scrivere ancora, ma è possibile scaricare o visualizzare la sorgente e dovrebbe essere abbastanza auto-esplicativo. Ora il problema quadratura: La ragione per cui tutto sembra piazza è perché ciò che state facendo qui è chiamata una scatola di sfocatura - il kernel ha la forma di un quadrato, come se stavano usando una macchina fotografica, che ha un'apertura quadrata. Per inciso, non lasciare nessuno di dirti che sfuma box sono inutili - in realtà se stai simulando l'ombra proiettata da una luce quadrata, la sua esattamente quello che vuoi. Ad ogni modo, theyll tornare utile più avanti. Un'altra cosa: Non confondetevi - Im utilizzando la casella di sfocatura termine per riferirsi alla forma del kernel, non il suo profilo, che ho intenzione di chiamare un filtro scatola. Altro su questo più avanti. Per ottenere una sfocatura più realistico, che cosa avremmo dovuto fare si utilizza un kernel a forma di cerchio. Questo simula molto meglio quello che una vera e propria fotocamera fa. È molto meglio. Bene tornare in questo più avanti, ma prima una deviazione di nuovo alla casella di sfocatura. Weve risolto il problema dei pixel bordo, ma il nostro sfocatura è ancora in corso molto lentamente, e le cose sono solo andando a peggiorare. Il problema è che il numero di moltiplicazioni della convoluzione sta salendo come il quadrato del raggio kernel. Con un kernel 100x100, sono state andando a fare 10000 moltiplica e aggiunge per pixel (circa). Come possiamo aggirare questo Si scopre che ci sono più modi per andare su questo che Ive ha forse avuto il tempo di scrivere, o anche la briga di guardare. Un modo citerò rapidamente prima di spazzare sotto il tappeto è questo: Si può fare una scatola di sfocatura, riducendo il vostro immagine, sfocatura e scala di nuovo. Questo può andare bene per i vostri scopi, e si dovrebbe tenere a mente. Un problema è che si pretende molto animato molto bene, ma non può essere una preoccupazione per voi. Consente cerca nella casella sfocatura di nuovo: Si scopre che theres un paio di modi veramente facile per accelerare l'operazione. In primo luogo, si scopre che la casella di sfocatura è separabile. Ciò significa che possiamo fare una sfocatura 2D facendo due sfocature 1D, una volta nella direzione orizzontale e una volta nella direzione verticale. Questo è molto più veloce di fare la sfocatura 2D perché il tempo impiegato va in proporzione alla dimensione del kernel, non come suo quadrato. In secondo luogo, Pensare la finestra che sono state scivolando attraverso l'immagine. Come ci si sposta da sinistra a destra, i pixel vengono in sul bordo destro e vengono aggiunti al totale e al tempo stesso pixel lasciano il bordo sinistro e vengono sottratti dal totale. Tutto quello che dobbiamo fare è solo fare il aggiungere e sottrarre per l'inserimento e pixel lasciando ad ogni passo, invece di aggiungere insieme tutti i pixel nella finestra. Abbiamo solo bisogno di memorizzare una serie di totali parziali, che sono la larghezza o l'altezza del kernel. Questo dà un enorme miglioramento velocità a costo di dover scrivere del codice. Per fortuna, Ive ha scritto il codice per voi, in modo da vincere tutto. Abbiamo bisogno di due passaggi, una volta a sfumare in orizzontale e in verticale una volta. Il codice per questi è, ovviamente, molto diverso. Ma aspettate C'è un trucco che possiamo fare che ci permette solo di scrivere il codice una volta. Se scriviamo una funzione di offuscamento che fa la sfocatura orizzontale ma scrive la sua immagine in uscita trasposto, allora possiamo solo chiamare due volte. Il primo passaggio offusca orizzontale e traspone, il secondo passaggio fa la stessa cosa, ma come l'immagine è ora trasposta, la sua davvero facendo una sfocatura verticale. La seconda trasposizione rende l'immagine nel modo giusto di nuovo e voilà - una scatola di sfocatura molto veloce. Provalo in questa applet: Ed ecco il codice sorgente. Avrete notato che abbiamo usato solo un raggio intero finora che lo rende facile di elaborare gli indici degli array per la sfocatura. Siamo in grado di estendere la tecnica per fare sub-pixel sfocatura (vale a dire un raggio non integrale) semplicemente per interpolazione lineare tra i valori di matrice. Il mio codice sorgente pretende molto fare questo, ma è facile da aggiungere. Controllo sfocatura Ora è il momento di affrontare i problemi di velocità e di sfocatura quadrati guardando allo stesso tempo. Per sbarazzarsi del look piazza per la sfocatura, abbiamo bisogno di un kernel a forma circolare. Purtroppo, il trucco che abbiamo usato per la scatola confonde non funziona con un cerchio ma c'è una scappatoia: se il kernel ha il diritto profilo - il profilo gaussiano - allora possiamo fare una sfocatura 2D effettuando due sfocature 1D, proprio come abbiamo fatto con il scatola di sfocatura. La sua non è così veloce perché la finestra scorrevole trucco non funziona, ma la sua ancora molto più veloce di fare la convoluzione 2D. Il profilo di cui abbiamo bisogno è la, o una curva familiare a forma di campana di Gauss che avete sentito di: Heres il codice per creare un kernel gaussiano 1D per un determinato raggio. Tutto quello che dobbiamo fare è di applicare due volte, una volta in senso orizzontale e una volta in verticale. Come fx, Ive avvolse in un GaussianFilter per rendere più facile da usare. Questo è il motivo per cui la sfocatura gaussiana si trova in ogni pacchetto di grafica - la sua molto più veloce rispetto ad altri tipi di sfocatura. L'unico problema è che la sua non è molto realistico quando si tratta di simulazione di lenti della fotocamera, ma ne riparleremo più avanti. Se si vuole fare le cose come le ombre che simulano, quindi la sfocatura gaussiana, o anche la casella sfocatura può essere più che bene. C'è un posto per tutti questi effetti - solo perché arent pretende molto realistico dire theyre non è utile. La sfocatura gaussiana è molto più veloce, ma la sua in nessun posto vicino veloce come la nostra casella di sfocatura abbiamo fatto in precedenza. Se solo ci fosse un modo per combinare le due. Immagino youve indovinato da ora che ci potrebbe essere uno, in modo malato non tenere la suspense più: se si fanno un sacco di scatola di sbavature, il risultato appare sempre più come una sfocatura gaussiana. In realtà, si può dimostrare matematicamente se youve un momento libero (ma non lo dirmi come - Im non interessati). In pratica, da 3 a 5 box sfocature guardare piuttosto bene. Dont basta prendere la mia parola per esso: L'applet scatola sfocatura ha sopra un cursore iterazioni modo da poter provare fuori per lei. Canali alfa Un rapido deviazione qui per discutere di un problema che spesso affiora: Immaginate di voler offuscare una forma che è su uno sfondo trasparente. Youve ha ottenuto un'immagine vuota, e si disegna una forma su di esso, quindi sfocare l'immagine. Aspetta - perché il po 'sfocato guardare troppo scuro La ragione è che weve offuscata ogni canale separatamente, ma in cui il canale alfa è pari a zero (i bit trasparenti), i canali rosso, verde e blu sono pari a zero, o nero. Quando si esegue la sfocatura, il nero viene mescolato con i bit opache e si ottiene un ombra scura. La soluzione è quella di premoltiplicazione l'alfa immagine prima di sfocatura e unpremultiply in seguito. Naturalmente, se le immagini sono già premoltiplicati, sei a posto. Motion Blur Tempo per un cambio di direzione. Finora weve parlato solo di sfocature uniformi, ma ci sono altri tipi. Motion blur è la sfocatura si ottiene quando un oggetto (o la telecamera) si muove durante l'esposizione. L'immagine viene sfocata lungo il percorso apparente dell'oggetto. Qui sono stati solo andando a parlare di simulazione di sfocatura di movimento su un'immagine esistente ancora - facendo sfocatura di movimento nelle animazioni è tutta una zona diversa. Sono stati anche solo andando a essere sfocatura l'intera immagine - non stavano andando per cercare di offuscare un oggetto nell'immagine. La buona notizia è che weve già fatto semplice effetto movimento. Torna l'applet scatola sfocatura sopra e impostare il raggio orizzontale, diciamo 10, e il raggio verticale a zero. Questo ti dà un bel effetto movimento orizzontale. Per alcuni scopi, questo può essere tutto ciò che serve. Ad esempio, un modo per produrre una texture metallo spazzolato è prendere un'immagine consistente di rumore casuale e applicare una sfocatura di movimento. Se vogliamo sfocatura in una direzione diversa da quella orizzontale o verticale, quindi le cose si fanno più complicate. Una tecnica potrebbe essere quella di ruotare l'immagine, sfocatura e quindi ruotare indietro. Cosa ben fare qui anche se è di farlo nel modo più duro e lento. Quello che dobbiamo fare è un loop all'interno di immagine, e per ogni pixel, si sommano tutti i pixel lungo il percorso di movimento. Per un effetto movimento rettilineo, questo significa solo seguendo una linea retta dal pixel, ma si potrebbe seguire un percorso sinuoso se si voleva simulare a lunga esposizione vibrazioni della fotocamera, dicono. Spin e Sfocatura zoom Una volta weve ha ottenuto il codice per la sfocatura movimento in atto, è una semplice questione di modificarlo per fare lo zoom e la rotazione sfuma, o anche una combinazione di tutti e tre. Il suo solo una questione di seguire la strada giusta per ogni pixel. Per sfocature radiali, basta seguire un percorso che va dal centro sfocatura. Per un giro sfocatura, seguire un percorso tangenziale. Provalo in questa applet: Heres il codice sorgente per fare questi tre tipi di motion blur: Più veloce Motion Blur Avrete notato che facendo il motion blur è un business piuttosto lento - tutti quei seni e coseni veramente le cose rallentare. Se non fosse così preoccupato per la qualità, però, siamo in grado di accelerare l'operazione. Tutto quello che dobbiamo fare è aggiungere insieme un sacco di versioni trasformate dell'immagine in un modo intelligente. L'aspetto interessante è che possiamo fare un motion blur 1-pixel facendo la media l'immagine e la stessa immagine tradotto da un pixel. Possiamo fare una sfocatura di 2 pixel ripetendo questo con i 1-pixel immagini sfocate. Ripetendo questo possiamo fare una sfocatura N-pixel in operazioni log2 (N), che è molto meglio che farlo nel modo più duro e lento. Zoom e di spin sfocature può essere fatto da scalare e ruotare invece di tradurre. Un filtro farà tutti e tre con un AffineTransform. Provalo in questa applet: Dominio Shifting Theres ancora un altro modo per fare queste movimento che offusca: Ricorda Ho detto che si possa fare la sfocatura movimento lineare ruotando l'immagine, facendo una scatola di sfocatura orizzontale e ruotando indietro Ebbene, lo stesso vale per il zoom e rotazione sfuma, tranne avete bisogno di qualcosa di più complicato di rotazione. Quello che vi serve è l'esatto trasformazione. Una volta che avete trasformato la vostra immagine, una scatola di sfocatura orizzontale è uno spin quando si trasforma indietro, e una scatola di sfocatura verticale fornisce una sfocatura zoom. Un dettaglio è che avete bisogno di una speciale scatola di sfocatura orizzontale che avvolge i bordi altrimenti youll ottenere una linea verticale nitida nella vostra immagine sfocata in cui l'angolo di rotazione deve andare a capo turno. La sfocatura da trasformata di Fourier La sfocatura gaussiana è molto bene quando si desidera che effetto di sfocatura gaussiana, ma cosa succede se si desidera una sfocatura lente corretta che simula una apertura vera e propria macchina fotografica guardare qualsiasi film o programma TV per un po ', soprattutto qualcosa girato di notte con le luci sullo sfondo, e youll vedere che le cose che sono fuori forma fuoco forme di dischi, o forse pentagoni. C'è anche un fenomeno chiamato in fiore dove le parti luminose dell'immagine lavare l'immagine, diventando ancora più luminoso rispetto al resto. Queste forme sono chiamati Bokeh. Alcune persone lo amano e alcune persone lo odiano. Noi non interessa se la gente lo amano o lo odiano, vogliamo solo riprodurlo. Si voleva ottenere quelle forme di disco con sfocatura gaussiana - il suo solo troppo sfocata intorno ai bordi. Quello che dovete fare è usare un bel nucleo di convoluzione a spigolo vivo nella forma della apertura della fotocamera. Il problema youll venire attraverso qui è che tutti quei trucchi da fare con i kernel separabili, sfocature box iterati e simili non funzionerà qui - non c'è nessun kernel separabili che vi darà un pentagono (beh, probabilmente - Im nessun matematico) - sono tornati a il vecchio problema del tempo di sfocatura salendo come il quadrato del raggio di sfocatura. Non temere, siamo in grado di trasformare le armi pesanti matematici sul problema. Non so come funzionano le armi pesanti, ma li posso puntare. Le pistole pesanti sono trasformate di Fourier. Non so come funzionano perché non ero l'ascolto nelle mie lezioni universitarie, ma c'è una grande quantità sul tema si possono trovare su Internet, anche se praticamente nulla pratico (cioè con il codice sorgente) sul tema della sfocatura. Con trasformate di Fourier, è possibile effettuare una sfocatura che prende un tempo inalterato dal raggio di sfocatura (in pratica, trattare con i bordi dell'immagine significa questo non è del tutto vero). Sfortunatamente, questo significa che per un piccolo raggio, il suo lento, ma si vince proprio con un grande raggio. Un modo per affrontare questo è quello di utilizzare il semplice convoluzione per raggi piccoli, e passare a trasformate di Fourier quando si raggiunge al punto di crossover nel tempo, assumendo avete fatto degli esperimenti per determinare dove si trova. Ma attenzione, se sei animare una sfocatura, youve avuto modo di fare in modo che non si ottengono qualsiasi artefatto visibile nel punto in cui si passa algoritmo - l'occhio è veramente bravo a individuare quelli. Per questo motivo, si può scegliere di attaccare con un algoritmo per l'intera un'animazione. Per le immagini, nessuno sta andando a notare. Veramente. E 'davvero un aspetto diverso Sicuramente, siamo in grado di cavarsela con una sfocatura gaussiana Bene, ecco un esempio che vi aiuterà a rendere la vostra mente. Il principio alla base facendo la sfocatura non è troppo difficile, anche se sembra come una magia. Quello che facciamo è prendere l'immagine e il kernel, ed eseguire la trasformata di Fourier su entrambi. Abbiamo poi moltiplichiamo le proposte e trasformazione inversa indietro. Questo è esattamente lo stesso come l'esecuzione lungo convoluzione sopra (a parte errori di arrotondamento). Non avete davvero bisogno di sapere che cosa una trasformata di Fourier fa per implementare questo, ma in ogni caso, ciò che fa è quella di convertire l'immagine nello spazio di frequenza - l'immagine risultante è una rappresentazione dall'aspetto strano delle frequenze spaziali dell'immagine. L'inverso, ovviamente, trasforma verso lo spazio. ehm, lo spazio. Pensate a come un equalizzatore grafico per le immagini. Si può pensare di sfocatura dell'immagine come la rimozione di alte frequenze da esso, in modo thats come trasformate di Fourier venire nella foto. L'implementazione di questa è in realtà abbastanza semplice, ma ci sono un sacco di dettagli brutte di cui preoccuparsi. Prima di tutto abbiamo bisogno di alcune funzioni per fare la trasformazione e la sua inversa. Questi possono essere trovati nella FFT classe. Questo non è affatto una implementazione super-ottimizzato - si possono trovare molti di quelli altrove su Internet. Quindi, abbiamo bisogno di convertire il kernel in una immagine della stessa dimensione dell'immagine erano sfocatura (Im sicuro che ci sono modi per evitare questo, ma non so abbastanza matematica - se solo Id ascoltato in quelle lezioni). Abbiamo anche bisogno di pad nostra immagine di origine fuori dal raggio della sfocatura, duplicando i pixel del bordo come il suo duro per ottenere la FFT a che fare con i bordi di questo tipo. Ora, la FFT lavora su numeri complessi, quindi abbiamo bisogno di copiare l'immagine del kernel e in array galleggiante. Possiamo fare un trucco qui - le nostre immagini hanno quattro canali (alfa, rosso, verde e blu), quindi abbiamo bisogno di fare quattro le trasformazioni più uno per il kernel, rendendo cinque, ma dal momento che stavano usando i numeri complessi che possiamo fare due si trasforma in una sola volta da puttng un canale nella parte reale della matrice ed un canale nella parte immaginaria. Ora le cose si fanno facile, basta trasformare l'immagine ed il kernel, complesso si moltiplicano insieme e trasformazione inversa e noi abbiamo la nostra immagine di nuovo, ma convoluta con il kernel. Un ultimo piccolo dettaglio è che i swap processo di trasformazione nel corso dei quadranti della immagine in modo abbiamo bisogno di unswap. Solo un piccolo dettaglio rimane: la FFT funziona solo su immagini che sono potenze di 2 in ciascuna direzione. Quello che dobbiamo fare è aggiungere il doppio del raggio di sfocatura per la larghezza e l'altezza, trovare il prossimo più alta potenza di 2 e rendere le nostre array di dimensioni. Per i grandi immagini questo ha un paio di problemi: uno è che utilizzavano fino molta memoria. Ricordate che abbiamo le nostre immagini in un array galleggiante e abbiamo bisogno di 6 di questi array, ognuno dei quali è di 4 volte le dimensioni dell'immagine quando il suo stato ampliato per una potenza di due. La macchina virtuale Java potrebbe lamentarsi a voi se provate questo su una grande immagine (lo so, Ive ha provato). Il secondo problema è relativo: Le cose basta andare più lento con le immagini di grandi dimensioni a causa di problemi di memoria cache. La risposta è quella di dividere l'immagine in tessere e sfocatura ogni piastrella separatamente. La scelta di una buona dimensione piastrella è un problema di ricerca opzione (cioè io havent stato disturbato di sperimentare molto), ma è difficile - abbiamo bisogno di sovrapporre le piastrelle dal raggio di sfocatura, quindi se abbiamo scelto una dimensione di piastrelle di 256, con un raggio di sfocatura di 127 , sposare solo essere sfocatura 4 pixel con ogni piastrella. Provalo in questa applet: Soglia Sfoca Qualcosa che è spesso voluto è una macchia che offusca le parti dell'immagine che sono molto simili, ma conserva spigoli vivi. Si tratta di crema antirughe digitale e si può vedere questo in ogni poster del film mai stampato - le stelle facce hanno tutte quelle macchie brutte stirate senza l'immagine che appare sfocata. Spesso questo è così esagerato che gli attori sembrano cere o figure generate dal computer. Il modo in cui farlo è quello di fare una spira ordinario, ma contare solo in pixel che sono simili a quelli del pixel bersaglio circostante. Specificamente, abbiamo una soglia e includiamo solo un pixel nella convoluzione se differisce dal centro del pixel non supera la soglia. Purtroppo, le scorciatoie che abbiamo preso in precedenza non funzionerà qui come abbiamo bisogno di includere un diverso insieme di pixel circostanti per ciascun pixel di destinazione, così sono tornati alla piena convoluzione di nuovo. Ora, anche se questo è estremamente dubbia, in realtà funziona abbastanza bene per fare ancora due circonvoluzioni 1D per una sfocatura gaussiana, che è più veloce di fare il pieno di convoluzione 2D, quindi questo è quello che Ive fatto qui. Sentitevi liberi di modificare la fonte di fare la cosa completa. Provalo in questa applet: Variabile Sfuocature Finora weve ha parlato solo di uniforme sfuma - in cui il raggio di sfocatura è la stessa in ogni punto. Per alcuni scopi, è bello avere sbavature che hanno un raggio diverso per ogni punto dell'immagine. Un esempio sta simulando la profondità di campo: Si potrebbe prendere un'immagine che è a fuoco in tutto e applicare una sfocatura variabile ad esso per fare le parti guardare fuori fuoco. Reale profondità di campo è più complicato di questo, perché un oggetto che si trova dietro un altro oggetto non dovrebbe ricevere alcuna sfocatura dall'oggetto di fronte, ma ben ignorare che e lasciare ai professionisti. Ora, i nostri trucchi di fantasia sopra Arent ci aiuterà molto qui come tutto ciò che riguarda i kernel precalcolato o si basa sul raggio di sfocatura essendo la stessa sull'immagine e, a prima vista sembra che weve ha ottenuto soltanto la possibilità di ripiegare sulla piena circonvoluzione a ogni pixel, solo che questa volta la sua molto peggio, come il kernel potrebbe avere cambiato dal pixel precedente. Tuttavia, non tutto è perduto. Ricordate che trucco con scatola offusca dove abbiamo appena aggiunto in pixel mentre entravano il kernel e sottratti come hanno lasciato Sembra come se questo non funzionerà nel caso raggio variabile perché sposare devono tenere i totali per ogni possibile raggio, ma c'è una modifica possiamo fare per il trucco che ci permette di tirare fuori magicamente i totali per qualsiasi raggio con un solo sottrazione. Quello che facciamo è pre-elaborazione dell'immagine e sostituire ogni pixel dalla somma di tutti i pixel a sinistra. In questo modo quando si vuole trovare il totale di tutti i pixel tra due punti in un linea di scansione, abbiamo solo bisogno di sottrarre la prima dalla seconda. Questo ci permette di fare un veloce sfocatura variabile utilizzando una versione modificata del codice sfocatura casella sopra. Trattare con i bordi è leggermente più complicato come semplicemente sottraendo il lavoro totali doesnt per pixel largo margine, ma questo è un dettaglio minore. Dobbiamo anche un po 'di più spazio perché i totali andrà sopra del valore massimo di un pixel - ben necessario utilizzare un int per canale invece di memorizzare quattro canali in un int. Beh, OK, ma questa è una gaussiana (ish) sfocatura isnt che cosa di fare quella cosa lente sfocatura con raggio variabile Purtroppo, sei fuori di fortuna qui. Im non dicendo che c'è neanche un modo super veloce per farlo, ma per quanto ne so si sta andando ad avere per fare la cosa piena di convoluzione. Provalo in questa applet, che offusca più come ci si sposta verso destra: affilatura sfocando È possibile utilizzare una sfocatura per affinare l'immagine così come sfocatura usando una tecnica chiamata maschera di contrasto. Quello che fai è prendere l'immagine e sottrarre una versione sfocata, avendo cura di compensare la perdita di luminosità. Questo suona come una magia, ma funziona davvero: confronta questa immagine con l'originale. Provalo in questa applet: se sottraendo una versione sfocata di un'immagine da sé affila, cosa fa aggiungendolo fare come sempre, non c'è bisogno di indovinare - Im qui per informarvi. Quello che si ottiene è una sorta di effetto luminoso che può apparire abbastanza piacevole, o addirittura formaggio a seconda dei punti di vista. Variando la quantità di sfocatura aggiunto varia l'effetto incandescente. Si può vedere questo effetto usato molto in televisione per le transizioni da sogno al futuro. Provalo in questa applet: creando ombre Fare un'ombra è solo una questione di creare un'immagine che appare come la sagoma dell'oggetto del pedinamento, sfocatura, possibilmente distorcendo o lo spostamento, e incollare l'immagine originale sopra le righe. Poiché si tratta di un fatto comune il desiderio di fare, ci dovrebbe essere un filtro per farlo, e qui è. Questo è in realtà una implementazione molto semplicistica - è solo offusca l'ombra e disegna l'immagine originale sopra le righe. In pratica, è meglio non disturbare confondendo i pixel che sono completamente nascosti dall'oggetto. Casting Raggi Possiamo fare lo stesso trucco per fare i raggi di luce sembrano uscire da un oggetto, solo che questa volta rendendo il colore dell'ombra bianco e utilizzando una sfocatura zoom al posto della sfocatura ordinaria, aggiungendo poi il risultato in cima alla originale. I raggi spesso un aspetto migliore se li lanci solo dalle parti luminose dell'immagine, in modo che il filtro ha una soglia che può essere impostato per limitare i raggi di aree luminose. Questo è un buon effetto per animare: rendere il centro dei raggi muoversi attraverso l'immagine e si ottiene l'effetto di una sorgente di luce in movimento dietro l'immagine. Conclusione Bene, questo è tutto, e Ive nemmeno menzionato altri metodi di sfocatura come filtri IIR, filtri ricorsivi e tutte quelle altre cose brutte. Spero che tu vieni via con qualcosa di utile da questo, anche se è solo un ardente desiderio di comprare un po 'di inchiostro verde e mi scrivere la lettera. Infine, avrete notato che la fonte di cui sopra si basa su alcune altre classi. Non ti preoccupare, qui sono: Lodes Computer grafica Tutorial Immagine filtraggio Indice Introduzione filtraggio immagine consente di applicare vari effetti sulle foto. Il tipo di filtraggio immagine qui descritto utilizza un filtro 2D simile a quello incluso in Paint Shop Pro come definito dall'utente Filtro e in Photoshop come filtro personalizzato. Convoluzione Il trucco di filtraggio immagine è quella di avere una matrice di filtro 2D, e l'immagine 2D. Quindi, per ogni pixel dell'immagine, prendere la somma dei prodotti. Ogni prodotto è il valore di colore del pixel corrente o un vicino di esso, con il valore corrispondente della matrice del filtro. Il centro della matrice filtro deve essere moltiplicati per il pixel corrente, gli altri elementi della matrice del filtro con corrispondenti pixel vicini. Questa operazione dove si prende la somma dei prodotti di elementi provenienti da due funzioni 2D, dove si lascia una delle due funzioni si muovono su ogni elemento della altra funzione, viene chiamata Convoluzione o correlazione. La differenza tra convoluzione e correlazione è che per convoluzione si deve rispecchiare la matrice del filtro, ma di solito il suo simmetrico comunque in modo non c'è nessun differenza. I filtri con convoluzione sono relativamente semplici. filtri più complessi, che possono utilizzare più funzioni di fantasia, esistono pure, e possono fare cose molto più complessi (ad esempio, il filtro matita colorata in Photoshop), ma tali filtri arent discusso qui. L'operazione di convoluzione 2D richiede un 4-doppio loop, quindi si mangia estremamente veloce, a meno di utilizzare piccoli filtri. Qui ben solitamente utilizzando filtri 3x3 o 5x5. Ci sono alcune regole per il filtro: La sua dimensione deve essere uniforme, in modo che abbia un centro, per esempio 3x3, 5x5 e 7x7 sono ok. Non deve, ma la somma di tutti gli elementi del filtro deve essere 1 se si desidera che l'immagine risultante di avere la stessa luminosità come l'originale. Se la somma degli elementi è maggiore di 1, il risultato sarà un'immagine più luminosa, e se minore di 1, un'immagine più scura. Se la somma è pari a 0, l'immagine risultante non sta necessariamente del tutto nero, ma itll essere molto scuro. L'immagine ha dimensioni finite, e se intendente ad esempio il calcolo di un pixel sul lato sinistro, ci sono altri pixel a sinistra mentre questi sono necessari per la convoluzione. È possibile utilizzare il valore 0, oppure avvolgere intorno all'altro lato dell'immagine. In questo tutorial, l'involucro intorno è scelto perché può facilmente essere fatto con un valori di pixel modulo division. The risultanti dopo l'applicazione del filtro può essere negativo o maggiore di 255, se ciò accade è possibile troncare in modo che valori inferiori a 0 sono inviato 0 e valori più grandi di 255 sono impostati a 255. per valori negativi, si può anche prendere invece il valore assoluto. Nel dominio di Fourier dominio o frequenza, l'operazione di convoluzione diventa una moltiplicazione invece, che è più veloce. Nel dominio di Fourier, filtri molto più potente e più grandi possono essere applicati più velocemente, soprattutto se si utilizza il Fast Fourier Transform. Di più su questo è in questo articolo Fourier Transform. In questo articolo, ben osservare alcuni piccoli filtri molto tipici, come sfocatura, il rilevamento dei bordi e rilievo. filtri di immagine arent fattibile per applicazioni in tempo reale e giochi ancora, ma theyre utile nella elaborazione delle immagini. filtri audio ed elettroniche digitali lavorano con convoluzione pure, ma in 1D. Ecco il codice thatll essere utilizzato per provare diversi filtri. Oltre ad utilizzare una matrice di filtro, ma ha anche un fattore moltiplicatore e un bias. Dopo l'applicazione del filtro, il fattore viene moltiplicato con il risultato, e il bias aggiunto ad esso. Quindi, se si dispone di un filtro con un elemento 0.25 in esso, ma il fattore è impostato su 2, tutti gli elementi del filtro sono, in teoria, moltiplicato per due in modo che elemento 0.25 è in realtà 0,5. La polarizzazione può essere utilizzato se si vuole rendere l'immagine più luminosa risultante. Il risultato di un pixel viene memorizzato in galleggianti rosso, verde e blu, prima della conversione al valore intero nel buffer risultato. Il calcolo filtro stesso è un 4-doppio anello che deve passare attraverso ogni pixel dell'immagine, e poi attraverso ogni elemento della matrice del filtro. La posizione imageX e imageY è calcolata in modo che per l'elemento centrale del filtro itll sia x, y, ma per gli altri elementi itll essere un pixel dall'immagine a sinistra, destra, superiore o inferiore di x, y. Il suo modulo divisa attraverso la larghezza (w) o altezza (h) dell'immagine in modo che i pixel al di fuori l'immagine saranno avvolti intorno. Prima con modulo dividendola, w o H sono anche aggiunti ad esso, perché questo modulo lavoro divisione pretende molto correttamente per i valori negativi. Ora pixel, pixel (-1, -1) diventerà correttamente (w-1, h-1). Se si vuole prendere il valore assoluto di valori inferiori a zero, invece di troncare esso, utilizzare questo codice invece: Time Series analisi TSA statsmodels. tsa contiene classi del modello e le funzioni che sono utili per l'analisi di serie temporali. Questo include attualmente modelli univariati autoregressivi (AR), vettore autoregressivo modelli (VAR) e autoregressiva univariata modello a media mobile (ARMA). Esso comprende anche statistiche descrittive per serie temporale, per esempio autocorrelazione, funzione di autocorrelazione parziale e periodogramma, nonché le corrispondenti proprietà teoriche di ARMA o processi correlati. It also includes methods to work with autoregressive and moving average lag-polynomials. Additionally, related statistical tests and some useful helper functions are available. Estimation is either done by exact or conditional Maximum Likelihood or conditional least-squares, either using Kalman Filter or direct filters. Currently, functions and classes have to be imported from the corresponding module, but the main classes will be made available in the statsmodels. tsa namespace. The module structure is within statsmodels. tsa is stattools. empirical properties and tests, acf, pacf, granger-causality, adf unit root test, ljung-box test and others. armodel. univariate autoregressive process, estimation with conditional and exact maximum likelihood and conditional least-squares arimamodel. univariate ARMA process, estimation with conditional and exact maximum likelihood and conditional least-squares vectorar, var. vector autoregressive process (VAR) estimation models, impulse response analysis, forecast error variance decompositions, and data visualization tools kalmanf. estimation classes for ARMA and other models with exact MLE using Kalman Filter armaprocess. properties of arma processes with given parameters, this includes tools to convert between ARMA, MA and AR representation as well as acf, pacf, spectral density, impulse response function and similar sandbox. tsa. fftarma. similar to armaprocess but working in frequency domain tsatools. additional helper functions, to create arrays of lagged variables, construct regressors for trend, detrend and similar. filters. helper function for filtering time series Some additional functions that are also useful for time series analysis are in other parts of statsmodels, for example additional statistical tests. Some related functions are also available in matplotlib, nitime, and scikits. talkbox. Those functions are designed more for the use in signal processing where longer time series are available and work more often in the frequency domain. Descriptive Statistics and Tests stattools. acovf (x, unbiased, demean, fft)

Comments

Popular posts from this blog

Mf Global Forex

Indian Oceano Trading System Storia