Wenden Sie geometrische Transformationen auf Bilder in MATLAB an
In diesem Tutorial wird die Anwendung der geometrischen Transformation auf ein Bild mit der Funktion imwarp()
in MATLAB erläutert.
Wenden Sie geometrische Transformationen auf Bilder in MATLAB an
Geometrische Transformation transformiert Bilder gemäß unseren Anforderungen wie Drehen, Ändern der Größe und Scheren von Bildern. Wir können die Funktion imwarp()
in MATLAB verwenden, um eine geometrische Transformation auf ein Bild anzuwenden.
Ein Bild besteht aus Pixeln, die an bestimmten Stellen platziert sind. Die Funktion imwrap()
ändert die Position von Pixeln entsprechend dem gegebenen Transformationsobjekt.
Wenn wir beispielsweise ein Bild vertikal spiegeln möchten, müssen wir nur die Position der im Bild vorhandenen Pixel ändern. Die oberste Pixelreihe wird mit der letzten im gegebenen Bild vorhandenen Pixelreihe ausgetauscht.
Die grundlegende Syntax der Funktion imwarp()
ist unten angegeben.
output_image = imwarp(input_image, geo_tran);
Wir können die obige Syntax verwenden, um eine gegebene geometrische Transformation geo_tran
auf ein Eingabebild input_image
anzuwenden, und das Ergebnis wird in output_image
gespeichert. Das Eingabebild kann ein numerisches, logisches oder kategoriales Bild sein.
Wir können ein geometrisches 2D-Transformationsobjekt oder eine Matrix mit der Funktion affine2d()
von MATLAB erstellen. Wir müssen eine 3-mal-3-Matrix in der Funktion affine2d()
definieren, um das Transformationsobjekt zu erstellen, und es in die Funktion imwarp()
übergeben, um es auf das gegebene Bild anzuwenden.
Verwenden wir beispielsweise das bereits in MATLAB gespeicherte Kamerabild und wenden eine geometrische Transformation mit der Funktion imwarp()
an.
Siehe Code unten.
clc
Img = imread('cameraman.tif');
imshow(Img)
gform = affine2d([1 0 0; .5 1 0; 1 0 1])
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)
Ausgang:
In der obigen Ausgabe können wir sehen, dass das Bild auf der rechten Seite geändert wurde und die einzige Änderung in der Position der Pixel besteht. Wir können auch die Transformationsmatrix entsprechend dem gegebenen Bild und der Art der Ausgabe, die wir von der Funktion erhalten möchten, ändern.
Überprüfen Sie diesen Link für weitere Details über die Funktion affine2d()
. Wenn wir eine geometrische Transformationsmatrix für ein 3D-Bild erstellen möchten, können wir die Funktion affine3d()
von MATLAB verwenden.
Bei affine3d()
sollte die Eingabematrix eine Größe von 4-mal-4 haben. Überprüfen Sie diesen Link für weitere Details über die Funktion affine3d()
.
Dreht ein Bild um N Grad
Um ein Bild zu drehen, können wir die Funktion randomaffine2d()
verwenden, um ein randomisiertes affines 2D-Transformationsobjekt zu erstellen, und es dann zusammen mit dem gegebenen Bild innerhalb der Funktion imwarp()
übergeben, um die Transformation auf das gegebene Bild anzuwenden. Wir können das Argument Rotation
der Funktion randomaffine2d()
verwenden, und danach müssen wir den Winkel oder Bereich des Winkels festlegen, um eine Transformation zum Drehen des gegebenen Bildes zu erstellen.
Lassen Sie uns beispielsweise das obige Bild um 45 Grad drehen. Siehe Code unten.
clc
Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)
Ausgang:
Im obigen Code haben wir den gleichen Wert von 45 zweimal angewendet, aber wir können auch einen Bereich angeben, und die Funktion wählt einen zufälligen Winkel aus dem Bereich aus, um das Transformationsobjekt zu erstellen.
Spiegeln, skalieren, scheren und übersetzen Sie ein Bild
Um die x- oder y-Achsen-Reflexion des Bildes zu erzeugen, können wir die Argumente XReflection
und YReflection
verwenden. Nach der Definition des Argumentnamens müssen wir true
übergeben, da diese Argumente standardmäßig auf false
gesetzt sind.
Das Reflexionsargument dreht das Bild horizontal oder vertikal. Wir können ein Bild auch scheren, was bedeutet, dass wir einen Teil des Bildes in eine Richtung und den anderen Teil in die entgegengesetzte Richtung bewegen.
Wir können mit den Argumenten XShear
und YShear
auch eine x- oder y-Achsen-Scherung anwenden, und danach müssen wir den Wert als 2-Element-Vektor festlegen. Wir können das Bild auch mit dem scale
-Argument der randomaffine2d()
-Funktion skalieren.
Wenn der Skalierungswert kleiner als 1 ist, wird die Bildgröße verringert; wenn es größer als 1 ist, wird es erhöht. Wir können ein Bild auch auf der x- oder y-Achse mit den Argumenten XTranslation
und YTranslation
verschieben, und danach müssen wir die 2-Element-Matrix für die Verschiebung definieren.
Lassen Sie uns beispielsweise die oben genannten Eigenschaften ändern und das Ergebnis anzeigen. Siehe Code unten.
clc
clear
Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('XReflection',true,'Scale',[1.2 1.2],'XShear',[15 15],'XTranslation',[20 20]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)
Ausgang:
Wir können jede Eigenschaft separat ändern, um das Ergebnis auf dem Originalbild zu sehen. Überprüfen Sie diesen Link für weitere Details über die Funktion randomaffine2d()
.
Im Fall eines 3D-Bildes können wir die Funktion randomaffine3d()
verwenden, um ein 3D-Transformationsobjekt zu erstellen, und wir können seine Eigenschaften auf die gleiche Weise ändern, wie wir die Eigenschaften der Funktion randomaffine2d()
geändert haben. Überprüfen Sie diesen Link für weitere Details über die Funktion randomaffine3d()
.
Legen Sie Kanten, Ansicht und Begrenzungsstil des Ausgabebilds fest
Wir können auch die Eigenschaften der Funktion imwarp()
ändern, wie die Interpolationsmethode, die standardmäßig auf nächste
eingestellt ist, und wir können sie auf linear
oder kubisch
ändern. In einigen Fällen sind die Kanten des Ausgabebildes nicht glatt, aber wir können das Argument SmoothEdges
innerhalb der Funktion imwarp()
verwenden, um glatte Kanten zu erhalten.
Wir können auch die Ausgabeansicht des Ausgabebildes mit dem Argument OutputView
ändern, und danach müssen wir ein mit der Funktion affineOutputView()
erstelltes Ansichtsobjekt übergeben. Das erste Argument der Funktion affineOutputView()
ist die Grösse des Eingabebildes und das zweite Argument das Transformationsobjekt.
Das dritte optionale Argument BoundingStyle
wird verwendet, um den Begrenzungsstil des Ausgabebildes festzulegen. Es stehen drei Arten von Stilen zur Verfügung: CenterOutput
, FollowOutput
und SameAsInput
-Stil.
Ändern wir zum Beispiel die Eigenschaften der oben erwähnten Funktion imwarp()
. Siehe Code unten.
clc
clear
Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Output_view = affineOutputView(size(Img),gform,'BoundsStyle','CenterOutput');
Jmg = imwarp(Img,gform,'SmoothEdges',true,'OutputView',Output_view);
figure
imshow(Jmg)
Ausgang:
Das rechte Bild (Ausgabebild) hat die gleiche Größe wie das Eingabebild, da wir das Argument glatte Kanten verwendet haben. Wenn wir das Argument glatte Kanten nicht verwenden, nimmt die Größe des Ausgabebildes zu, was auch im ersten Beispiel der Drehung des Bildes gezeigt wird.
Überprüfen Sie diesen Link(https://www.mathworks.com/help/images/ref/affineoutputview.html) für weitere Details über die Funktion affineOutputView()
. Überprüfen Sie diesen Link(https://www.mathworks.com/help/images/ref/affineoutputview.html) für weitere Details über die Funktion imwarp()
.