Bild Array drehen



  • Hallo, ich habe hier die Intensitätswerte einer Farbbild-Kamera als 1D-Array vorliegen. Außerdem sind die Farbbbild informationen ebenfalls in dem Array abgespeichert.

    Normalerweise, wenn man keine Farbinformationen vorliegen hat, kann man ja zB ein 1024*768 Bild speichern als Array, indem man den Index einführt,

    index= 1024*CCDX+CCDY

    in welchem nun x und y zusammen eindeutig definiert sind. Nun bekommt jeder pixel ebenfalls die Farbinformation r,g,b dazu sodass mein Bild effektiv 3072*768 Einträge hat. Der index 0 zB wäre rot, 1 grün, 2 blau etc.

    Nun soll ich das ganze Bild drehen. Ich habe dafür die Vorschrift:

    indexROT= index%3072*768+(index-index%3072)/3072.

    Allerdings habe ich mir diese Vorschrift anhand ein paar Beispielen veranschaulicht, und habe dabei bemerkt, dass es sich bei der Vorschrift um eine Spiegelung in der horizontale+drehung in gegen-uhrzeigersinn handelt.

    Meine Wichtigste Frage:

    Bei einer Drehung einer Arrays darf der 0-index nie auf den 0-indexROT abgebildet werden, oder?

    Die Idee war Anfangs einfach x für y zu ersetzen, und y für x. Anschließend wurde wieder diesselbe Definition index= index%3072*768+(index-index%3072)/3072. verwendet.

    Wenn sich jemand mit sowas auskennt, schreibt mir bitte ob meine Abbildung die übliche ist für Rotationen oder nicht.

    Viele Grüße,

    beinando



  • Ja, bei einer Drehung nach rechts wird index 1024*(768-1) auf 0 abgebildet, bei einer Drehung nach links index 1023.



  • sorry, es muss

    index= 1024*CCDY+CCDX

    und nicht

    index= 1024*CCDX+CCDY

    heißen.

    Gruß beinando



  • Btw, wenn's dir nicht gerade um Effizienz geht könnte es auch einfach so gehn (nicht getestet):

    void rotateRight(float* p, int w, int h, int bpp)
    {
    	float* buf = new float[w*h*bpp];
    
    	int x0 = 0, y0 = h-1;
    	int posx = x0, posy = y0;
    	for(int y = 0; y < w; y++)
    	{
    		for(int x = 0; x < h; x++)
    		{
    			int srcPos = posy*w + posx*bpp;
    			int dstPos = y*h + x*bpp
    			for(int i = 0; i < bpp; i++)
    					buf[dstPos+i] = p[srcPos+i];
    			posy--;
    			if(posy < 0)
    			{
    				posy = y0;
    				posx++;
    			}
    		}
    	}
    
    	memcpy(p, buf, w*h*bpp);
    }
    

    Idee dazu: Wenn man das Bild nach rechts drehen will rastert man es von links unten nach rechts oben.



  • beinando schrieb:

    Bei einer Drehung einer Arrays darf der 0-index nie auf den 0-indexROT abgebildet werden, oder?

    Wieso nicht? Wenn du zwei Punkte A und B nimmst, kann man unendlich viele Rotationen finden, die A auf B abbilden. Die Mathematische Erklaerung dafuer ist, das es unendlich viele Kreise gibt, die durch A und B gehen.



  • Ich denke er bezog sich dabei auf eine 90-Grad Rotation im oder entgegen des Uhrzeigersinns. 🙂



  • Auch mit dieser Einschraenkung findet man eine solche Rotation.


Anmelden zum Antworten