opencv Foundation 58 Fourier-Transformation cv2.dft()->(Bildverbesserung, Bildentrauschung, Kantenerkennung, Merkmalsextraktion, Bildkomprimierung und -verschlüsselung)

Was ist die Fourier-Transformation?

Die Fourier-Transformation ist nach dem französischen Mathematiker Jean-Baptiste Joseph Fourier benannt,
zu Ehren seiner Beiträge zu diesem mathematischen Werkzeug. Fourier lebte Ende des 18. Jahrhunderts und Anfang des 19. Jahrhunderts. Er war ein vielseitiger Wissenschaftler, der nicht nur herausragende Leistungen auf dem Gebiet der Mathematik erbrachte, sondern auch wichtige Beiträge auf den Gebieten der Wärmeleitung und der Astrophysik leistete.

Die früheste Form der Fourier-Transformation wurde erstmals 1822 von Fourier eingeführt, der in seinem Buch „Analytic Method for Solving the Heat Equation“ eine Methode zur Zerlegung einer periodischen Funktion in eine Reihe von Sinus- und Cosinusfunktionen beschrieb. Seine Arbeit legte den Grundstein für die moderne Frequenzbereichsanalyse in der Signalverarbeitung, Bildverarbeitung und anderen Bereichen.

Die Fourier-Transformation ist nach Fourier benannt, weil er als erster dieses mathematische Werkzeug systematisch untersuchte und anwendete. Fouriers Arbeit hat die moderne Wissenschaft tiefgreifend beeinflusst, insbesondere in den Bereichen Signalverarbeitung, Bildverarbeitung und Kommunikation. Die Fourier-Transformation wird häufig zur Analyse und Verarbeitung verschiedener Arten von Signalen und Daten verwendet.

Was ist die Transformation in der Fourier-Transformation?

Bei der Fourier-Transformation bezieht sich „Transformation“ auf die Konvertierung einer Funktion von einer Zeitdomänendarstellung (Zeitdomänendarstellung) in eine Frequenzdomänendarstellung (Frequenzdomänendarstellung). Mit anderen Worten: Die Fourier-Transformation wandelt eine Funktion von der Beschreibung ihres Verhaltens zu unterschiedlichen Zeitpunkten in die Beschreibung ihrer Komponenten bei unterschiedlichen Frequenzen um.

Bei der Fourier-Transformation transformieren wir eine Funktion (normalerweise ein Signal oder ein Bild). Diese Funktion kann kontinuierlich oder diskret sein. Die kontinuierliche Fourier-Transformation (CFT) wird auf ein zeitkontinuierliches Signal angewendet und wandelt es vom Zeitbereich in den kontinuierlichen Frequenzbereich um. Die Diskrete Fourier-Transformation (DFT) wird auf ein zeitdiskretes Signal angewendet und transformiert es vom Zeitbereich in den diskreten Frequenzbereich.

Was wird in opencv transformiert?

In OpenCV ist die Fourier-Transformation (Fourier-Transformation) eine an einem Bild durchgeführte Transformation, bei der das Bild vom räumlichen Bereich (Zeitbereich) in den Frequenzbereich umgewandelt wird. Konkret
handelt es sich bei der Fourier-Transformation in OpenCV um die diskrete Fourier-Transformation (DFT), mit der ein diskretes Bild vom Zeitbereich in den diskreten Frequenzbereich umgewandelt wird.

In der Fourier-Transformation, OpenCV 对输入的图像进行数学变换,将图像的每个像素表示为一系列正弦和余弦波的振幅和相位. Dadurch wird ein Bild von seiner Rohpixeldarstellung in eine komplexe Darstellung umgewandelt, die die verschiedenen Frequenzkomponenten im Bild darstellt.

Nachdem ich die obigen Informationen gelesen habe, weiß ich immer noch nicht, was es ist, also weiß ich, warum es Fourier-Transformation heißt.


Die Fourier-Transformation ist sehr abstrakt. Viele Menschen haben die Fourier-Transformation viele Jahre lang in der Technik verwendet und nicht vollständig verstanden, worum es bei der Fourier-Transformation geht. Um die Fourier-Transformation besser zu veranschaulichen, schauen wir uns ein Beispiel aus dem Leben an.

Tabelle 14-1 zeigt die Formel eines bestimmten Getränks. Die Formel ist eine Tabelle in Form der Zeit. Die Tabelle ist sehr lang und nur ein Teil davon wird hier abgefangen. In dieser Tabelle werden die Vorgänge vom Zeitpunkt „00:00“ bis zu einem bestimmten Zeitpunkt „00:11“ aufgezeichnet.

Fügen Sie hier eine Bildbeschreibung ein

Eine sorgfältige Analyse der Tabelle zeigt, dass das Rezept:

  • Geben Sie alle 1 Minute 1 Stück Kandiszucker hinein.
  • Geben Sie alle 2 Minuten 3 rote Bohnen hinein.
  • Geben Sie alle 3 Minuten 2 Mungobohnen hinein.
  • Alle 4 Minuten 4 Tomaten hineinlegen.
  • Geben Sie alle 5 Minuten 1 Tasse gereinigtes Wasser hinzu.

Der obige Text ist eine Erläuterung der Formel aus Sicht der Betriebsfrequenz.

Bei der Datenverarbeitung werden Informationen häufig in Form von Diagrammen ausgedrückt. Aus Sicht des Zeitbereichs kann die Rezepttabelle wie in Abbildung 14-1 dargestellt werden. Abbildung 14-1 zeigt nur die Funktionsweise des Rezepts in den ersten 11 Minuten. Wenn die Funktionsweise des Rezepts vollständig dargestellt werden soll, müssen die Operationsschritte in der gesamten Zeit in einem Diagramm dargestellt werden.

Fügen Sie hier eine Bildbeschreibung ein

Aus der Perspektive der Häufigkeit (Periode) ausgedrückt, kann diese Formeltabelle wie in Abbildung 14-2 dargestellt werden, wobei die Abszisse in der Abbildung die Periode (Kehrwert der Häufigkeit) und die Ordinate die Anzahl der Zutaten darstellt.

Es ist ersichtlich, dass Abbildung 14-2 den Betriebsprozess dieses Rezepts vollständig darstellen kann.

Fügen Sie hier eine Bildbeschreibung ein

Bei Funktionen ist auch eine Transformation vom Zeitbereich in den Frequenzbereich möglich .

Abbildung 14-3 ist eine Sinuskurve mit der Frequenz 5 (5 Zyklen in 1 Sekunde) und der Amplitude 1.

Fügen Sie hier eine Bildbeschreibung ein
Wenn man es aus der Perspektive der Frequenz betrachtet, kann es als Frequenzbereichsdiagramm dargestellt werden, wie in Abbildung 14-4 dargestellt, wobei die Abszisse die Frequenz und die Ordinate die Amplitude ist.

Fügen Sie hier eine Bildbeschreibung ein
Abbildung 14-3 und Abbildung 14-4 sind äquivalent; es handelt sich um unterschiedliche Darstellungen derselben Funktion. Die entsprechende Zeitbereichsdarstellung kann durch die Frequenzbereichsdarstellung erhalten werden, und die entsprechende Frequenzbereichsdarstellung kann auch durch die Zeitbereichsdarstellung erhalten werden.

Der französische Mathematiker Fourier wies darauf hin, dass jede periodische Funktion als Summe von Sinusfunktionen unterschiedlicher Frequenz ausgedrückt werden kann. Aus heutiger Sicht gilt diese Theorie als selbstverständlich, allerdings ist diese Theorie schwer zu verstehen und wurde damals stark in Frage gestellt.

Schauen wir uns den spezifischen Prozess der Fourier-Transformation an. Die Kurve einer periodischen Funktion ist beispielsweise im Diagramm oben links in Abbildung 14-5 dargestellt. Diese periodische Funktion kann ausgedrückt werden als:

y = 3 np.sin(0,8 x) + 7 np.sin(0,5 x) + 2 np.sin(0,2 x)

Daher kann die Funktion als Summe der folgenden drei Funktionen angesehen werden:

  • y1 = 3 np.sin(0,8 x) (Funktion 1)
  • y2 = 7 np.sin(0,5 x) (Funktion 2)
  • y3 = 2 np.sin(0,2 x) (Funktion 3)

Die Funktionskurven, die den oben genannten drei Funktionen entsprechen, sind in der oberen rechten Ecke, der unteren linken Ecke bzw. der unteren rechten Ecke von Abbildung 14-5 dargestellt.

Fügen Sie hier eine Bildbeschreibung ein
Aus der Perspektive des Frequenzbereichs betrachtet können die oben genannten drei Sinusfunktionen als drei Spalten in Abbildung 14-6 ausgedrückt werden, wobei die Abszisse in der Abbildung die Frequenz und die Ordinate die Amplitude darstellt.

Fügen Sie hier eine Bildbeschreibung ein
Aus der obigen Analyse können wir erkennen, dass die Funktionskurve in der oberen linken Ecke von Abbildung 14-5 als das in Abbildung 14-6 gezeigte Frequenzbereichsdiagramm ausgedrückt werden kann.

Der Prozess zum Erstellen des in Abbildung 14-6 gezeigten Frequenzbereichsdiagramms aus dem Zeitbereichsfunktionsdiagramm in der oberen linken Ecke von Abbildung 14-5 ist die Fourier-Transformation.

Abbildung 14-1 und Abbildung 14-2 stellen die gleichen Informationen dar, Abbildung 14-1 ist ein Zeitbereichsdiagramm und Abbildung 14-2 ist ein Frequenzbereichsdiagramm.
Das Zeitbereichsfunktionsdiagramm in der oberen linken Ecke von Abbildung 14-5 enthält genau die gleichen Informationen wie das Frequenzbereichsdiagramm in Abbildung 14-6.
Die Fourier-Transformation besteht darin, Zeitbereichsinformationen aus der Perspektive des Frequenzbereichs vollständig auszudrücken.
Neben der oben genannten Frequenz und Amplitude sollte auch das Problem der Zeitdifferenz berücksichtigt werden. Beispielsweise erfordern Getränkeformulierungen eine strenge Kontrolle darüber, wann Zutaten hinzugefügt werden, um den Geschmack zu steuern. Der Vorgang bei „00:00“ in Tabelle 14-1 wird unter genauerer Steuerung tatsächlich in Tabelle 14-2 gezeigt.

Fügen Sie hier eine Bildbeschreibung ein
Wenn der Zeitpunkt der Zugabe der Zutaten geändert wird, verändert sich der Geschmack des Getränks. Daher muss im eigentlichen Verarbeitungsprozess auch der Zeitunterschied berücksichtigt werden. Dieser Zeitunterschied ist die Phase in der Fourier-Transformation . Phase stellt Informationen im Zusammenhang mit der Zeitdifferenz dar.

Beispielsweise kann die Funktion, die der oberen linken Ecke von Abbildung 14-7 entspricht, wie folgt ausgedrückt werden:

y = 3 np.sin(0,8 x) + 7 np.sin(0,5 x+2) + 2 np.sin(0,2 x+3)

Daher kann die Funktion als Summe der folgenden drei Funktionen angesehen werden:

  • y1 = 3 np.sin(0,8 x) (Funktion 1)
  • y2 = 7 np.sin(0,5 x+2) (Funktion 2)
  • y3 = 2 np.sin(0,2 x+3) (Funktion 3)

Die Funktionskurven, die den oben genannten drei Funktionen entsprechen, sind in der oberen rechten Ecke, der unteren linken Ecke bzw. der unteren rechten Ecke von Abbildung 14-7 dargestellt.

Fügen Sie hier eine Bildbeschreibung ein
Wenn in diesem Beispiel die Abszisse als Startzeit betrachtet wird, beginnen die drei Sinusfunktionen, aus denen die Funktion y besteht, nicht alle beim Zeitpunkt 0, und es besteht ein Zeitunterschied zwischen ihnen. Wenn die Funktion ohne Zeitdifferenz direkt verwendet wird, kann die in der oberen linken Ecke von Abbildung 14-7 gezeigte Funktion nicht gebildet werden, es wird jedoch die in der oberen linken Ecke von Abbildung 14-5 gezeigte Funktion gebildet.
Daher ist die Phasendifferenz auch eine sehr wichtige Bedingung bei der Fourier-Transformation.

Das Obige verwendet Beispiele für Getränkerezepte und -funktionen, um die Machbarkeit der Zeitbereichs- und Frequenzbereichskonvertierung vorzustellen. Ich hoffe, es wird für alle hilfreich sein, die Fourier-Transformation zu verstehen.

Im Bildverarbeitungsprozess besteht die Fourier-Transformation darin, das Bild in zwei Teile zu zerlegen, die Sinuskomponente und die Kosinuskomponente, dh das Bild vom räumlichen Bereich in den Frequenzbereich (im Folgenden als Frequenzbereich bezeichnet) umzuwandeln. . Nachdem das digitale Bild einer Fourier-Transformation unterzogen wurde, ist der erhaltene Frequenzbereichswert eine komplexe Zahl.

Um die Ergebnisse der Fourier-Transformation anzuzeigen, ist es daher erforderlich, die Form eines realen Bildes plus eines imaginären Bildes (komplexes Bild) oder eines Größenbildes (Magnitudenbildes) plus Phasenbildes (Phasenbildes) zu verwenden.

Da das Magnitudenbild die meisten Informationen enthält, die wir im Originalbild benötigen, wird bei der Bildverarbeitung normalerweise nur das Magnitudenbild verwendet. Wenn Sie das Bild zuerst im Frequenzbereich verarbeiten und dann das modifizierte Bild im räumlichen Bereich durch inverse Fourier-Transformation erhalten möchten, müssen Sie natürlich gleichzeitig das Größenbild und das Phasenbild beibehalten.

Nachdem wir eine Fourier-Transformation am Bild durchgeführt haben, erhalten wir die Niederfrequenz- und Hochfrequenzinformationen im Bild. Niederfrequenzinformationen entsprechen sich langsam ändernden Graustufenkomponenten im Bild. Die hochfrequenten Informationen entsprechen dem Graustufenanteil, der sich im Bild immer schneller ändert, was durch den scharfen Übergang der Graustufen verursacht wird.

Wenn beispielsweise ein Löwe in einem Bild einer Prärie zu sehen ist, entsprechen die niederfrequenten Informationen Details wie dem riesigen Grasland mit einheitlichen Farben, während die hochfrequenten Informationen verschiedenen Kanten- und Rauschinformationen wie dem Umriss von entsprechen der Löwe.

Der Zweck der Fourier-Transformation besteht darin, das Bild vom räumlichen Bereich in den Frequenzbereich umzuwandeln, die Verarbeitung bestimmter Objekte im Bild im Frequenzbereich zu realisieren und anschließend das verarbeitete Frequenzbereichsbild in die Fourier-Transformation umzuwandeln, um das Bild im räumlichen Bereich zu erhalten . Die Fourier-Transformation spielt eine sehr wichtige Rolle im Bereich der Bildverarbeitung, mit der Bildverbesserung, Bildrauschunterdrückung, Kantenerkennung, Merkmalsextraktion, Bildkomprimierung und -verschlüsselung usw. realisiert werden können.


Wenn ich mir eine Reihe von Textbeschreibungen ansehe, brennt mein Gehirn. Werfen wir einen Blick auf den Code

Numpy implementiert die Beschreibung der Fourier-Transformationsfunktion

Das Numpy-Modul stellt die Fourier-Transformationsfunktion bereit, und die Funktion fft2 () im Numpy-Modul kann die Fourier-Transformation des Bildes realisieren.

Die von Numpy bereitgestellte Funktion zur Realisierung der Fourier-Transformation ist numpy.fft.fft2() und ihr Syntaxformat lautet:

Rückgabewert = numpy.fft.fft2(Originalbild)

这里需要注意的是,参数“原始图像”的类型是灰度图像,函数的返回值是一个复数数组(complex ndarray)。

Nach der Verarbeitung dieser Funktion können die Spektrumsinformationen des Bildes abgerufen werden. Zu diesem Zeitpunkt befindet sich die Nullfrequenzkomponente im Bildspektrum in der oberen linken Ecke des Spektrumbilds (Frequenzbereichsbild) 1. Zur Vereinfachung der Beobachtung wird normalerweise die Funktion numpy.fft.fftshift () zum Verschieben verwendet Die Nullfrequenzkomponente wird in die Mitte des Frequenzbereichsbilds verschoben, wie in Abbildung 14-8 dargestellt.

Fügen Sie hier eine Bildbeschreibung ein
Das Syntaxformat der Funktion numpy.fft.fftshift() ist:

Rückgabewert = numpy.fft.fftshift(Rohspektrum)

Nach der Verarbeitung mit dieser Funktion wird der Nullfrequenzanteil im Bildspektrum in die Mitte des Frequenzbereichsbildes verschoben, was für die Beobachtung des Nullfrequenzanteils im Spektrum nach der Fourier-Transformation sehr effektiv ist.
Nach der Fourier-Transformation des Bildes erhält man ein Array komplexer Zahlen. Um als Bild angezeigt zu werden, müssen ihre Werte an den Grauraum von [0, 255] angepasst werden. Die verwendete Formel lautet:

Neuer Pixelwert = 20*np.log(np.abs(Spektrumwert))

Codebeispiel: Implementieren Sie die Fourier-Transformation mit Numpy und beobachten Sie das erhaltene Spektrumbild.

Code wie folgt anzeigen:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('lena.png',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))
plt.subplot(121)
plt.imshow(img, cmap = 'gray')
plt.title('original')
plt.axis('off')
plt.subplot(122)
plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('result')
plt.axis('off')
plt.show()

Laufergebnis:
Zeigt das Originalbild und sein Spektrumbild an
Fügen Sie hier eine Bildbeschreibung ein

Implementieren Sie die inverse Fourier-Transformation

Wenn 注意die Funktion numpy.fft.fftshift() zum Verschieben der Nullfrequenzkomponente während der Fourier-Transformation verwendet wird, muss im inversen Fourier-Transformationsprozess die Funktion numpy.fft.ifftshift() verwendet werden Verschieben Sie zuerst die Nullfrequenzkomponente. Die Frequenzkomponenten werden an die ursprüngliche Position verschoben und dann wird eine inverse Fourier-Transformation durchgeführt. Der Vorgang ist in Abbildung 14-10 dargestellt.

Fügen Sie hier eine Bildbeschreibung ein

Die Funktion numpy.fft.ifftshift() ist die Umkehrfunktion von numpy.fft.fftshift() und ihr Syntaxformat ist:

angepasstes Spektrum = numpy.fft.ifftshift(Rohspektrum)

Die Funktion numpy.fft.ifft2() kann die inverse Fourier-Transformation implementieren und ein Array räumlicher komplexer Zahlen zurückgeben. Es ist die Umkehrfunktion von numpy.fft.fft2(), die Syntax dieser Funktion lautet:

Rückgabewert = numpy.fft.ifft2 (Frequenzbereichsdaten)

Der Rückgabewert der Funktion numpy.fft.ifft2() ist immer noch ein komplexes Ndarray.
Die durch die inverse Fourier-Transformation erhaltenen räumlichen Domäneninformationen sind ein komplexes Array, das an den Graustufenraum [0, 255] angepasst werden muss. Die verwendete Formel lautet:

iimg = np.abs(Ergebnis der inversen Fourier-Transformation)

Beispiel: Implementieren Sie die Fourier-Transformation und die inverse Fourier-Transformation in Numpy und beobachten Sie das Ergebnisbild der inversen Fourier-Transformation.

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('lena.png',0)
#对图像进行傅里叶变换,结果是复数
f = np.fft.fft2(img)
#将低频部分移动到图像中心
fshift = np.fft.fftshift(f)
#将复数变化成实数
magnitude_spectrum = 20*np.log(np.abs(fshift))
#将傅里叶变换的结果进行反变换
ishift = np.fft.ifftshift(fshift)


#对傅里叶变换的结果进行反变换
iimg = np.fft.ifft2(ishift)

#取绝对值
iimg = np.abs(iimg)


plt.subplot(131),plt.imshow(img, cmap = 'gray')
plt.title('original'),plt.axis('off')

plt.subplot(132),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('magnitude_spectrum'),plt.axis('off')

plt.subplot(133),plt.imshow(iimg, cmap = 'gray')
plt.title('iimg'),plt.axis('off')

plt.show()

Operationsergebnis:

Fügen Sie hier eine Bildbeschreibung ein

Beispiel für eine Hochpassfilterung

In einem Bild sind gleichzeitig hochfrequente und niederfrequente Signale vorhanden.

  • Niederfrequente Signale entsprechen sich langsam ändernden Graustufenkomponenten im Bild. In einem Bild einer Savanne beispielsweise entspricht das niederfrequente Signal einer
    ausgedehnten Graslandfläche, deren Farbe tendenziell einheitlich ist.
  • Das Hochfrequenzsignal entspricht dem immer schneller wechselnden Graustufenanteil im Bild, der durch den scharfen Übergang der Graustufen entsteht. Wenn im Savannenbild oben auch ein Löwe zu sehen ist, dann entspricht das Hochfrequenzsignal Informationen wie dem Rand des Löwen.

Der Filter kann eine bestimmte Frequenzkomponente durchlassen oder unterdrücken und kann je nach Wirkungsweise in einen Tiefpassfilter und einen Hochpassfilter unterteilt werden.

  • Ein Filter, der niederfrequente Signale durchlässt, wird Tiefpassfilter genannt. Ein Tiefpassfilter dämpft hochfrequente Signale und lässt niederfrequente Signale durch 会使图像变模糊.
  • Ein Filter, der hochfrequente Signale durchlässt, wird Hochpassfilter genannt. Ein Hochpassfilter dämpft niederfrequente Signale und lässt hochfrequente Signale durch, wodurch die Detailschärfe im Bild verbessert wird, das Bild jedoch an Kontrast verliert.

Die Fourier-Transformation kann das Hochfrequenzsignal und das Niederfrequenzsignal des Bildes trennen

Fügen Sie hier eine Bildbeschreibung ein
Um alle Pixelwerte in der Mitte des rechten Bildes in Abbildung 14-12 auf Null zu setzen, müssen zunächst die Koordinaten seiner Mittelposition berechnet und dann ein Bereich mit einer Größe von 30 Pixeln ausgewählt werden von oben nach unten, von links nach rechts, mit den Koordinaten als Mittelpunkt, und setzen Sie die Pixel in diesem Bereich auf Null. Der Wert wird auf Null gesetzt.

Die Implementierung dieses Filters ist:

rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

Beispiel: Fourier-Transformation eines Bildes in Numpy, um sein Frequenzbereichsbild zu erhalten. Anschließend wird der Wert der Niederfrequenzkomponente im Frequenzbereich als 0 verarbeitet, um eine Hochpassfilterung zu realisieren. Abschließend wird das Bild einer inversen Fourier-Transformation unterzogen, um das wiederhergestellte Originalbild zu erhalten.

Beobachten Sie den Unterschied im Bild vor und nach der Fourier-Transformation.

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('lena.png',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(iimg, cmap = 'gray')
plt.title('iimg'),plt.axis('off')
plt.show()

Operationsergebnis:

Fügen Sie hier eine Bildbeschreibung ein

OpenCV implementiert die Fourier-Transformation

OpenCV 提供了函数 cv2.dft()和 cv2.idft()来实现傅里叶变换和逆傅里叶变换, die im Folgenden gesondert vorgestellt wird.

Implementieren Sie die Fourier-Transformation

Das Syntaxformat der Funktion cv2.dft() ist:

Rückgabeergebnis = cv2.dft (Originalbild, konvertiertes Logo)

Bei der Verwendung dieser Funktion müssen Sie auf die Verwendungsspezifikationen der Parameter achten:

  • Für den Parameter „Originalbild“ verwenden Sie zunächst die Funktion np.float32(), um das Bild in das np.float32-Format zu konvertieren.
  • Der Wert des „Konvertierungsflags“ ist normalerweise „cv2.DFT_COMPLEX_OUTPUT“, der zur Ausgabe eines komplexen Arrays verwendet wird.

Das von der Funktion cv2.dft() zurückgegebene Ergebnis stimmt mit dem Ergebnis überein, das durch die Verwendung von Numpy für die Fourier-Transformation erhalten wurde, aber der zurückgegebene Wert ist zweikanalig, der erste Kanal ist der Realteil des Ergebnisses und der zweite Kanal ist es das
Ergebnis der Imaginärteil von .

Nach der Transformation der Funktion cv2.dft() erhalten wir die Spektralinformationen des Originalbildes.
Zu diesem Zeitpunkt befindet sich die Nullfrequenzkomponente nicht in der Mitte. Zur Vereinfachung der Verarbeitung muss sie in die Mitte verschoben werden, was durch die Funktion numpy.fft.fftshift () realisiert werden kann.

Die folgende Anweisung verschiebt beispielsweise die Nullfrequenzkomponente im Spektrumbild dft in die Mitte des Spektrums und erhält die Spektrumbildverschiebung dftshift mit der Nullfrequenzkomponente in der Mitte.

dftShift = np.fft.fftshift(dft)

Nach der obigen Verarbeitung ist das Spektralbild nur noch ein Wert, der aus Realteil und Imaginärteil besteht. Um es anzuzeigen, ist eine weitere Verarbeitung erforderlich.

函数 cv2.magnitude()可以计算频谱信息的幅度. Die Syntax dieser Funktion lautet:

Rückgabewert = cv2.magnitude (Parameter 1, Parameter 2)

Die beiden Parameter in der Formel haben folgende Bedeutung:

  • Parameter 1: Der x-Koordinatenwert vom Gleitkommatyp, also der Realteil.
  • Parameter 2: Der Gleitkomma-y-Koordinatenwert, also der Imaginärteil, der die gleiche Größe wie Parameter 1 haben muss (die Größe des Werts, nicht die Größe des Werts).

Der Rückgabewert der Funktion cv2.magnitude() ist die Quadratwurzel der Summe der Quadrate von Parameter 1 und Parameter 2, die Formel lautet:

Fügen Sie hier eine Bildbeschreibung ein
In der Formel repräsentiert I das Originalbild und dst das Zielbild.

Nachdem die Größe der Spektrumsinformationen ermittelt wurde, ist es normalerweise erforderlich, den Größenwert weiter umzuwandeln, um die Spektrumsinformationen in Form eines Bildes anzuzeigen. Einfach ausgedrückt ist es notwendig, den Amplitudenwert dem Graustufenraum [0, 255] des Graustufenbildes zuzuordnen, damit er in Form eines Graustufenbildes angezeigt werden kann.

Die hier verwendete Formel lautet:

Ergebnis = 20*np.log(cv2.magnitude(Realteil, Imaginärteil))

Das Folgende ist eine Fourier-Transformation eines Bildes, um den Lesern die Beobachtung der obigen Verarbeitung zu erleichtern. Der folgende Code führt eine Fourier-Transformation für das Bild „lena“ durch, berechnet den Größenwert und normalisiert den Größenwert:

import numpy as np
import cv2
img = cv2.imread('lena.png',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
print(dft)
dftShift = np.fft.fftshift(dft)
print(dftShift)
result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1]))
print(result)

Die ermittelten Wertebereiche sind jeweils in Abb. 14-14 dargestellt. In:

  • Die Abbildung links zeigt den von der Funktion cv2.dft() erhaltenen Spektralwert, der sich aus Real- und Imaginärteilen zusammensetzt.
  • Die mittlere Abbildung zeigt die von der Funktion cv2.magnitude() berechneten Spektralgrößenwerte, die nicht im Standardbild-Graustufenraum liegen [0, 255].
  • Die Abbildung rechts zeigt das Ergebnis einer weiteren Normalisierung des durch die Funktion cv2.magnitude() berechneten spektralen Magnitudenwerts, wobei der Wertebereich nun in [0, 255] liegt.

Fügen Sie hier eine Bildbeschreibung ein

Beispiel: Verwenden Sie die OpenCV-Funktion, um eine Fourier-Transformation an einem Bild durchzuführen und seine Spektralinformationen anzuzeigen

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('lena.png',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1]))
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(result, cmap = 'gray')
plt.title('result'), plt.axis('off')
plt.show()

Operationsergebnis:

  • Das linke Bild ist das Originalbild.
  • Das Bild rechts ist ein Spektrumbild, das das Ergebnis der Verwendung der Funktion np.fft.fftshift() ist, um die Nullfrequenzkomponente in die Mitte des Spektrumbildes zu verschieben.
    Fügen Sie hier eine Bildbeschreibung ein

Implementieren Sie die inverse Fourier-Transformation

Verwenden Sie in OpenCV 函数 cv2.idft()实现逆傅里叶变换, diese Funktion ist
die Umkehrfunktion der Fourier-Transformationsfunktion cv2.dft(). Sein Syntaxformat ist:

Rückgabeergebnis = cv2.idft (Originaldaten)

Nach der Fourier-Transformation eines Bildes wird die Nullfrequenzkomponente normalerweise in die Mitte des Spektralbildes verschoben. Wenn die Nullfrequenzkomponente mithilfe der Funktion numpy.fft.fftshift() verschoben wird , sollte die Funktion numpy.fft.ifftshift() verwendet werden, um die Nullfrequenzkomponente an ihrer ursprünglichen Position
vor der inversen Fourier-Transformation wiederherzustellen.

Beachten Sie außerdem, dass der resultierende Wert nach der inversen Fourier-Transformation immer noch eine komplexe Zahl ist und
seine Größe mit der Funktion cv2.magnitude() berechnet werden muss.

Beispiel: Verwenden Sie die OpenCV-Funktion, um eine Fourier-Transformation und eine inverse Fourier-Transformation für das Bild durchzuführen und das Originalbild und das nach der inversen Fourier-Transformation erhaltene Bild anzuzeigen.

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('lena.png',0)
#对图像进行傅里叶变换
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
#将低频部分移动到图像中心
dftShift = np.fft.fftshift(dft)
#将复数变化成实数
ishift = np.fft.ifftshift(dftShift)
#将傅里叶变换的结果进行反变换
iImg = cv2.idft(ishift)

#取绝对值,取对数的目的为了将数据变化到较小的范围(比如0-255,并显示,结果是复数
iImg= cv2.magnitude(iImg[:,:,0],iImg[:,:,1])
print(iImg.shape)
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('original'), plt.axis('off')
plt.subplot(122),plt.imshow(iImg, cmap = 'gray')
plt.title('inverse'), plt.axis('off')
plt.show()

Operationsergebnis:

Fügen Sie hier eine Bildbeschreibung ein
Das Bild rechts ist das Bild, das nach der Durchführung einer Fourier-Transformation und einer inversen Fourier-Transformation am Originalbild img erhalten wurde.

Ich denke du magst

Origin blog.csdn.net/hai411741962/article/details/132213252
Empfohlen
Rangfolge