2016-03-29 19 views
0

Ich habe einen Code geschrieben, um dieses Problem zu lösen.Flatindexed 2D Array - Spiegeln eines Bildes vertikal/horizontal

Ich habe ein Programm gegeben, um ein Bild, grau skaliert mit X11 zu zeichnen.

Ich wurde gebeten, eine Funktion zu schreiben, um das Bild horizontal/vertikal zu spiegeln.

Hier ist mein Code-Schnipsel

// flip the image, left-to-right, like in a mirror. 
void flip_horizontal(uint8_t array[], 
       unsigned int cols, 
       unsigned int rows) 
{ 

    int i; 
    int j; 
    for (i=0; i<rows;i++) 
    { 
    for (j=0; j<cols;j++) 
     { 
     array[rows*i+j]=array[rows*i+(cols-1-j)]; 
     } 
    } 
} 

// flip the image top-to-bottom. 
void flip_vertical(uint8_t array[], 
      unsigned int cols, 
      unsigned int rows) 
{ 

int i=0; 
int j=0; 
    for (i=0; i<rows;i++) 
    { 
    for (j=0; j<cols;j++) 
     { 
     array[rows*i+j]=array[rows*(rows-1-i)+j]; 
     } 
    } 
    return; 
} 

Das Problem, das ich habe, ist, ist, dass meine horizontale Funktion das Bild nur halb Flips, die andere Hälfte behält ihre ursprünglichen Werte zurück.

Meine vertikale Flip-Funktion ist auch ein Durcheinander und das erzeugte Bild sieht überhaupt nicht so aus, wie es sollte, also versuche ich zu debuggen, wo ich einen Fehler in der Logik zum Schreiben der Funktionen gemacht habe.

Ich verwende die Flat-Index-Methode für den Zugriff auf 2D-Array-Werte.

+0

In C '=' bedeutet nicht "swap". Und selbst wenn das der Fall war, hast du den klassischen "word reverse" -Brüll gemacht, die Buchstaben getauscht und sie wieder getauscht. –

+0

Flat-Index: 'Array [Zeilen * i + j]' -> 'Array [Spalten * i + j]' –

Antwort

-1
static uint8_t temp; 

void flip_horizontal(uint8_t array[], 
       unsigned int cols, 
       unsigned int rows) 
{ 

    int i; 
    int j; 
    for (i=0; i<rows/2;i++) 
    { 
    for (j=0; j<cols;j++) 
     { 
     temp=array[rows*i+j]; 
     array[rows*i+j]=array[rows*i+(cols-1-j)]; 
     array[rows*i+(cols-1-j)]=temp; 
     } 
    } 
} 

// flip the image top-to-bottom. 
void flip_vertical(uint8_t array[], 
      unsigned int cols, 
      unsigned int rows) 
{ 

int i=0; 
int j=0; 
    for (i=0; i<rows;i++) 
    { 
    for (j=0; j<cols/2;j++) 
     { 
     temp=array[rows*i+j]; 
     array[rows*i+j]=array[rows*(rows-1-i)+j]; 
     array[rows*(rows-1-i)+j]=temp; 
     } 
    } 
    return; 
} 

was habe Dieser Code könnte eine Menge Effizienzverbesserung, steht aber im Grunde ich getan, um die Anzahl der Male halbiert Sie Swap-Operationen zu tun, und ich habe eine temporäre Variable zu halten Daten, die während der Swap-Operation eingeführt.

+0

Sie haben den flachen Indexierungsfehler nicht korrigiert: 'array [rows * i + j]' -> 'array [Spalten * i + j]' –

2

In Ihrer horizontalen Spiegelung durchläuft die innere Schleife alle Spalten und weist dem Pixel seinen gespiegelten Wert zu. Nehmen wir an, Ihr äußerster linker Pixel ist 100 und der äußerste rechte ist 23. Nach einem Schritt wird ganz links zu 23. Nun, wenn es zum ganz rechten kommt, versucht es den ganz linken zu sehen, und Viola, Sie erhalten wieder 23. Der Wert 100 ist bereits verloren. Deshalb ändert sich die rechte Hälfte des Bildes nicht.

Das gleiche Problem für vertikale Flip.

Auch Sie haben Indexprobleme. Ich nehme an, cols bedeutet Anzahl der Spalten und Zeilen bedeutet Anzahl der Zeilen. Unter der Annahme, dass das Bild in Reihe gespeichert ist, was bedeutet, dass das Layout in dem flachen Array Zeile um Zeile ist, wie in unserer Lesereihenfolge, dann ist das Pixel in Zeile i und Spalte j bei Index Spalten * i + j statt Zeilen * i + j. Unintuitiv, Spalten ist die Anzahl der Spalten und gleichzeitig die Größe einer Zeile. Happy debugging :)

Verwandte Themen