Wenden Sie geometrische Transformationen auf Bilder in MATLAB an

Ammar Ali 15 Februar 2024
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:

Transformation mit affine2d

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:

Bildrotation mit imwarp

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:

Ändernde Eigenschaften der Transformation

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:

Ändern der Eigenschaften von imwarp

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().

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Verwandter Artikel - MATLAB Image