2015-12-17 13 views
5

ich einen direkten Faltungsalgorithmus bin mit der Faltung zwischen diesem Bild zu berechnen:Artefakte in Faltung

enter image description here

und diesen Kernel:

enter image description here

ich die Umsetzung in astropy bin mit für die direkte Faltung.

Daraus ergibt sich die folgende Faltung, alle Einstellungen zu verlassen (einschließlich Grenzkosten) auf die Standardwerte, dh astropy.convolution.convolve (Bild, Kernel):

enter image description here

Diese Faltung einige rätselhafte Artefakte hat . Insbesondere gibt es ein "quadratisches" Muster mit einem Versatz von ungefähr 50 Pixeln von der Kante. Es scheint mir, dass dies auf das Ausmaß des Kerns zurückzuführen ist; Obwohl der Kernel 249 x 249 groß ist, sind die meisten Informationen eindeutig in einem Radius von etwa 100 Pixeln enthalten - was bedeutet, dass wir wahrscheinlich Probleme bekommen, wenn der Kernel auf die Kanten angewendet wird.

Was mich auf meine Fragen bringt:

  1. Ist diese Hypothese richtig -, dass es sich tatsächlich um ein Randproblem?
  2. Wie würde ich das Problem lösen? Ich weiß nicht, wie man verschiedene Edge-Handling (Zero Padding, Interpolation, Wrapping, ...) rechtfertigen kann. Ich bin sicher, dass verschiedene Fälle unterschiedliche Lösungen erfordern, aber ich bin mir nicht sicher, wie ich mich dafür entscheiden soll ...
  3. Nur ... versuchen, den Unterschied zwischen der Verwendung eines direkten Algorithmus und einer FFT-Faltung zu verstehen. Wenn der Kernel und das Image gleich groß sind, ist für die FT-Faltung kein Null-Padding erforderlich, es werden keine Kanteneffekte angezeigt. Bei der direkten Methode haben Sie versehentlich eine Kantenbehandlung ... also sind die Ergebnisse sogar gleichwertig? Weil im Prinzip nur ihre Leistung abweichen sollte, oder?

Antwort

7

Ja, das ist ein Edge-Effekt-Problem, das kommt, weil Sie negative Werte in Ihrem Kernel haben. Sobald sich der Kernel teilweise außerhalb der Grenze befindet, beginnt sich der Mittelwert des Kernels zu ändern.

Eine Lösung wäre, boundary='fill' und fill_value=(mean of your image) oder etwas in dieser Richtung zu verwenden. Diese Artefakte werden möglicherweise nicht vollständig entfernt, sie sollten jedoch reduziert werden.

Für die FFT Convolution Teil Ihrer Frage - die FFT Convolution wird das gleiche tun. Das Edge-Padding ist jedoch, das für die FFT-Faltung erforderlich ist, da andernfalls die Grenze umbrochen wird. Nicht Padding (z. B. convolve_fft(..., boundary='wrap')) wird tatsächlich Ihre Artefakte loswerden, aber es wird es auf eine Weise tun, die Sie überraschen kann, da es Pixel von der rechten Seite des Bildes mit der linken Seite mittelt.

astropy des convolve und convolve_fft beide die gleiche Sache der gleichen boundary Bedingungen gegeben, aber die naive fft Faltung (das heißt, conv = ifft(fft(im) * fft(kernel))) äquivalent boundary='wrap' zu verwenden.