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.