Monday 30 October 2017

Moving Average Gauß Fenster


Unschärfe für Anfänger Einleitung Dies ist ein kurzes Tutorial zu verwischenden Techniken für Anfänger. Als ich dieses Zeug lernte, gab es sehr wenig Material, das nützlich war. Das ist natürlich nicht wahr - es gab Massen von Material, aber die Hälfte davon war viel zu einfach und die andere Hälfte begann Let T eine Vektorfunktion, die über das halboffene Intervall ausgewertet wurde. Und war voll von sehr beängstigenden mehrzeiligen Gleichungen mit diesen großen Sigma-Symbolen und Sachen. Dieser Artikel soll das beheben. Ich rede über verschiedene Arten von Unschärfe und die Effekte, die du sie benutzen kannst, mit Quellcode in Java. Ein Haftungsausschluss Wenn immer verwischt wird, gibt es immer jemand, der sagt, Hey Thats nicht eine echte Bewegungsunschärfe, oder schreibt wütend Buchstaben in grüne Tinte beschwert, dass die Mathematik ist zweifelhaft oder dass theres eine viel schnellere Weg, dies zu tun mit dem Sponglerizer Register auf der HAL -9000 Ignoriere diese Leute. Dies ist ein großes Thema, und dieser Artikel ist nur für Anfänger (von denen ich stolz sagen kann, dass ich einer bin). Was zählt ist, bekommst du die Ergebnisse, die du anstrebst, und wenn die Ergebnisse, die du anstrebst, zweifelhafte Mathematik erfordern, dann sei es so. Wenn die Ergebnisse, die Sie anstreben, für mich schrecklich aussehen, dann ist das gut, solange sie dir gut aussehen. Ein weiterer Haftungsausschluss Theres Quellcode in Java für ziemlich gut alles, was ich hier rede. Ich behaupte nicht, dass diese in irgendeiner Weise optimiert sind - Ive entschied sich für die Einfachheit über Geschwindigkeit überall und youll wahrscheinlich in der Lage sein, die meisten dieser Dingen schneller mit ein bisschen Aufwand zu machen. Sie können den Quellcode für alles, was Sie wollen, einschließlich kommerzieller Zwecke, aber theres keine Haftung verwenden. Wenn Ihr Atomkraftwerk oder Raketensystem wegen einer unsachgemäßen Unschärfe ausfällt, ist es nicht meine Schuld. Was ist verwischt Wir alle wissen, was Unschärfe ist, nicht wir ist das Ding, das passiert, wenn deine Kamera unscharf ist oder der Hund deine Brille stiehlt. Was passiert ist, dass das, was als ein scharfer Punkt gesehen werden soll, verschmiert wird, in der Regel in eine Scheibenform. In Bildausdrücken bedeutet dies, dass jedes Pixel im Quellbild verteilt und in umgebende Pixel gemischt wird. Eine andere Möglichkeit, dies zu betrachten, ist, dass jedes Pixel im Zielbild aus einer Mischung von umgebenden Pixeln aus dem Quellbild besteht. Die Operation, die wir dafür benötigen, heißt Faltung. Das klingt kompliziert, aber das ist nur, weil Mathematiker gerne die Dinge klingen kompliziert, um diese Luft der Magie zu halten und halten die Finanzierung rollen in. Nun, Im auf sie und ich kann zeigen, dass Faltung ist nicht so kompliziert (auf meinem Niveau sowieso) . Die Art und Weise, wie es funktioniert, ist: Wir stellen uns vor, eine rechteckige Anzahl von Zahlen über unser Bild zu schieben. Dieses Array heißt Faltungskernel. Für jedes Pixel im Bild nehmen wir die entsprechenden Zahlen aus dem Kernel und die Pixel, die sie vorbei sind, multiplizieren sie zusammen und addieren alle Ergebnisse zusammen, um das neue Pixel zu machen. Zum Beispiel, stellen wir uns vor, wir wollen eine wirklich einfache Unschärfe machen, wo wir nur durchschnittlich zusammen jedes Pixel und seine acht unmittelbaren Nachbarn. Der Kernel, den wir brauchen, ist: Beachten Sie, dass diese alle zu 1 addieren, was bedeutet, dass unser resultierendes Bild genauso hell ist wie das Original. Ohne weiteres kann man ein Bild in Java verschwimmen lassen. Alles, was Faltungs-Sachen klingt schwierig zu implementieren, aber zum Glück Java kommt mit einem eingebauten und ready-to-use-Betreiber genau das zu tun. Ich spreche hier ConvolveOp. Heres der Code: Fantastisch Ein verschwommenes Bild Es ist nicht sehr verschwommen aber. Lets do eine wirklich große Unschärfe wie folgt: Hmmmmmm. Nun, das ist nicht so gut. Nicht nur hat es eine sehr lange Zeit gedauert, aber das Ergebnis ist etwas merkwürdig - alles sieht gut aus, quadratisch, und was auf der Erde ist um die Ränder passiert. Erst die Kanten: ConvolveOp ist ein schüchternes Namby-Pamby-Ding, das Angst hat Vom Rand des Bildes abfallen. Wenn der Kernel den Rand des Bildes überlappen würde, gibt es einfach auf und lässt das Pixel unverändert. Sie können dies ändern, indem Sie EDGEZEROFILL statt EDGENOOP, aber das ist noch schlimmer - die Pixel um den Rand nur auf Null gesetzt und effektiv verschwinden. Was sollen wir gut machen, wir könnten das Bild um die Ränder herumstoßen, bevor wir uns entschärfen und das Ergebnis zuschneiden, aber das gibt nur ein, und außerdem würden wir nichts lernen. Stattdessen schreiben Sie einen richtigen, furchtlosen, No-Nonsense-Operator, der keine Angst vor Kanten hat. Nun nennen es ConvolveFilter, um es von ConvolveOp zu unterscheiden. Ich werde nicht in Details der Quelle in diesem Artikel zu tun - theres nicht genug Zeit oder Raum und wir haben noch viel mehr Filter zu schreiben, aber du kannst die Quelle herunterladen oder ansehen und es sollte ziemlich selbsterklärend sein. Jetzt ist das Rechtwinkligkeitsproblem: Der Grund, warum alles quadratisch ist, ist, weil das, was hier getan wurde, eine Kasten-Unschärfe genannt wird - unser Kern ist wie ein Quadrat geformt, als ob sie eine Kamera benutzen würden, die eine quadratische Blende hat. Übrigens, lassen Sie niemand sagen, dass Box-Unschärfen nutzlos sind - in der Tat, wenn youre simulieren den Schatten von einem quadratischen Licht geworfen, ist genau das, was Sie wollen. Jedenfalls kommen sie auch weiter. Eine andere Sache: Dont get verwirrt - Im mit dem Begriff Box Blur auf die Form des Kernels beziehen, nicht sein Profil, die ich gehe, um einen Box-Filter aufrufen. Mehr dazu später Um eine realistischere Unschärfe zu bekommen, was wir tun sollten, wird ein kreisförmiger Kern verwendet. Das simuliert viel besser was eine echte kamera macht Das ist viel besser. Kommen Sie später wieder darauf, aber zuerst eine Ablenkung zurück zu der Box verschwimmen. Weve löste das Rand-Pixel-Problem, aber unsere Unschärfe geht immer noch langsam, und die Dinge werden nur noch schlimmer werden. Das Problem ist, dass die Anzahl der Multiplikationen in der Faltung als das Quadrat des Kernelradius steigt. Mit einem 100x100 Kernel würden 10000 multipliziert werden und fügt pro Pixel (ca.) hinzu. Wie können wir das umgehen. Es stellt sich heraus, dass es mehr Möglichkeiten gibt, darüber zu gehen, als ich vielleicht Zeit habe, darüber zu schreiben, oder sogar die Mühe zu sehen. Ein Weg, den ich schnell erwähnen werde, bevor ich ihn unter den Teppich gekehrt habe, ist das: Du kannst eine Schachtel verschwimmen lassen, indem du dein Bild herunterschreckst, es verwischt und es wieder skaliere. Dies kann für Ihre Zwecke gut sein, und Sie sollten es im Auge behalten. Ein Problem ist, dass es nicht sehr gut animiert, aber vielleicht nicht ein Anliegen für Sie. Lasst uns die Kiste wieder verschwimmen lassen: Es stellt sich heraus, dass theres ein paar wirklich einfache Möglichkeiten, um dies zu beschleunigen. Erstens stellt sich heraus, dass die Box-Unschärfe trennbar ist. Dies bedeutet, dass wir eine 2D-Unschärfe machen können, indem wir zwei 1D-Unschärfen machen, einmal in der horizontalen Richtung und einmal in der vertikalen Richtung. Das ist viel schneller als die 2D-Unschärfe zu machen, weil die Zeit im Verhältnis zur Kernelgröße steigt, nicht als Platz. Zweitens, denke an das Fenster, das über das Bild gleitet. Wenn wir es von links nach rechts verschieben, kommen die Pixel am rechten Rand an und werden zur Summe addiert und gleichzeitig werden die Pixel die linke Kante verlassen und von der Summe subtrahiert. Alles, was wir tun müssen, ist einfach das Hinzufügen und Subtrahieren für die Eingabe und Verlassen von Pixeln bei jedem Schritt statt zusammenzufügen alle Pixel im Fenster. Wir müssen nur einen Satz von laufenden Summen speichern, die die Breite oder Höhe des Kernels sind. Dies gibt eine massive Geschwindigkeitsverbesserung zu den Kosten, um etwas Code zu schreiben. Zum Glück hat Ive den Code für dich geschrieben, also gewinnst du rundum. Wir brauchen zwei Pässe, um einmal horizontal und einmal vertikal zu verwischen. Der Code für diese ist natürlich ganz anders. Aber warten Sie Theres ein Trick, den wir tun können, was uns erlaubt, den Code einmal zu schreiben. Wenn wir eine unscharfe Funktion schreiben, die die horizontale Unschärfe macht, sondern ihr Ausgabedatum umsetzt, dann können wir es einfach zweimal anrufen. Der erste Durchlauf verschwindet horizontal und transponiert, der zweite Durchlauf tut dasselbe, aber wie das Bild jetzt umgesetzt wird, macht es wirklich eine vertikale Unschärfe. Die zweite Transposition macht das Bild wieder richtig und voila - eine sehr schnelle Box-Unschärfe. Probieren Sie es in diesem Applet aus: Und heres den Quellcode. Sie haben vielleicht bemerkt, dass wir bisher nur einen ganzzahligen Radius benutzt haben, der es einfach macht, die Array-Indizes für die Unschärfe zu erarbeiten. Wir können die Technik erweitern, um eine Sub-Pixel-Unschärfe (d. h. einen Nicht-Integral-Radius) einfach durch lineare Interpolation zwischen den Array-Werten durchzuführen. Mein Quellcode tut dies nicht, aber es ist einfach, hinzuzufügen. Gaussian Blur Jetzt ist es an der Zeit, die Geschwindigkeit und quadratisch aussehende Unschärfe Probleme gleichzeitig zu adressieren. Um den quadratischen Blick auf die Unschärfe zu werfen, brauchen wir einen kreisförmigen Kernel. Leider ist der Trick, den wir für Box-Unschärfen benutzten, nicht mit einem Kreis arbeiten, sondern theres ein Lücke: Wenn der Kernel das richtige Profil hat - das Gaußsche Profil - dann können wir eine 2D-Unschärfe machen, indem wir zwei 1D-Unschärfen durchführen, genau wie wir es mit dem gemacht haben Box Unschärfe. Es ist nicht so schnell, weil der Schiebefenster Trick nicht funktioniert, aber es ist noch viel schneller als die 2D-Faltung zu tun. Das Profil, das wir brauchen, ist die vertraute glockenförmige oder Gaußsche Kurve, die du gehört hast: Heres ein Code, um einen 1D Gaußschen Kern für einen gegebenen Radius zu erzeugen. Alles, was wir tun müssen, ist, dies zweimal, einmal waagerecht und einmal vertikal anzuwenden. Als Bonus, Ive wickelte es in einem GaussianFilter, um es einfach zu bedienen. Dies ist der Grund, warum die Gaußsche Unschärfe in jedem Grafikpaket gefunden wird - viel schneller als andere Arten von Unschärfe. Das einzige Problem ist, dass es nicht sehr realistisch ist, wenn es darum geht, Kameraobjektive zu simulieren, aber mehr dazu später. Wenn du Dinge mögen möchtest, die Schatten simulieren, dann kann die Gaußsche Unschärfe oder sogar die Kastenunschärfe ganz gut sein. Theres ein Platz für all diese Effekte - nur weil sie arent realistisch bedeutet nicht, dass sie nicht nützlich sind. Die Gaußsche Unschärfe ist viel schneller, aber nirgendwo so nah wie die Kasten, die wir früher gemacht haben. Wenn es nur eine Möglichkeit gibt, die beiden zu kombinieren. Ich stelle mir vor, dass Sie jetzt erraten haben, dass es vielleicht einen geben würde, also krank nicht länger die Spannung? Wenn Sie viel Kasten verwischen, sieht das Ergebnis mehr und mehr wie eine Gaußsche Unschärfe. In der Tat können Sie es mathematisch beweisen, wenn Sie einen freien Moment (aber nicht sagen, wie - Im nicht interessiert). In der Praxis sehen 3 bis 5 Kasten-Unschärfen ziemlich gut aus. Nehmen Sie nicht einfach mein Wort dafür: Das Box Blur Applet oben hat einen Iterations Slider, so dass Sie es selbst ausprobieren können. Alpha-Kanäle Eine schnelle Umleitung hier, um ein Problem zu besprechen, das oft auftaucht: Stellen Sie sich vor, Sie wollen eine Form verwischen, die auf einem transparenten Hintergrund ist. Sie haben ein leeres Bild, und Sie zeichnen eine Form darauf, dann verschwimmen das Bild. Hang an - warum schlägt das verschwommene Bit zu dunkel Der Grund dafür ist, dass wir jeden Kanal getrennt verschwimmen lassen, aber wo der Alphakanal Null ist (die transparenten Bits), sind die roten, grünen und blauen Kanäle null oder schwarz. Wenn du die Unschärfe machst, wird der Schwarze mit den undurchsichtigen Bits gemischt und du bekommst einen dunklen Schatten. Die Lösung besteht darin, das Bild alpha vorzuzerkleinern, bevor es nachher verschwimmt und unpremultiply ist. Natürlich, wenn deine Bilder schon vorgemischt sind, bist du alles eingestellt. Motion Blur Zeit für einen Richtungswechsel. Bisher haben wir nur über Uniform verwischt, aber es gibt andere Typen. Bewegungsunschärfe ist die Unschärfe, die du bekommst, wenn sich ein Objekt (oder die Kamera) während der Belichtung bewegt. Das Bild verschwindet auf dem scheinbaren Weg des Objekts. Hier würde ich nur über die Simulation von Bewegungsunschärfe auf einem vorhandenen Standbild sprechen - Bewegungsunschärfe in Animationen ist ein ganz anderer Bereich. Wurden auch nur das ganze Bild verwischen - würden wir nicht versuchen, ein Objekt im Bild zu verwischen. Die gute Nachricht ist, dass wir schon eine einfache Bewegungsunschärfe gemacht haben. Gehe zurück zum Kasten-Unschärfe-Applet oben und setze den horizontalen Radius auf, sagen wir 10 und den vertikalen Radius auf Null. Das gibt dir eine schöne horizontale Bewegungsunschärfe. Für irgendwelche Zwecke kann das alles sein, was du brauchst. Zum Beispiel ist eine Möglichkeit, eine gebürstete Metallbeschaffenheit zu erzeugen, ein Bild aus zufälligem Rauschen zu machen und eine Bewegungsunschärfe anzuwenden. Wenn wir in eine andere Richtung als horizontal oder vertikal verschwimmen wollen, dann werden die Dinge komplizierter. Eine Technik könnte sein, um das Bild zu drehen, verschwimmen und dann zurückdrehen. Was gut hier tun, ist es, den harten und langsamen Weg zu machen. Was wir tun müssen, ist über das Bild zu schlagen, und für jedes Pixel addiere man alle Pixel entlang des Bewegungspfades. Für eine geradlinige Bewegungsunschärfe bedeutet das nur eine gerade Linie aus dem Pixel, aber du könntest einem wackeligen Pfad folgen, wenn du Langzeit-Kamera-Shake simulieren wolltest. Spin und Zoom Blur Sobald weve bekam den Code für Bewegungsunschärfe an Ort und Stelle, es ist eine einfache Angelegenheit, um es zu ändern, um Zoom und Spin-Unschärfen zu machen, oder sogar eine Kombination von allen drei. Es ist nur eine Frage der folgenden Weg für jeden Pixel. Für radiale Unschärfen, folgen Sie einfach einem Weg von der Unschärfe Zentrum. Für eine Spin-Unschärfe, folgen Sie einem tangentialen Weg. Versuchen Sie es in diesem Applet: Heres der Quellcode für die Durchführung dieser drei Arten von Bewegungsunschärfe: Schneller Motion Blur Sie haben vielleicht bemerkt, dass die Bewegungsunschärfe ist ein ziemlich langsames Geschäft - all jene Sines und Kosinus wirklich langsam Sachen unten. Wurden nicht so besorgt um Qualität aber können wir das beschleunigen. Alles, was wir tun müssen, ist, eine Menge von transformierten Versionen des Bildes in einer klugen Weise zusammenzufassen. Der schlaue Teil ist, dass wir eine 1-Pixel-Bewegungsunschärfe durch Mittelung des Bildes und das gleiche Bild durch ein Pixel übersetzt werden können. Wir können eine 2-Pixel-Unschärfe machen, indem wir dies mit den 1-Pixel-unscharfen Bildern wiederholen. Wenn wir dies wiederholen, können wir eine N-Pixel-Unschärfe in log2 (N) Operationen durchführen, was viel besser ist als es die harte und langsame Weise zu tun. Zoom - und Spin-Unschärfen können durch Skalierung und Rotation statt übersetzen durchgeführt werden. Ein Filter wird alle drei mit einem AffineTransform machen. Probieren Sie es in diesem Applet aus: Domain Shifting Theres noch einen anderen Weg, um diese Bewegungsunschärfe zu machen: Denken Sie daran, dass Sie gesagt haben, dass Sie die lineare Bewegungsunschärfe durch Drehen des Bildes machen können, indem Sie eine horizontale Box verschwimmen und sich zurückdrehen Nun, das gleiche gilt für die Zoom und Spin Unschärfen, außer Sie brauchen etwas komplizierter als Rotation. Was Sie brauchen, ist die Polar-Transformation. Sobald Sie Ihr Bild verwandelt haben, ist eine horizontale Box-Unschärfe ein Spin, wenn Sie sich umwandeln, und eine vertikale Box-Unschärfe gibt Ihnen eine Zoom-Unschärfe. Ein Detail ist, dass Sie eine spezielle horizontale Kasten-Unschärfe benötigen, die an den Kanten wickelt, sonst youll erhalten eine scharfe vertikale Linie in Ihrem unscharfen Bild, in dem der Drehwinkel umwickeln sollte. Unschärfe durch Fourier-Transformation Die Gaußsche Unschärfe ist sehr gut, wenn du diesen Gaußschen Unschärfe-Effekt willst, aber was ist, wenn du eine richtige Objektiv-Unschärfe wünschst, die eine echte Kamera-Blende simuliert. Schau jeden Film oder TV-Programm für eine Weile an, besonders etwas, das nachts mit Lichter erschossen wird Im Hintergrund, und youll sehen, dass Dinge, die unscharf sind, bilden Scheibenformen, oder vielleicht Fünfecke. Theres auch ein Phänomen namens Blühen, wo helle Teile des Bildes waschen das Bild, immer noch heller im Vergleich zum Rest. Diese Formen heißen Bokeh. Manche Leute lieben es und manche Leute hassen es. Wir interessieren uns nicht, ob die Leute es lieben oder hassen, wir wollen es nur noch reproduzieren. Sie bekommen nicht diese Scheibenformen mit Gaußscher Unschärfe - es ist einfach zu unscharf um die Ränder. Was Sie brauchen, um es zu tun, verwenden Sie einen schönen scharfkantigen Faltungskernel in der Form Ihrer Kamera Blende. Das Problem, das du hierher kommst, ist, dass all diese Tricks mit trennbaren Kerneln zu tun haben, iterierte Box-Unschärfen und dergleichen werden hier nicht arbeiten - es gibt keine trennbaren Kerne, die dir ein Fünfeck geben werden (gut, vermutlich - Im kein Mathematiker) Das alte Problem der Unschärfe, die als das Quadrat des Unschärfenradius aufsteigt. Fürchte dich nicht, wir können die schweren mathematischen Pistolen auf das Problem stellen. Ich weiß nicht, wie die schweren Waffen arbeiten, aber ich kann sie zielen. Die schweren Kanonen sind Fourier-Transformationen. Ich weiß nicht, wie sie arbeiten, weil ich nicht in meinen Universitätsvorträgen zuhörte, aber theres eine beträchtliche Menge auf dem Thema, das Sie im Internet finden können, obwohl praktisch nichts praktisches (d. h. mit Quellcode) zum Thema Unschärfe. Mit Fourier-Transformationen kannst du eine Unschärfe machen, die eine Zeit unberührt von dem Unschärfenradius einnimmt (in der Praxis, der Umgang mit den Bildkanten bedeutet, dass dies nicht ganz richtig ist). Leider bedeutet dies, dass für einen kleinen Radius, seine langsam, aber Sie wirklich gewinnen mit einem großen Radius. Ein Weg, um damit umzugehen ist, die einfache Faltung für kleine Radien zu verwenden, und wechseln Sie zu Fourier Transforms, wenn Sie zum Crossover-Punkt in der Zeit zu erreichen, vorausgesetzt, Sie haben die Experimente durchgeführt, um festzustellen, wo das ist. Aber seien Sie vorsichtig, wenn Sie eine Unschärfe animieren, müssen Sie sicherstellen, dass Sie keine sichtbaren Artefakte an dem Punkt bekommen, an dem Sie den Algorithmus wechseln - das Auge ist wirklich gut darin, diese zu entdecken. Aus diesem Grund können Sie es vorziehen, mit einem Algorithmus für die ganze Animation zu bleiben. Für immer noch Bilder wird sich niemand bemerken. Ja wirklich. Ist es wirklich anders aussieht Sicherlich können wir mit einer Gaußschen Unschärfe weggehen. Nun, heres ein Beispiel, das dir helfen wird, dich zu entschuldigen. Das Prinzip hinter der Unschärfe ist nicht zu hart, obwohl es wie Magie scheint. Was wir tun, ist das Bild und den Kernel, und führen Sie die Fourier-Transformation auf sie beide. Wir vervielfachen dann die beiden zusammen und invers verwandeln sich zurück. Dies ist genau das gleiche wie die Durchführung der langen Faltung oben (abgesehen von Rundungsfehlern). Sie müssen eigentlich nicht wissen, was eine Fourier-Transformation macht, um dies zu implementieren, aber trotzdem, was es tut, ist, Ihr Bild in den Frequenzraum umzuwandeln - das resultierende Bild ist eine seltsam aussehende Darstellung der räumlichen Frequenzen im Bild. Die Umkehrung verwandelt sich natürlich wieder in den Raum. Er, raum. Denken Sie an es wie ein grafischer Equalizer für Bilder. Sie können denken, ein Bild zu verwischen, indem Sie hohe Frequenzen von ihm entfernen, so dass, wie Fourier-Transformationen in das Bild kommen. Die Umsetzung dieses ist eigentlich ziemlich einfach, aber es gibt viele böse Details zu sorgen. Zuerst brauchen wir einige Funktionen, um die Transformation und ihre Umkehrung zu machen. Diese finden Sie in der Klasse FFT. Dies ist keineswegs eine superoptimierte Implementierung - man findet viele andere woanders im Internet. Als nächstes müssen wir den Kernel in ein Bild umwandeln, das die gleiche Größe hat wie das Bild verwischt ist (Im sicher gibt es Möglichkeiten, dies zu vermeiden, aber ich weiß nicht genug Mathe - wenn nur Id in diesen Vorträgen zugehört hat). Wir müssen auch unser Quellbild durch den Radius der Unschärfe herausstellen, indem wir die Kantenpixel duplizieren, da es schwer ist, die FFT zu bekommen, um mit Kanten wie diesem umzugehen. Nun arbeitet die FFT auf komplexe Zahlen, also müssen wir das Bild und den Kernel in Float-Arrays kopieren. Wir können hier einen Trick machen - unsere Bilder haben vier Kanäle (alpha, rot, grün und blau), also müssen wir vier Transformationen plus eins für den Kernel machen, fünf machen, aber da wir mit komplexen Zahlen arbeiten, können wir gleich zwei Transformationen machen Durch puttng einen Kanal im realen Teil des Arrays und einen Kanal im Imaginärteil. Jetzt werden die Dinge einfach, einfach verwandeln das Bild und Kernel, komplex multiplizieren sie zusammen und inverse transformieren und wir haben unser Bild zurück, aber mit dem Kernel gefaltet. Ein letztes kleines Detail ist, dass der Transformationsprozess über die Quadranten des Bildes tauscht, so dass wir unserstellen müssen. Nur ein kleines Detail bleibt: Die FFT funktioniert nur auf Bildern, die in jeder Richtung eine Kraft von 2 sind. Was wir tun müssen, ist, die doppelte Unschärfe Radius auf die Breite und Höhe hinzufügen, finden Sie die nächsthöhere Leistung von 2 und machen unsere Arrays, die Größe. Für große Bilder hat das ein paar Probleme: Eins ist das, wo wir viel Gedächtnis verbrauchen. Denken Sie daran, wir haben unsere Bilder in Float-Arrays und wir brauchen 6 dieser Arrays, von denen jeder 4-mal so groß ist wie das Bild, wenn es auf eine Power von zwei erweitert wurde. Ihre Java virtuelle Maschine kann sich auch bei Ihnen beschweren, wenn Sie dies auf ein großes Bild ausprobieren (ich weiß, ich habe versucht). Das zweite Problem ist verwandt: Die Dinge gehen einfach langsamer mit den großen Bildern wegen der Speicher-Caching-Probleme. Die Antwort ist, das Bild in Fliesen aufzuteilen und jede Fliese einzeln zu verwischen. Die Wahl einer guten Kachelgröße ist ein optionales Forschungsproblem (dh ich habe mich nicht belästigt, viel zu experimentieren), aber ist knifflig - wir müssen die Fliesen mit dem Unschärfenradius überlappen, also wenn wir eine Fliesengröße von 256 mit einem Unschärferadius von 127 wählten , Wed nur verwischen 4 Pixel mit jeder Fliese. Probieren Sie es in diesem Applet aus: Threshold Blurs Etwas, das oft gewünscht wird, ist eine Unschärfe, die Teile des Bildes verwischt, die sehr ähnlich sind, aber scharfe Kanten bewahrt. Dies ist eine digitale Falten-Creme und man kann das in jedem Filmplakat sehen, das je gedruckt wird - die Stars Gesichter haben all diese bösen Makel gebügelt, ohne dass das Bild verschwommen erscheint. Oft ist das so übertrieben, dass die Schauspieler wie Wachsfiguren oder computergenerierte Figuren aussehen. Die Art, wie wir dies tun, ist, eine gewöhnliche Faltung zu machen, aber nur in umgebenden Pixeln zählen, die dem Zielpixel ähnlich sind. Insbesondere haben wir einen Schwellenwert und enthalten nur ein Pixel in der Faltung, wenn es sich von dem mittleren Pixel um weniger als den Schwellenwert unterscheidet. Leider sind die Abkürzungen, die wir oben nahmen, hier nicht funktionieren, da wir einen anderen Satz von umgebenden Pixeln für jedes Zielpixel einfügen müssen, also wieder in die volle Faltung zurückkehren. Nun, obwohl dies äußerst zweifelhaft ist, funktioniert es eigentlich ganz gut, um noch die beiden 1D-Windungen für eine Gaußsche Unschärfe zu machen, die schneller ist als die volle 2D-Faltung, also das ist, was ich hier gemacht habe. Fühlen Sie sich frei, die Quelle zu ändern, um die volle Sache zu tun. Probieren Sie es in diesem Applet aus: Variable Blurs Bisher haben wir nur über Uniform verwischt - wo der Unschärferadius an jedem Punkt gleich ist. Für einige Zwecke ist es nett, Unschärfen zu haben, die einen anderen Radius an jedem Punkt im Bild haben. Ein Beispiel ist die Simulation der Schärfentiefe: Sie könnten ein Bild nehmen, das ganz im Fokus ist und eine Variable Unschärfe anwenden, um die Teile aus dem Fokus zu machen. Die reale Schärfentiefe ist komplizierter als dies, weil ein Objekt, das hinter einem anderen Objekt steht, keine Unschärfe vom Objekt vorn erhalten muss, aber das ignorieren Sie das und lassen Sie es den Profis überlassen. Nun, unsere Phantasie Tricks über arent gehen uns hier viel zu helfen, da alles beinhaltet Vorkalkulierung Kernel oder beruht auf der Unschärfe Radius ist das gleiche über das Bild und auf den ersten Blick sieht es aus wie weve bekam keine Möglichkeit, aber auf die volle Faltung zurück fallen Jedes Pixel, nur dieses Mal ist es viel schlimmer, da sich der Kernel von dem vorherigen Pixel geändert haben könnte. Allerdings ist alles nicht verloren Denken Sie daran, dass Trick mit Box verwischt, wo wir nur in Pixel hinzugefügt, wie sie den Kernel eingegeben und subtrahierten sie, wie sie links Es scheint, als ob dies nicht in den variablen Radius Fall arbeiten, weil wed müssen Summen für jeden möglichen Radius zu halten, aber theres eine Änderung Wir können den Trick machen, der es uns ermöglicht, die Summen für jeden Radius mit nur einer Subtraktion magisch herauszuziehen. Was wir tun, ist das Bild vorzuarbeiten und jedes Pixel durch die Summe aller Pixel nach links zu ersetzen. Auf diese Weise, wenn wir die Summe aller Pixel zwischen zwei Punkten in einer Scanlinie finden wollen, müssen wir nur die erste von der zweiten subtrahieren. Dies ermöglicht es uns, eine schnelle Variable Unschärfe mit einer modifizierten Version der Box Blur Code oben zu tun. Der Umgang mit den Kanten ist etwas komplizierter, da einfach die Summe subtrahiert wird, funktioniert nicht für Pixel von der Kante, aber das ist ein kleines Detail. Wir brauchen auch ein bisschen mehr Speicherplatz, da die Summen über den Maximalwert eines Pixels gehen - auch ein int pro Kanal verwenden müssen, anstatt vier Kanäle in einem int zu speichern. Nun, ok, aber das ist ein Gaußer (ish) Unschärfe ist es nicht Was ist mit dem Objektiv verschwimmen Ding mit variablem Radius Leider bist du hier nicht glücklich. Im nicht sagen, es gibt nicht eine super schnelle Art und Weise zu tun, aber so weit ich weiß, youre gehen, um die volle Faltung Sache zu tun haben. Probieren Sie es in diesem Applet aus, das mehr verschwindet, wenn Sie nach rechts ziehen: Schärfen durch Unschärfen Sie können eine Unschärfe verwenden, um ein Bild zu schärfen und es mit einer Technik, die als unscharfe Maskierung bezeichnet wird, zu verwischen. Was Sie tun, ist das Bild zu nehmen und subtrahieren eine verschwommene Version, so dass Sie den Verlust der Helligkeit kompensieren. Das klingt wie Magie, aber es funktioniert wirklich: vergleiche dieses Bild mit dem Original. Probieren Sie es in diesem Applet aus: Wenn Sie eine verschwommene Version eines Bildes von sich selbst abschrecken, schärft es, was macht es zu tun Wie immer gibt es keine Notwendigkeit zu erraten - Im hier, um Sie zu informieren. Was bekommt man, ist eine Art glühende Wirkung, die ganz schön aussehen kann, oder ganz käsig je nach Ihrem Standpunkt. Wenn die Menge der hinzugefügten Unschärfe variiert, variiert der glühende Effekt. Sie können diesen Effekt sehen, der viel im Fernsehen für verträumte Übergänge verwendet wird. Probieren Sie es in diesem Applet aus: Schatten machen Ein Schatten machen ist nur eine Frage der Schaffung eines Bildes, das wie die Silhouette des Schattenobjekts aussieht, es verwischt, möglicherweise verzerren oder verschieben und das Originalbild über die Oberseite einfügen. Da dies eine wirklich häufige Sache zu tun ist, sollte es ein Filter sein, um es zu tun, Und hier ist es. Dies ist eigentlich eine sehr einfachere Implementierung - es verwischt einfach den Schatten und zieht das Originalbild über die Oberseite. In der Praxis ist es besser, die Pixel, die vollständig vom Objekt versteckt sind, nicht zu verwischen. Casting Rays Wir können den gleichen Trick machen, um Lichtstrahlen zu erscheinen, um aus einem Objekt herauszukommen, nur dieses Mal macht die Schattenfarbe weiß und benutzt eine Zoom-Unschärfe anstelle der gewöhnlichen Unschärfe und fügt dann das Ergebnis auf das Original hinzu. Die Strahlen sehen oft besser aus, wenn man sie nur aus hellen Teilen des Bildes abgibt, so dass der Filter eine Schwelle hat, die man einstellen kann, um Strahlen auf helle Bereiche zu beschränken. Dies ist eine gute Wirkung zu beleben: machen die Mitte der Strahlen bewegen sich über das Bild und Sie erhalten die Wirkung einer bewegten Lichtquelle hinter dem Bild. Fazit Nun, das ist es, und ich habe nicht einmal andere verwischende Methoden wie IIR-Filter, rekursive Filter und all die anderen bösen Dinge erwähnt. Ich hoffe, Sie kommen mit etwas Nützlichem davon, auch wenn es nur ein brennender Wunsch ist, eine grüne Tinte zu kaufen und mir einen Brief zu schreiben. Schließlich haben Sie vielleicht bemerkt, dass die oben genannte Quelle auf andere Klassen angewiesen ist. Keine Sorge, hier sind sie: Computational Tools Analog hat DataFrame eine Methode cov, um paarweise Kovarianzen unter den Serien im DataFrame zu berechnen, auch ohne NAnull Werte. Unter der Annahme, dass die fehlenden Daten zufällig fehlen, ergibt sich eine Schätzung für die Kovarianzmatrix, die unvoreingenommen ist. Für viele Anwendungen ist diese Schätzung jedoch nicht akzeptabel, da die geschätzte Kovarianzmatrix nicht als positiv halb-definitiv garantiert ist. Dies könnte zu geschätzten Korrelationen mit absoluten Werten führen, die größer als eins sind und eine nicht invertierbare Kovarianzmatrix. Siehe Schätzung der Kovarianzmatrizen für weitere Details. DataFrame. cov unterstützt auch ein optionales Minperiod-Keyword, das die erforderliche Mindestanzahl von Beobachtungen für jedes Spaltenpaar angibt, um ein gültiges Ergebnis zu erhalten. Die im Fenster verwendeten Gewichte werden durch das Schlüsselwort wintype angegeben. Die Liste der anerkannten Typen sind: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (benötigt beta) gaussian (benötigt std) generalgaussian (benötigt Macht, Breite) slepian (braucht Breite). Beachten Sie, dass das Kastenfenster dem Mittelwert entspricht (). Für einige Fensterfunktionen müssen zusätzliche Parameter angegeben werden: Für. sum () mit einem Wintype. Es gibt keine Normalisierung an den Gewichten für das Fenster. Wenn man benutzerdefinierte Gewichte von 1, 1, 1 erhält, ergibt sich ein anderes Ergebnis als die Gewichte von 2, 2, 2. zum Beispiel. Beim Überschreiten eines Wintyps anstatt explizit die Gewichte zu spezifizieren, sind die Gewichte bereits normalisiert, so dass das größte Gewicht 1 ist. Im Gegensatz dazu ist die Art der. mean () - Berechnung so, dass die Gewichte in Bezug aufeinander normalisiert werden. Gewichte von 1, 1, 1 und 2, 2, 2 ergeben das gleiche Ergebnis. Time-aware Rolling Neu in Version 0.19.0. Neu in der Version 0.19.0 sind die Möglichkeit, einen Offset (oder Cabrio) an eine. rolling () - Methode zu übergeben und es auf der Grundlage des übergebenen Zeitfensters variable Fenster zu erzeugen. Für jeden Zeitpunkt sind alle vorangegangenen Werte innerhalb der angegebenen Zeit delta enthalten. Dies kann besonders nützlich für einen nicht regelmäßigen Zeitfrequenzindex sein. Dies ist ein regelmäßiger Frequenzindex. Die Verwendung eines Integer-Fensterparameters funktioniert, um die Fensterfrequenz zu rollen. Die Angabe eines Offsets ermöglicht eine intuitivere Spezifikation der Rollfrequenz. Mit einem nicht regelmäßigen, aber immer noch monotonen Index, das Rollen mit einem ganzzahligen Fenster gibt keine spezielle Berechnung. Die Verwendung der Zeit-Spezifikation erzeugt variable Fenster für diese spärlichen Daten. Darüber hinaus erlauben wir nun einen optionalen Parameter, um eine Spalte (und nicht die Standardeinstellung des Index) in einem DataFrame anzugeben. Time-aware Rolling vs. Resampling Mit. rolling () mit einem zeitbasierten Index ähnelt dem Resampling. Sie betreiben und führen reduktive Operationen auf zeitindizierten Pandasobjekten durch. Bei Verwendung von. rolling () mit einem Offset. Der Versatz ist ein Zeit-Dreieck. Nehmen Sie ein Rückwärts-in-Zeit-Fenster und aggregieren alle Werte in diesem Fenster (einschließlich der Endpunkt, aber nicht der Startpunkt). Dies ist der neue Wert zu diesem Zeitpunkt im Ergebnis. Dies sind variable Fenster im Zeitraum für jeden Punkt der Eingabe. Sie erhalten ein gleiches Ergebnis wie die Eingabe. Bei Verwendung von. resample () mit einem Offset. Konstruieren Sie einen neuen Index, der die Häufigkeit des Offsets ist. Für jeden Frequenz-Bin, Aggregat Punkte aus der Eingabe in einem Rückwärts-in-Zeit-Fenster, die in diesem bin. Das Ergebnis dieser Aggregation ist die Ausgabe für diesen Frequenzpunkt. Die Fenster sind im Größenbereich feste Größe. Ihr Ergebnis hat die Form einer regelmäßigen Frequenz zwischen dem Min und dem Maximum des ursprünglichen Eingabeobjekts. Zusammenfassen. Rolling () ist eine zeitbasierte Fensterbedienung, während. resample () eine frequenzbasierte Fensteroperation ist. Zentrieren von Windows Standardmäßig sind die Etiketten am rechten Rand des Fensters eingestellt, aber ein zentrales Schlüsselwort steht zur Verfügung, so dass die Etiketten in der Mitte eingestellt werden können. Binäre Fensterfunktionen cov () und corr () können bewegte Fensterstatistiken über zwei Serien oder eine beliebige Kombination von DataFrameSeries oder DataFrameDataFrame berechnen. Hier ist das Verhalten in jedem Fall: zwei Serien. Berechnen Sie die Statistik für die Paarung. DataFrameSeries. Berechnen Sie die Statistik für jede Spalte des DataFrame mit der übergebenen Serie und geben so ein DataFrame zurück. DataFrameDataFrame. Standardmäßig die Statistik für die Übereinstimmung der Spaltennamen berechnen und einen DataFrame zurückgeben. Wenn das Keyword-Argument paarweiseTrue übergeben wird, berechnet man die Statistik für jedes Spaltenpaar und gibt ein Panel zurück, dessen Elemente die betreffenden Termine sind (siehe nächster Abschnitt). Computing Rolling Paarweise Kovarianzen und Korrelationen In der Finanzdatenanalyse und anderen Bereichen it8217s gemeinsam, um Kovarianz und Korrelationsmatrizen für eine Sammlung von Zeitreihen zu berechnen. Oft ist man auch an Moving-Fenster-Kovarianz - und Korrelationsmatrizen interessiert. Dies kann getan werden, indem man das paarweise Schlüsselwort-Argument übergibt, das im Fall von DataFrame-Eingaben ein Panel liefert, dessen Elemente die Daten sind. Im Falle eines einzigen DataFrame-Arguments kann das paarweise Argument sogar weggelassen werden: Fehlende Werte werden ignoriert und jeder Eintrag wird mit den paarweise vollständigen Beobachtungen berechnet. Bitte beachten Sie die Kovarianz-Sektion für Einschränkungen, die mit dieser Methode zur Berechnung von Kovarianz - und Korrelationsmatrizen verbunden sind. Abgesehen davon, dass kein Fensterparameter vorhanden ist, haben diese Funktionen die gleichen Schnittstellen wie ihre. rolling-Pendants. Wie oben sind die Parameter, die sie alle akzeptieren: minperiods. Schwelle von Nicht-Null-Datenpunkten zu erfordern. Standardmäßig benötigt, um die Statistik zu berechnen. Es werden keine NaNs ausgegeben, sobald Minimalperioden Nicht-Null-Datenpunkte gesehen wurden. Center. Boolean, ob die Etiketten in der Mitte gesetzt werden sollen (Standard ist False) Die Ausgabe der. rolling - und. expanding-Methoden gibt kein NaN zurück, wenn es im aktuellen Fenster mindestens Minimalperioden gibt. Das unterscheidet sich von cumsum. Cumprod Cummax Und cummin Die NaN in der Ausgabe zurückgeben, wo ein NaN in der Eingabe angetroffen wird. Eine expandierende Fensterstatistik wird stabiler (und weniger reaktionsfähig) als sein Rollfenster, da die zunehmende Fenstergröße die relative Auswirkung eines einzelnen Datenpunktes verringert. Als Beispiel hierbei handelt es sich um die mittlere () Ausgabe für den vorherigen Zeitreihen-Datensatz: Exponentiell gewichtetes Fenster Ein verwandter Satz von Funktionen sind exponentiell gewichtete Versionen mehrerer der obigen Statistiken. Eine ähnliche Schnittstelle zu. rolling und. expanding wird durch die. ewm-Methode aufgerufen, um ein EWM-Objekt zu empfangen. Es werden eine Reihe von erweiterten EW (exponentiell gewichtete) Methoden bereitgestellt: Slideshare verwendet Cookies, um Funktionalität und Performance zu verbessern und Ihnen relevante Werbung zu bieten. Wenn Sie die Seite weiter durchsuchen, stimmen Sie der Verwendung von Cookies auf dieser Website zu. Siehe unsere Benutzervereinbarung und Datenschutzbestimmungen. Slideshare verwendet Cookies, um Funktionalität und Leistung zu verbessern und Ihnen relevante Werbung zu bieten. Wenn Sie die Seite weiter durchsuchen, stimmen Sie der Verwendung von Cookies auf dieser Website zu. Weitere Informationen finden Sie in unserer Datenschutzerklärung und Benutzervereinbarung. Entdecken Sie alle Ihre Lieblingsthemen in der SlideShare App Holen Sie sich die SlideShare App, um für später zu speichern, auch offline Weiter zur mobilen Website Upload Login Signup Doppelte Tap zum Verkleinern Basic Matlab Programme Teilen Sie diese SlideShare LinkedIn Corporation Kopie 2017

No comments:

Post a Comment