Bild im Zentrum spiegeln

Kirby.exe

Top Contributor
Ich soll einen "Operator" schreiben welcher ein Bild im Zentrum punktspiegelt. Ich verstehe jedoch nicht ganz wie ich vorgehen könnte.

Ich hätte mir jetzt gedacht, dass ich mir Länge und Breite des Bildes hole und am Punkt x= laenge/2, y = breite/2 spiegele.

BTW die Bibliothek heißt Mitobo xD
 
Also, ohne die Library zu kennen, kannst du dir ja eine Funktion herleiten, die dir ausgehend von einem Zielpixel, den du berechnen willst, den zugehörigen gespiegelten Quellpixel ermittelt:


Wenn wir also eine Funktion "R" auf den Pixeln definieren, die bei einer Punktspiegelung/Rotation um den Pivotpunkt (Cx, Cy) für jeden Pixel (x, y) des Ergebnisbildes definiert, von welchem Pixel des Quellbildes er "kommt", dann:

Code:
  R(x, y, Cx, Cy)
= P(x+(Cx-x)*2, y+(Cy-y)*2)
= P(2Cx-x, 2Cy-y)

Wenn wir für (Cx, Cy) dann einfach das Zentrum (width/2, height/2) des Bildes einsetzen, ergibt sich:
Rc(x, y) = P(width-x, height-y)
 
Ohne großes Verständniss hiervon zu haben xD Könnte es sein dass die Information in einem "2D" Byte Array gespeichert werden und ich im Grunde einfach nur ein neues Byte Array erzeugen muss in die Werte so hinein kopieren, dass eine Punkspiegelung vorliegt?
 
Könnte es sein dass die Information in einem "2D" Byte Array gespeichert werden und ich im Grunde einfach nur ein neues Byte Array erzeugen muss in die Werte so hinein kopieren, dass eine Punkspiegelung vorliegt?
Vermutlich ja. Aber keine Ahnung, welche wilden Abstraktionsschichten die Library noch dadrauflegt. Im Zweifel hast du vielleicht nur einen abstrakten Datentyp mit Operationen wie "hole Pixel bei (x,y)" und "schreibe Pixel (x,y)".
 
Also was Du genau machen musst, wird dir hier kaum jemand sagen können fürchte ich, denn die Chance, dass jemand schon mit Mitobo gearbeitet hat, ist sehr klein.

Aber ehe man auch nur eine Zeile Code schreiben kann, sollte man das Environment und die Aufgabe genau verstanden haben. Der Schritt scheinst du (fast) komplett übergangen zu haben...

Wenn ich mir MiToBo ansehe, dannfinde ich da auf GitHub diverse Dinge. So bin ich z.B. über Filter Implementierungen gestolpert (anders kann man es nicht ausdrücken - ich habe da einfach mal im Code rumgeklickt) und die Filter überschreiben MTBOperator. Also wenn da irgendwie von Operator die Rede ist, dann ist das evtl., was du dir ansehen solltest...


Die eigene Image Implementierung mag de.unihalle.informatik.MiToBo.core.datatypes.images.MTBImage sein... aber das habe ich mir noch nicht im Detail angesehen. Das ist etwas, das Du Dir im Detail ansehen solltest um zu verstehen, was dieses Tool (Es ist keine Bibliothek - es ist ein ganzes Toolset so wie ich es sehe) überhaupt macht.
 
Also ich wühle parallel dort in der Docu herum und habe auch bereits ein "template" bekommen:

Java:
/*
 * This file is part of MiToBo, the Microscope Image Analysis Toolbox.
 *
 * Copyright (C) 2010 - 2020
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Fore more information on MiToBo, visit
 *
 *    http://www.informatik.uni-halle.de/mitobo/
 *
 */

package einfBV.serie_00.aufgabe_2;

import de.unihalle.informatik.Alida.exceptions.ALDOperatorException;
import de.unihalle.informatik.Alida.annotations.ALDAOperator;
import de.unihalle.informatik.Alida.annotations.ALDAOperator.Level;
import de.unihalle.informatik.Alida.annotations.Parameter;
import de.unihalle.informatik.MiToBo.core.datatypes.images.*;
import de.unihalle.informatik.MiToBo.core.operator.*;

/**
 * Operator to invert and/or flip an image.
 */

// This annotation is necessary for MiToBo to automatically index the operator.
@ALDAOperator(genericExecutionMode=ALDAOperator.ExecutionMode.ALL,
        level=Level.APPLICATION)
public class MiToBoTransformImage extends MTBOperator {

    /**
     * 8-bit input image.
     */
    @Parameter( label= "Input Image", required = true, dataIOOrder = 0,
        direction = Parameter.Direction.IN, description = "Input image.")
    private MTBImageByte inImg = null;

    /**
     * Flag to invert the image.
     */
    @Parameter( label= "Invert image", required = true, dataIOOrder = 1,
        direction = Parameter.Direction.IN, description = "Flag for inverting image.")
    private boolean doInvert = true;

    /**
     * Flag to flip the image.
     */
    @Parameter( label= "Flip image at center", required = true, dataIOOrder = 2,
        direction = Parameter.Direction.IN, description = "Flag for flipping.")
    private boolean doFlipping = true;

    /**
     * Contains inverted input image, if option is enabled.
     */
    @Parameter( label= "Inverted image", required = true,
            direction = Parameter.Direction.OUT, description = "Inverted image.")
    private MTBImageByte invertedImg = null;

    /**
     * Contains the flipped image, if option is enabled.
     */
    @Parameter( label= "Flipped image", required = true,
            direction = Parameter.Direction.OUT, description = "Flipped image.")
    private MTBImageByte flippedImg = null;

    /**
     * Default constructor, always required even if nothing happens here!
     *  @throws ALDOperatorException
     */
    public MiToBoTransformImage() throws ALDOperatorException {
        // nothing to do here
    }       

    /**
     * This method does the actual work and is mandatory.
     */
    @Override
    protected void operate() {
        if(this.doFlipping) {
            int x = this.inImg.getSizeX()/2;
            int y = this.inImg.getSizeY()/2;
            
        }
        
        if(this.doInvert) {
            
        }
        
        
    }
}

Der Type ist ziemlich sicher MTBImageByte
 
Wobei das ja nur speziellere Klassen sind von MTBImage und MTBImage bietet eine Funktionalität den Typ zu ändern...

Was mich etwas irritiert ist, dass da mit 5 Dimensionen gearbeitet wird? Du hast ja getValueInt / putValueInt - die könnte man ggf. nutzen um Punkt für Punkt alles durch zu gehen. Aber die 4te und 5. Dimension ist etwas irritierend. Die Methoden gibt es auch nur mit x,y,z aber da wird dann die aktuelle Z -Stack Koordinate genutzt ... Das erwähne ich nur, weil es da wohl etwas mehr gibt, was man bezüglich der Benutzung wissen sollte. Es gibt nicht nur das typische Bild mit x und y. Und das auch nicht nur in Layern - das ist noch auf 5d erweitert... Damit hat man da etwas, das man verstanden haben sollte. Evtl. ist es trivial und einiges wird einfach nicht genutzt oder kann ignoriert werden, aber man sollte verstehen, was da an Daten vorgehalten wird und was damit geschehen sollte ...

Spiegeln an einem Punkt bei einem 2D Bild wurde erläutert. Aber wie sieht es bei 3D aus? Wenn es einfach nur Layer sind die übereinander gelagert werden, dann ist es trivial: Alle Layer bleiben in der Reihenfolge und jeder Layer wird für sich gespiegelt. Bei einer 3D Ansicht wäre das aber falsch - dann wäre auch im 3D Bereich zu tauschen ...

Das wären da meine Gedanken, nach wenigen Minuten Code betrachten. Vielleicht hilft es ja etwas.
 
Prinzipiell ist die Idee richtig: Rotation um 180° um Punkt (cx, cy):

1. Translation um (-cx, -cy)
2. Skalierung (-1, -1) wie von dir vorgeschlagen
3. Translation um (cx, cy)

(wenn man in Koordinaten ausserhalb des Bildbereiches temporär arbeiten kann)
 
Update:

Ich habe es geschafft das Bild korrekt zu spiegeln. Nun hab ich ein gewisses Problem...Ich muss das geflippte Bild der Variable "flippedImg" zuweisen...Diese ist vom Typ MTBImageByte, mein Bild ist aber ein MTBImage. Durch einen cast würde es ein graustufen bild(8 Bit) werden. Das möchte ich ungern 🙂 Gibt es da einen Trick?
 

Neue Themen


Zurück
Oben