Sløring for nybegynnere Introduksjon Dette er en kort veiledning om uskarphetsteknikker for nybegynnere. Da jeg lærte dette, var det svært lite tilgjengelig materiale som var nyttig. Det var ikke sant selvfølgelig - det var masser av materiale, men halvparten av det var altfor enkelt og den andre halvdelen begynte La T være en vektorfunksjon evaluert over det halvåpne intervallet. og var full av veldig skummel multi-line likninger med de store sigma symboler og ting. Denne artikkelen er ment å rette opp det. Jeg snakker om ulike typer uskarphet og effektene du kan bruke dem til, med kildekoden i Java. En ansvarsfraskrivelse Når det blir sagt uskarphet, er det alltid noen som sier Hei, Det er ikke en ekte bevegelsesskarphet, eller skriver sint bokstaver i grønn blekk som klager på at matematikken er tvilsom, eller at det er en mye raskere måte å gjøre dette ved hjelp av sponglerizerregistrene på HAL -9000. Ignorer disse menneskene. Dette er et stort emne, og denne artikkelen er bare for nybegynnere (som jeg stolt kan si jeg er en). Det som betyr noe, er at du får de resultatene du setter etter, og hvis resultatene du satser på krever tvilsom matematikk, så vær så snill. Hvis resultatene du prøver å se forferdelige mot meg, så er det bra, så lenge de ser bra ut til deg. En annen ansvarsfraskrivelse Det er kildekode i Java for ganske bra alt jeg snakker om her. Jeg gjør ingen påstander om at disse er optimalisert på noen måte - Jeg har valgt enkelhet over fart overalt, og du vil sannsynligvis kunne gjøre det meste av disse tingene gå raskere med litt innsats. Du kan bruke kildekoden for alt du vil, inkludert kommersielle formål, men det er ingen ansvar. Hvis ditt atomkraftverk eller missilsystem mislykkes på grunn av feil blur, er det ikke min feil. Hva er uskarpt Vi vet alle hva som er uskarpt, ikke vi Det er det som skjer når kameraet er ute av fokus eller hunden stjeler brillene dine. Hva som skjer er at det som skal sees som et skarpt punkt, blir smurt ut, vanligvis til en plateform. I bildevilkår betyr dette at hver piksel i kildebildet blir spredt over og blandet inn i omkringliggende piksler. En annen måte å se på dette er at hver piksel i destinasjonsbildet består av en blanding av omkringliggende piksler fra kildebildet. Operasjonen vi trenger for dette kalles convolution. Dette høres komplisert, men det er bare fordi matematikere liker å få ting til å lyde komplisert for å opprettholde den magiske luften og holde finansieringen rullende inn. Vel, jeg er på dem og jeg kan avsløre at konvolusjonen ikke er så komplisert (på mitt nivå uansett) . Måten det virker på, er dette: Vi tenker på å skyve et rektangulært antall tall over vårt bilde. Denne gruppen kalles konvolusjonskjernen. For hver piksel i bildet tar vi de tilsvarende tallene fra kjernen og pikslene de er over, multipliserer dem sammen og legger alle resultatene sammen for å lage den nye piksel. For eksempel, tenk vi ønsker å gjøre en veldig enkel uskarphet hvor vi bare gjennomsnittlig sammen hver piksel og dens åtte umiddelbare naboer. Kjernen vi trenger er: Legg merke til at alle disse legger opp til 1, noe som betyr at vårt resulterende bilde blir like lyst som originalen. Uten videre ado, kan vi sløre et bilde i Java. Alt det convolution-innholdet virker vanskelig å implementere, men heldigvis kommer Java med en innebygd og klar til bruk-operatør for å gjøre akkurat det. Jeg snakker ConvolveOp her. Heres koden: Fantastisk Et uklart bilde Det er ikke veldig uklart skjønt. La oss gjøre en veldig stor uskarphet som dette: Hmmmmmm. Vel, det er ikke så bra. Ikke bare tok det veldig lang tid, men resultatet er litt rart - alt ser bra ut, en slags firkant, og hva i verden har skjedd rundt kantene. Først kan kantene: ConvolveOp er en skummel namby-pamby-ting som er redd å falle utenfor kanten av bildet. Hvis kjerne overlapper kanten av bildet, gir den bare opp og bare etterlater pikselet uendret. Du kan endre dette ved å sende EDGEZEROFILL i stedet for EDGENOOP, men det er enda verre - pikslene rundt kanten blir bare satt til null og forsvinner effektivt. Hva skal vi gjøre Vel, vi kan kaste bildet ut rundt kantene før det blir uskarpt og beskjære resultatet, men det er bare å gi inn, og i tillegg ville vi ikke lære noe. I stedet vel skrive en skikkelig, fryktløs, no-nonsense operatør som ikke er redd for kanter. Velkall det ConvolveFilter å skille det fra ConvolveOp. Jeg skal ikke gjøre med informasjon om kilden i denne artikkelen - det er ikke nok tid eller plass, og vi har mye flere filtre å skrive enda, men du kan laste ned eller se kilden, og det skal være ganske selvforklarende. Nå er problemet med sperrighet: Årsaken til at alt ser firkantet ut er at det som ble gjort her, kalles en eskefarging - kjernen er formet som en firkant, som om det var et kamera med en firkantet blenderåpning. Forresten, ikke la noen fortelle deg at boksen uklarhet er ubrukelig - faktisk hvis du simulerer skyggen kastet av et kvadrat lys, er det akkurat det du vil. Uansett, vil de komme til nytte videre. En annen ting: Ikke bli forvirret - Jeg bruker begrepet eske uskarphet for å referere til formen på kjernen, ikke dens profil, som jeg skal ringe et eskefilter. Mer om dette senere. For å få en mer realistisk uskarphet, det vi burde ha gjort, er brukt en sirkelformet kjerne. Dette simulerer mye bedre hva et ekte kamera gjør. Det er mye bedre. Vel kom tilbake til dette senere, men først en avledning tilbake til boksen uskarphet. Weve løst kanten piksel problem, men vår uskarp går fortsatt veldig sakte, og ting kommer bare til å bli verre. Problemet er at antallet multiplikasjoner i konvolusjonen går opp som kvadratet i kjernen radius. Med en 100x100-kjernen skulle det bli 10000 multiplikasjoner og legger til per piksel (ca.). Hvordan kan vi komme rundt dette? Det viser seg at det er flere måter å gå om dette enn jeg har muligens tid til å skrive om, eller til og med plage å se på. En måte jeg vil nevne raskt før du feier det under teppet, er dette: Du kan gjøre en eske uskarphet ved å krympe bildet ditt, sløre det og skalere det opp igjen. Dette kan være bra for dine formål, og du bør ha det i tankene. Ett problem er at det ikke animerer veldig bra, men kan ikke være et problem for deg. La oss se på boksen uskarphet igjen: Det viser seg at det er et par veldig enkle måter å øke hastigheten på. For det første viser det sig at boksen uskarphet er separerbar. Dette betyr at vi kan gjøre 2D-uskarphet ved å gjøre to 1D-blurs, en gang i horisontal retning og en gang i vertikal retning. Dette er mye raskere enn å gjøre 2D-uskarphet fordi tiden som går, går opp i forhold til kjernestørrelsen, ikke som sin firkant. For det andre, Tenk på vinduet som glir over bildet. Når vi beveger den fra venstre mot høyre, kommer piksler inn i høyre kant og legges til totalt og samtidig gir piksler venstre kant og trekkes fra total. Alt vi trenger å gjøre er bare å legge til og trekke fra for å legge inn og utelate piksler ved hvert trinn i stedet for å legge sammen alle piksler i vinduet. Vi trenger bare å lagre et sett med kjørende totals som er bredden eller høyden til kjernen. Dette gir en enorm hastighetsforbedring på bekostning av å måtte skrive noen kode. Heldigvis har jeg skrevet koden for deg, så du vinner hele tiden. Vi trenger to pass, en gang for å uskarpe horisontalt og en gang vertikalt. Koden for disse er selvsagt ganske annerledes. Men vent Theres et triks vi kan gjøre som tillater oss bare å skrive koden en gang. Hvis vi skriver en uskarphet-funksjon som gjør det horisontale uskarphetet, men skriver utgangsbildet transponert, så kan vi bare kalle det to ganger. Første pass blurser horisontalt og transponerer, det andre passet gjør det samme, men som bildet er nå gjennomført, gjør det virkelig en vertikal uskarphet. Den andre transposisjonen gjør bildet riktig vei opp igjen og voila - en veldig rask boks uskarphet. Prøv det i denne appleten: Og heres kildekoden. Du har kanskje lagt merke til at vi bare har brukt en heltallradius så langt som gjør det enkelt å trene matriseindeksene for uskarpheten. Vi kan utvide teknikken til å gjøre uskarphet uskarphet (dvs. en ikke-integrert radius) bare ved lineær interpolering mellom arrayverdiene. Min kildekode gjør ikke dette, men det er enkelt å legge til. Gaussian Blur Nå er det på tide å ta opp hastigheten og firkantet utrykksspørsmål samtidig. For å kvitte seg med torget, se på uskarpheten, trenger vi en sirkulær formet kjerne. Dessverre fungerer det trikset vi brukte for bokseklær, men det er et smutthull: Hvis kjernen har riktig profil - Gauss-profilen - da kan vi gjøre 2D-uskarphet ved å utføre to 1D-blurs, akkurat som vi gjorde med boks uskarphet. Det er ikke så fort fordi skyvevinduet trick ikke fungerer, men det er fortsatt mye raskere enn å gjøre 2D-konvolusjonen. Profilen vi trenger er den kjente klokkeformede eller gaussiske kurven som du har hørt om: Her er noen kode for å lage en 1D Gaussisk kjernen for en gitt radius. Alt vi trenger å gjøre er å bruke dette to ganger, en gang horisontalt og en gang vertikalt. Som en bonus, har jeg pakket det opp i en GaussianFilter for å gjøre det enkelt å bruke. Det er derfor Gaussian-uskarpheten finnes i hver grafikkpakke - det er mye raskere enn andre typer uskarphet. Det eneste problemet er at det ikke er veldig realistisk når det gjelder å simulere kameralinser, men mer om det senere. Hvis du vil gjøre ting som å simulere skygger, så kan den gaussiske uskarpheten, eller kassens uskarphet, være bra. Det er et sted for alle disse effektene - bare fordi de ikke er realistiske, betyr det ikke at de ikke er nyttige. Gaussisk uskarphet er mye raskere, men det er ikke så nært som vår eskefarge vi gjorde tidligere. Hvis det bare var noen måte å kombinere de to. Jeg antar at du har giset nå at det kan være en, så jeg holder ikke spenningen lenger: Hvis du gjør mye av bokser, blir resultatet mer og mer som en Gauss-uskarphet. Faktisk kan du bevise det matematisk hvis du har et ekstra øyeblikk (men ikke fortell meg hvordan - jeg er ikke interessert). I praksis ser 3 til 5 boksene ut ganske bra. Ikke bare ta mitt ord for det: Skjermbildeappleten ovenfor har en glidebryter, slik at du kan prøve det selv. Alfa-kanaler En rask omledning her for å diskutere et problem som ofte kaster opp: Tenk deg at du vil uklare en form som er på gjennomsiktig bakgrunn. Du har et tomt bilde, og du tegner en form på den, og deretter slør bildet. Henger på - hvorfor ser uskarpheten ut for mørk Årsaken er at vi har uskarpt hver kanal, men hvor alfakanalen er null (de gjennomsiktige bitene), er de røde, grønne og blå kanalene null eller svarte. Når du gjør uskarpheten, blir sorten blandet med de ugjennomsiktige biter, og du får en mørk skygge. Løsningen er først og fremst at bildet alfa før det blir uskarpt og unpremultiply det etterpå. Selvfølgelig, hvis bildene dine allerede er forutbestemt, så er du klar. Bevegelsesskarphetstid for retningsendring. Så langt har vi bare snakket om uniform blurs, men det finnes andre typer. Bevegelsesskarphet er uskarphet du får når et objekt (eller kameraet) beveger seg under eksponeringen. Bildet blir uskarpt langs objektets tilsynelatende bane. Her skulle bare snakke om å simulere bevegelsesskarphet på et eksisterende stillbilde - å gjøre bevegelsesskarmen i animasjoner er et helt annet område. Var også bare å sløre hele bildet - ville ikke prøve å sløre et objekt i bildet. Den gode nyheten er at vi allerede har gjort enkle bevegelsesskarphet. Gå tilbake til boksen uskarpt applet over og sett den horisontale radiusen til, si 10, og den vertikale radiusen til null. Dette gir deg en fin horisontal bevegelsesskarphet. For noen formål kan dette være alt du trenger. En måte å lage en børstet metalltekstur på er for eksempel å ta et bilde som består av tilfeldig støy og bruke en bevegelsesskarphet. Hvis vi vil uskarpe i en annen retning enn horisontal eller vertikal, blir tingene mer kompliserte. En teknikk kan være å rotere bildet, uskarpe og deretter rotere tilbake. Hva gjør du her, er å gjøre det på den harde og sakte måten. Det vi trenger å gjøre er å løse over bildet, og for hver piksel legger du opp alle pikslene langs bevegelsesbanen. For en glatt bevegelsesskarphet betyr dette bare at du følger en rett linje fra pikselet, men du kan følge en wiggly-sti hvis du vil simulere kameraskakning med lang eksponering, sier. Spin og Zoom Blur Når vi har fått koden for bevegelsesskarphet på plass, er det et enkelt spørsmål å endre det for å gjøre zoom og spin blurs, eller til og med en kombinasjon av alle tre. Det er bare et spørsmål om å følge den rette veien for hver piksel. For radial blurs, følg bare en sti som går fra uskarphet. For en sperngryt, følg en tangentiell bane. Prøv det i denne appleten: Heres kildekoden for å gjøre disse tre typer bevegelsesskarphet: Faster Motion Blur Du har kanskje lagt merke til at det å gjøre bevegelsesskarmen er en ganske sakte virksomhet - alle de sines og cosines gjør det veldig sakte. Hvis ikke var så bekymret for kvalitet skjønt, kan vi få fart på dette. Alt vi trenger å gjøre er å legge sammen mange forvandlede versjoner av bildet på en smart måte. Den klare delen er at vi kan gjøre en 1-piksers bevegelsesskarphet ved å gjennomsnittsføre bildet og det samme bildet oversatt av en piksel. Vi kan gjøre en 2-piks-uskarphet ved å gjenta dette med 1-pikslede uskarpe bilder. Ved å gjenta dette kan vi gjøre en N-pixel uskarphet i log2 (N) operasjoner, noe som er mye bedre enn å gjøre det på hard og langsom måte. Zoom og spin blurs kan gjøres ved å skalere og rotere i stedet for å oversette. Et filter vil gjøre alle tre ved hjelp av en AffineTransform. Prøv det i denne appleten: Domain Shifting Theres enda en annen måte å gjøre disse bevegelsene uskarphet på. Husk at du kunne gjøre den lineære bevegelsesskarmen ved å rotere bildet, gjøre en horisontal eske uskarpe og rotere tilbake. Det samme gjelder for zoom og spin blurs, bortsett fra at du trenger noe mer komplisert enn rotasjon. Det du trenger er polar transformasjonen. Når du har forvandlet bildet ditt, er en horisontal eske uskarphet et snurre når du forvandler tilbake, og en vertikal eskefarging gir deg en zoomfarging. En detalj er at du trenger en spesiell horisontal eske uskarphet som bryter på kantene ellers får du en skarp vertikal linje i ditt uskarpe bilde hvor spinnvinkelen skal vikle rundt. Uklarhet ved Fourier Transform Gaussisk uskarphet er veldig bra når du vil ha den gaussiske uskarphetseffekten, men hva hvis du vil ha en skikkelig linsskarphet som simulerer en ekte kameraåpning. Se på film eller tv-program for en stund, spesielt noe skutt om natten med lys i bakgrunnen, og du vil se at ting som er ute av fokus danner diskformer, eller kanskje pentagoner. Det er også et fenomen som kalles blomstrende hvor lyse deler av bildet vasker ut bildet, blir enda lysere i forhold til resten. Disse figurene kalles Bokeh. Noen mennesker elsker det og noen hater det. Vi bryr oss ikke om folk elsker det eller hater det, vi vil bare gjenskape det. Du vil ikke få disse diskformene med Gaussisk sløring - det er bare for fuzzy rundt kantene. Hva du trenger å gjøre det, bruk en fin, skarpkantet konvolusjonskjerne i form av kameraåpningen. Problemet du kommer over her er at alle de triksene som skal gjøres med separable kjerner, iterated box blurs og lignende, vil ikke fungere her - det er ingen separable kjerner som vil gi deg en pentagon (vel, sannsynligvis - jeg er ikke matematiker) - var tilbake til Det gamle problemet med uskarphetens tid går opp som torget i uskarphetradiusen. Frykt ikke, vi kan slå de tunge matematiske våpenene på problemet. Jeg vet ikke hvordan de tunge våpenene fungerer, men jeg kan sikte mot dem. De tunge våpen er Fourier Transforms. Jeg vet ikke hvordan de jobber fordi jeg ikke lyttet på universitetsforelesningene mine, men det er et stort antall om emnet du finner på Internett, selv om det er praktisk talt ingenting praktisk (dvs. med kildekoden) på temaet for uskarphet. Med Fourier Transforms kan du gjøre en uskarphet som tar en stund upåvirket av uskarphetradiusen (i praksis er det ikke helt riktig å håndtere bildekanter). Dessverre betyr det at det for en liten radius er langsom, men du vinner virkelig med en stor radius. En måte å håndtere dette på er å bruke den enkle convolutionen for små radier, og bytte til Fourier Transforms når du når til crossover-punkt i tid, forutsatt at du har gjort forsøkene for å bestemme hvor det er. Men vær forsiktig, hvis du animerer en uskarphet, må du sørge for at du ikke får noen synlige gjenstander på det punktet du bytter algoritme - øyet er veldig godt å spotte dem. Av den grunn kan du foretrekke å holde fast med en algoritme for hele animasjonen. For stillbilder, kommer ingen til å legge merke til. Egentlig. Ser det virkelig annerledes ut. Sikkert, vi kan komme seg unna med en Gauss-uskarpe. Nå, heres et eksempel som vil hjelpe deg å gjøre tankene dine. Prinsippet bak å gjøre uskarphet er ikke for vanskelig, selv om det virker som magi. Hva vi gjør er å ta bildet og kjernen, og utfør Fourier-transformasjonen på dem begge. Vi multipliserer de to sammen og omvendte transformasjonen tilbake. Dette er akkurat det samme som å utføre den lange konvolusjonen ovenfor (bortsett fra avrundingsfeil). Du trenger egentlig ikke å vite hva en Fourier-transformasjon gjør for å implementere dette, men uansett, hva det gjør er å konvertere bildet til frekvensområdet - det resulterende bildet er en merkelig utseende av romlige frekvenser i bildet. Den omvendte, selvfølgelig, forvandler seg tilbake til verdensrommet. er, plass. Tenk på det som en grafisk equalizer for bilder. Du kan tenke på å sløre et bilde som å fjerne høyfrekvenser fra det, så det er hvordan Fourier-transformasjoner kommer inn i bildet. Implementering av dette er faktisk ganske grei, men det er mange ubehagelige detaljer å bekymre seg for. Først av alt trenger vi noen funksjoner for å gjøre transformasjonen og dens inverse. Disse finner du i klassen FFT. Dette er ikke på noen måte en superoptimalisert implementering - du kan finne mange av dem andre steder på Internett. Deretter må vi konvertere kjernen til et bilde i samme størrelse som bildet var uskarpt (jeg er sikker på at det finnes måter å unngå dette på, men jeg vet ikke nok matematikk - hvis bare Id hadde lyttet i disse forelesningene). Vi må også kaste ut vårt kildebilde av raden av uskarpheten, duplisere kanten piksler som det er vanskelig å få FFT til å håndtere kanter som dette. Nå fungerer FFT på komplekse tall, så vi må kopiere bildet og kjernen til float arrays. Vi kan gjøre et triks her - bildene våre har fire kanaler (alfa, rød, grønn og blå), så vi må gjøre fire transformer pluss en for kjernen, og gjør fem, men siden vi brukte komplekse tall kan vi gjøre to transformasjoner samtidig ved å sette en kanal i den reelle delen av gruppen og en kanal i den imaginære delen. Nå blir ting enkle, bare forvandle bildet og kjernen, komplekse multiplisere dem sammen og omvendt transformere, og vi har vårt bilde tilbake, men samvittet med kjernen. En siste liten detalj er at transformasjonsprosessen bytter over kvadranter av bildet, slik at vi må unwap. Bare en liten detalj gjenstår: FFT fungerer bare på bilder som er en kraft på 2 i hver retning. Det vi må gjøre er å legge to ganger uklarheten til bredden og høyden, finn den nest høyeste effekten på 2 og lag våre størrelser slik. For store bilder har dette et par problemer: En er som brukte mye minne. Husk at vi har våre bilder i float arrays, og vi trenger 6 av disse arrays, hver av dem er 4 ganger størrelsen på bildet når det er utvidet til en kraft på to. Din virtuelle Java-maskin kan godt klage på deg hvis du prøver dette på et stort bilde (jeg vet, jeg har prøvd). Det andre problemet er relatert: Ting går bare tregere med de store bildene på grunn av minneproblemer. Svaret er å dele bildet opp i fliser og uklare hver flis separat. Å velge en god flisestørrelse er et alternativforskningsproblem (dvs. jeg har ikke vært plaget til å eksperimentere mye), men er vanskelig - vi må overlappe flisene ved uklarheten, så hvis vi valgte en flisestørrelse på 256 med en sløret radius på 127 , vi må bare uklare 4 piksler med hver flis. Prøv det i denne appleten: Threshold Blurs Noe som ofte er ønsket, er en uskarphet som forvirrer deler av bildet som er svært liknende, men bevarer skarpe kanter. Dette er digital rynkekrem, og du kan se dette i en hvilken som helst filmplakat som alltid er skrevet ut - stjernens ansikter har alle de ekle flekkene utstrykt uten at bildet blir uklart. Ofte er dette så overdone at skuespillerne ser ut som voksverk eller datagenererte figurer. Måten vi gjør dette på er å gjøre en vanlig konvolusjon, men bare telle i omkringliggende piksler som ligner målpiksel. Nærmere bestemt har vi en terskel og inkluderer bare en piksel i konvolusjonen hvis den avviger fra sentrumspiksel med mindre enn terskelen. Dessverre, de korte kuttene vi tok over, vil ikke fungere her da vi trenger å inkludere et annet sett med omkringliggende piksler for hver målpiksel, så var tilbake til full convolution igjen. Nå, selv om dette er ekstremt tvilsomt, fungerer det egentlig ganske bra for å fortsatt gjøre de to 1D-omviklingene for en Gauss-uskarphet som er raskere enn å gjøre hele 2D-konvolusjonen, så det er det jeg har gjort her. Du er velkommen til å endre kilden for å gjøre det hele. Prøv det ut i denne appleten: Variable Blurs Så langt har vi bare snakket om uniform blurs - hvor uklarheten er den samme på hvert punkt. For noen formål er det fint å ha blurs som har en annen radius på hvert punkt i bildet. Et eksempel er å simulere dybdeskarphet: Du kan ta et bilde som er i fokus overalt, og bruk en variabel uskarphet for å gjøre delene ute av fokus. Virkelig dybdeskarphet er mer komplisert enn dette fordi et objekt som ligger bak et annet objekt, ikke bør motta noe uklarhet fra objektet foran, men godt ignorere det og legge det til fagfolkene. Nå vil våre fancy triks over arent hjelpe oss mye her da alt involverer forutregning av kjerner eller stoler på at uklarheten er den samme over bildet og ved første øyekast ser det ut til at vi ikke har noe annet valg enn å falle tilbake på full convolution på hver piksel, bare denne gangen, er det mye verre da kjernen kan ha endret seg fra forrige piksel. Men alt er ikke tapt. Husk at triks med boks uklare hvor vi nettopp lagt til i piksler når de kom inn i kjernen og trukket dem tilbake etter hvert som de forlot. Det virker som om dette ikke vil fungere i variabel radius sak fordi wed må beholde totals for hver mulig radius, men det er en modifikasjon vi kan gjøre til trikset som gjør at vi magisk trekker ut totalene for en hvilken som helst radius med bare en subtraksjon. Hva vi gjør er preprocess bildet og erstatt hver piksel med summen av alle pikslene til venstre. På den måten når vi vil finne summen av alle pikslene mellom to punkter i en scanline, trenger vi bare å trekke den første fra den andre. Dette gjør at vi kan gjøre en rask variabel uskarphet ved å bruke en modifisert versjon av boksen uskarphetskode ovenfor. Å håndtere kantene er litt mer komplisert, fordi det bare er å trekke totalen, fungerer ikke for piksler utenfor kanten, men dette er en mindre detalj. Vi trenger også litt mer lagringsplass fordi totalene vil gå over den maksimale verdien av en piksel - vel må du bruke en int per kanal i stedet for å lagre fire kanaler i ett int. Vel, OK, men dette er en Gaussisk (ish) uskarphet, det er ikke det. Hva med å gjøre det objektivet uklart ting med variabel radius Dessverre, du er uheldig her. Jeg sier ikke at det ikke er en super rask måte å gjøre dette på, men så langt jeg vet at du kommer til å gjøre den fulle konvolusjonen. Prøv det i denne appleten, noe som blurs mer når du beveger deg til høyre: Skarphet ved uklarhet Du kan bruke uskarphet til å skarpere et bilde, og sløre det med en teknikk som kalles uskarpe maskering. Det du gjør er å ta bildet og trekke en uskarpt versjon, slik at du kompenserer for tap av lysstyrke. Dette høres ut som magi, men det fungerer egentlig: sammenlign dette bildet med originalen. Prøv det i denne appleten: Hvis du trekker en uskarpt versjon av et bilde fra seg selv, skjer det, hva legger det til. Som noensinne trenger du ikke å gjette - jeg er her for å informere deg. Det du får er en slags glødende effekt som kan se ganske fin ut, eller ganske ost, avhengig av synspunktet ditt. Varierer mengden av uskarphet tilsatt varierer den glødende effekten. Du kan se denne effekten brukt mye på tv for drømmende utseende overganger. Prøv det i denne appleten: Å lage skygger Skygge er bare et spørsmål om å skape et bilde som ser ut som silhuetten til skyggeobjektet, slør det, muligens forvrenger eller beveger det, og limer opp det opprinnelige bildet over toppen. Siden dette er en veldig vanlig ting å ønske å gjøre, bør det være et filter for å gjøre det, og her er det. Dette er faktisk en veldig enkel implementering - det blur bare skyggen og trekker det opprinnelige bildet over toppen. I praksis er det bedre å ikke bry seg om å pusse pikslene som er helt skjult av objektet. Casting Stråler Vi kan gjøre det samme trikset for at lysstråler ser ut til å komme ut av et objekt, bare denne gangen gjør skyggen farge hvit og bruker en zoomskarmen i stedet for det vanlige sløret, og deretter legger du resultatet øverst på originalen. Strålene ser ofte bedre ut hvis du bare støtter dem fra lyse deler av bildet, så filteret har en terskel som du kan angi for å begrense stråler til lyse områder. Dette er en god effekt å animere: gjør senteret av strålene bevege seg over bildet, og du får effekten av en bevegelig lyskilde bak bildet. Konklusjon Vel, det er det, og jeg har ikke engang nevnt andre uskarphetiske metoder som IIR-filtre, rekursive filtre og alle de andre ubehagelige tingene. Jeg håper du kommer unna med noe nyttig med dette, selv om det bare er et brennende ønske om å kjøpe litt grønn blekk og skrive meg et brev. Til slutt har du kanskje lagt merke til at kilden ovenfor er avhengig av noen andre klasser. Ikke bekymre deg, her er de: Beregningsverktøy Analogt, DataFrame har en metode for å beregne parvise covariances blant serien i DataFrame, også unntatt NAnull-verdier. Forutsatt at manglende data mangler tilfeldig, resulterer dette i et estimat for kovariansmatrisen som er objektiv. For mange anvendelser kan dette estimatet imidlertid ikke være akseptabelt fordi den estimerte kovariansmatrisen ikke er garantert å være positiv semi-bestemt. Dette kan føre til estimerte korrelasjoner med absolutte verdier som er større enn en, og eller en ikke-inverterbar kovariansmatrise. Se Estimering av kovariansmatriser for flere detaljer. DataFrame. cov støtter også et valgfritt søkeord for minperioder som angir ønsket minimum antall observasjoner for hvert kolonnepar for å få et gyldig resultat. Vektene som brukes i vinduet er spesifisert av wintype søkeordet. Listen over anerkjente typer er: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (trenger beta) gaussian (needs std) generalgaussian (trenger kraft, bredde) slepian (trenger bredde). Merk at bokservinduet er lik gjennomsnittet (). For noen vindufunksjoner må ytterligere parametere angis: For. sum () med en wintype. Det er ingen normalisering gjort til vekter for vinduet. Ved å sende tilpassede vekter på 1, 1, 1 vil det gi et annet resultat enn passerende vekter på 2, 2, 2. for eksempel. Når du passerer en wintype i stedet for å spesifisere tyngden, er vektene allerede normalisert slik at den største vekten er 1. I motsetning er naturen av. mean () beregningen slik at vektene normaliseres i forhold til hverandre. Vekter på 1, 1, 1 og 2, 2, 2 gir det samme resultatet. Time-aware Rolling Ny i versjon 0.19.0. Ny i versjon 0.19.0 er muligheten til å overføre en forskyvning (eller konvertibel) til en. rolling () - metode og få den til å produsere variabelstørrelsesvinduer basert på passet tidsvindu. For hvert tidspunktspunkt inkluderer dette alle tidligere verdier som forekommer innen det angitte tidspunktet delta. Dette kan være spesielt nyttig for en ikke-vanlig tidsfrekvensindeks. Dette er en vanlig frekvensindeks. Ved å bruke et heltallsparameter virker parameteren å rulle langs vinduets frekvens. Angi en forskyvning gir en mer intuitiv spesifikasjon av rullfrekvensen. Ved å bruke en ikke-vanlig, men likevel monotonisk indeks, gir det ikke noen spesiell beregning å rulle med et heltallvindu. Ved bruk av tidsspesifikasjonen genereres variabelvinduer for denne sparsomme data. Videre tillater vi nå en valgfri parameter for å spesifisere en kolonne (i stedet for standardindeksen) i en DataFrame. Time-aware Rolling vs Resampling Using. rolling () med en tidsbasert indeks er ganske lik resampling. De opererer og utfører reduktiv operasjon på tidindekserte pandasobjekter. Når du bruker. rolling () med en forskyvning. Forskjellen er et tids-delta. Ta et bakover-i-tid-ser vindu, og aggregat alle verdiene i vinduet (inkludert sluttpunktet, men ikke startpunktet). Dette er den nye verdien på det tidspunktet i resultatet. Dette er vinduer med variabel størrelse i tidsrom for hvert punkt på inngangen. Du får samme resultat som inngangen. Når du bruker. resample () med en forskyvning. Konstruer en ny indeks som er frekvensen av forskyvningen. For hver frekvensfylle peker aggregatet fra inngangen i et bakover-i-tid-ser vindu som faller i boksen. Resultatet av denne aggregeringen er utgangen for det aktuelle frekvenspunktet. Vinduene er fast størrelse i frekvensområdet. Resultatet ditt vil ha formen på en vanlig frekvens mellom min og maksimum for det opprinnelige inngangsobjektet. Å oppsummere. rullende () er en tidsbasert vindusoperasjon, mens. resample () er en frekvensbasert vindusoperasjon. Sentering av Windows Som standard er etikettene satt til høyre kant av vinduet, men et senter søkeord er tilgjengelig slik at etikettene kan settes i sentrum. Binære vindufunksjoner cov () og corr () kan beregne flyttbar vinduestatistikk om to serier eller en kombinasjon av DataFrameSeries eller DataFrameDataFrame. Her er oppførselen i hvert tilfelle: to serier. beregne statistikken for paringen. DataFrameSeries. beregne statistikken for hver kolonne i DataFrame med den bestått serien, og returnerer dermed en DataFrame. DataFrameDataFrame. beregner som standard statistikken for å tilpasse kolonnenavn, og returnerer en DataFrame. Hvis søkeordet argumentet pairwiseTrue er bestått beregner du statistikken for hvert par kolonner, og returnerer et panel hvis elementer er de aktuelle datoene (se neste avsnitt). Computing rolling parvis covariances og korrelasjoner I økonomisk data analyse og andre felt it8217s vanlig å beregne kovarians og korrelasjon matriser for en samling av tidsserier. Ofte er man også interessert i flyttevindukovarians og korrelasjonsmatriser. Dette kan gjøres ved å passere argumentet for parvis søkeord, som i tilfelle av DataFrame-innganger vil gi et panel hvis gjenstander er datoene i spørsmålet. In the case of a single DataFrame argument the pairwise argument can even be omitted: Missing values are ignored and each entry is computed using the pairwise complete observations. Please see the covariance section for caveats associated with this method of calculating covariance and correlation matrices. Aside from not having a window parameter, these functions have the same interfaces as their. rolling counterparts. Like above, the parameters they all accept are: minperiods. threshold of non-null data points to require. Defaults to minimum needed to compute statistic. No NaNs will be output once minperiods non-null data points have been seen. center. boolean, whether to set the labels at the center (default is False) The output of the. rolling and. expanding methods do not return a NaN if there are at least minperiods non-null values in the current window. This differs from cumsum. cumprod. cummax. and cummin. which return NaN in the output wherever a NaN is encountered in the input. An expanding window statistic will be more stable (and less responsive) than its rolling window counterpart as the increasing window size decreases the relative impact of an individual data point. As an example, here is the mean() output for the previous time series dataset: Exponentially Weighted Windows A related set of functions are exponentially weighted versions of several of the above statistics. A similar interface to. rolling and. expanding is accessed thru the. ewm method to receive an EWM object. A number of expanding EW (exponentially weighted) methods are provided:Slideshare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy. Slideshare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details. Explore all your favorite topics in the SlideShare app Get the SlideShare app to Save for Later even offline Continue to the mobile site Upload Login Signup Double tap to zoom out Basic matlab programs Share this SlideShare LinkedIn Corporation copy 2017
No comments:
Post a Comment