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 preoccuparti, qui sono: strumenti di calcolo Analogamente, dataframe ha un metodo per calcolare COV covarianze a coppie tra la serie nella dataframe, escludendo anche i valori NAnull. Supponendo che i dati mancanti sono mancanti in modo casuale questo si traduce in una stima per la matrice di covarianza che è imparziale. Tuttavia, per molte applicazioni questa stima non può essere accettabile, perché la matrice di covarianza stimato non è garantito per essere positivo semi-definita. Ciò potrebbe portare a correlazioni stimate aventi valori assoluti che sono maggiori di uno, Andor una matrice di covarianza non invertibile. Vedere stima di matrici di covarianza per maggiori dettagli. DataFrame. cov supporta anche una parola minperiods opzionali che specifica il numero minimo richiesto di osservazioni per ciascuna coppia di colonne per avere un risultato valido. I pesi utilizzati nella finestra sono specificati dalla parola chiave wintype. L'elenco dei tipi riconosciuti sono: Boxcar triang blackman hamming Bartlett parzen Bohman blackmanharris Nuttall barthann kaiser (ha bisogno di beta) gaussiana (ha bisogno di std) generalgaussian (ha bisogno di potenza, larghezza) Slepian (larghezza esigenze). Notare che la finestra vagone equivale a dire (). Per alcune funzioni a finestre, devono essere specificati ulteriori parametri: Per. sum () con un wintype. non c'è normalizzazione fatto per i pesi per la finestra. Passando pesi personalizzati di 1, 1, 1 darà un risultato diverso da quello che passa pesi di 2, 2, 2. per esempio. Quando si passa un wintype invece di specificare esplicitamente i pesi, i pesi sono già normalizzati in modo che il peso più grande è 1. Al contrario, la natura del calcolo. mean () è tale che i pesi sono normalizzati rispetto all'altro. Pesi di 1, 1, 1 e 2, 2, 2 producono lo stesso risultato. Time-consapevoli di rotolamento Nuovo nella versione 0.19.0. Nuovo nella versione 0.19.0 sono la capacità di passare un offset (o convertibili) a un metodo. rolling () e farla produrre finestre di dimensione variabile in base alla finestra temporale passato. Per ogni punto di tempo, questo include tutti i valori precedenti che si verificano all'interno del delta time indicato. Questo può essere particolarmente utile per un indice di frequenza tempo non regolare. Questo è un indice di frequenza regolare. Utilizzando un parametro window intero funziona a rotolare lungo la frequenza finestra. Specifica di un offset permette una specificazione più intuitiva della frequenza di laminazione. Utilizzando un indice non regolare, ma ancora monotona, a rotazione con una finestra intero non impartisce alcun calcolo speciale. Usando il tempo-specifica genera finestre variabili per questo dati sparsi. Inoltre, ora permettiamo un optional sul parametro per specificare una colonna (piuttosto che il default dell'indice) in una dataframe. Time-consapevoli di rotolamento contro ricampionamento Utilizzando. rolling () con un indice basato sul tempo è molto simile a ricampionamento. Entrambi operano ed eseguire operazioni riduttive su oggetti panda tempo indicizzato. Quando si utilizza. rolling () con un offset. L'offset è un tempo-delta. Prendere una finestra all'indietro in time guardare, e aggregare tutti i valori in quella finestra (incluso il punto finale, ma non lo start-punto). Questo è il nuovo valore in quel punto nel risultato. Questi sono finestre variabili dimensioni in spazio-tempo per ciascun punto di ingresso. Si otterrà un risultato stesso di dimensioni come ingresso. Quando si utilizza. resample () con un offset. Costruire un nuovo indice che è la frequenza di offset. Per ciascun bin di frequenza, punti aggregati dall'ingresso all'interno di una finestra all'indietro in time guardando che rientrano in tale bin. Il risultato di questa aggregazione è l'uscita per tale punto di frequenza. Le finestre sono fissati dimensione nello spazio di frequenza. Il risultato avrà la forma di una frequenza regolare tra il minimo ed il massimo dell'oggetto input originale. Riassumere. rotolamento () è un'operazione finestra temporale basata, mentre. resample () è un'operazione finestra di frequenze basata. Centraggio Windows di default le etichette sono impostate per il bordo destro della finestra, ma una parola chiave centro è disponibile in modo che le etichette possono essere impostati al centro. Funzioni Finestra Binary COV () e corr () in grado di calcolare lo spostamento statistiche delle finestre su due serie o qualsiasi combinazione di DataFrameSeries o DataFrameDataFrame. Qui è il comportamento in ogni caso: due serie. calcolare la statistica per l'abbinamento. DataFrameSeries. calcolare le statistiche per ogni colonna del dataframe con la Serie passato, restituendo così una dataframe. DataFrameDataFrame. Per impostazione predefinita, calcolare la statistica per la corrispondenza nomi delle colonne, restituendo un dataframe. Se viene passato l'argomento pairwiseTrue parola chiave quindi calcola la statistica per ogni coppia di colonne, restituendo un pannello i cui elementi sono le date in questione (vedere la sezione successiva). Calcolo rotolamento covarianze a coppie e le correlazioni in analisi dei dati finanziari e di altri settori it8217s comune per calcolare covarianza e correlazione matrici per una collezione di serie storiche. Spesso si è anche interessato a trasferirsi finestra covarianza e correlazione matrici. Questo può essere fatto passando l'argomento chiave a coppie, che nel caso di ingressi dataframe produrrà un pannello i cui elementi sono le date in questione. Nel caso di un singolo argomento dataframe l'argomento a coppie può anche essere omesso: i valori mancanti vengono ignorati ed ogni voce è calcolata utilizzando le osservazioni complete a coppie. Si prega di consultare la sezione di covarianza per avvertimenti associati a questo metodo di calcolo covarianza e correlazione matrici. Oltre a non avere un parametro window, queste funzioni hanno le stesse interfacce come le loro controparti. rolling. Come in precedenza, i parametri sono tutti accettano sono: minperiods. soglia di punti dati non nulli da richiedere. Il valore predefinito è minimo necessario per il calcolo statistico. No NaN verrà emesso una volta minperiods punti dati non nulli sono stati visti. centro. booleano, se impostare le etichette al centro (di default è False) L'uscita del. rolling e metodi. expanding non restituiscono un NaN se ci sono almeno minperiods valori non nulli nella finestra corrente. Questo differisce da cumSum. cumprod. cummax. e cumino. che restituiscono NaN nell'output laddove viene rilevato un NaN nell'input. Una espansione finestra statistica sarà più stabile (e meno reattivo) rispetto al suo omologo finestra di laminazione come la dimensione della finestra aumentando diminuisce l'impatto relativo di un singolo punto di dati. A titolo di esempio, qui è l'uscita media () per il precedente set di dati di serie storiche: ponderata esponenzialmente di Windows Un insieme correlato di funzioni sono esponenzialmente versioni di alcune delle statistiche di cui sopra ponderato. Una interfaccia simile a. rolling e. expanding si accede attraverso il metodo. ewm per ricevere un oggetto EWM. Un certo numero di EW espansione vengono forniti metodi (in modo esponenziale ponderati): Slideshare utilizza i cookie per migliorare la funzionalità e le prestazioni, e per fornire voi con la pubblicità in questione. Se si continua la navigazione nel sito, l'utente accetta l'utilizzo dei cookie su questo sito. Vedi le Condizioni d'uso e sulla privacy. Slideshare utilizza i cookie per migliorare la funzionalità e le prestazioni, e per fornire voi con la pubblicità in questione. Se si continua la navigazione nel sito, l'utente accetta l'utilizzo dei cookie su questo sito. Vedi le Condizioni d'uso per i dettagli sulla privacy e. Vedi tuoi argomenti preferiti in app SlideShare Scarica l'applicazione SlideShare di Offerta ricordare anche offline Continuare a sito mobile Carica Accesso Registrazione Doppio tap per diminuire programmi di base di MATLAB Condividi questa SlideShare LinkedIn Corporation copiare 2017
No comments:
Post a Comment