Aiutami a capire come indicizzare un pixel in un'immagine

0

Ho dato un'occhiata al codice per l'implementazione di questo documento Segmentazione basata su grafici di Pedro F. Felzenszwalb

Ma non ho capito come nel codice qui sotto che y * width + x è usato per costruire un grafico da un'immagine.

// build graph
edge *edges = new edge[width*height*4];
int num = 0;
for (y = 0; y < height; y++) {
    for ( x = 0; x < width; x++) {
        if (x < width-1) {
             edges[num].a = y * width + x;
             edges[num].b = y * width + (x+1);
             edges[num].w = diff(smooth_r, smooth_g, smooth_b, x, y, x+1, y);
             num++;
         }

         if (y < height-1) {
            edges[num].a = y * width + x;
            edges[num].b = (y+1) * width + x;
            edges[num].w = diff(smooth_r, smooth_g, smooth_b, x, y, x, y+1);
            num++;
         }

         if ((x < width-1) && (y < height-1)) {
            edges[num].a = y * width + x;
            edges[num].b = (y+1) * width + (x+1);
            edges[num].w = diff(smooth_r, smooth_g, smooth_b, x, y, x+1, y+1);
            num++;
         }

         if ((x < width-1) && (y > 0)) {
            edges[num].a = y * width + x;
            edges[num].b = (y-1) * width + (x+1);
            edges[num].w = diff(smooth_r, smooth_g, smooth_b, x, y, x+1, y-1);
            num++;
         }
     }
}
    
posta user2350469 25.05.2013 - 12:39
fonte

2 risposte

3

Una matrice 2D può essere memorizzata in un vettore 1D come una sequenza di righe consecutive a larghezza fissa, e la formula per accedere alla posizione (x, y) è y*width + x .

Ecco un esempio visivo. Supponiamo di avere una matrice 3x3 riempita con 0 e una $ alla posizione (1, 2) (che è la prima colonna, seconda la seconda, utilizzando indici basati su 0 ). Puoi memorizzarlo come un vettore 1D come segue:

[0 0 0 0 0 0 0 $ 0]

E qui è visivamente ri-organizzato per avere un senso come una matrice 3x3:

          y
 [0 0 0   0
  0 0 0   1
  0 $ 0]  2

x 0 1 2   

Poiché si tratta di un vettore 1D (vedere la prima figura), è necessario un singolo indice per ottenere il valore $ . Ma poiché la pensiamo come una matrice 2D, tutto ciò che abbiamo è la posizione (1, 2) . Abbiamo bisogno di una formula per convertirla in un singolo indice.

Questa formula è y*width + x , come hai visto. Significa approssimativamente " y è il numero di righe complete che devo saltare, prima di passare alla colonna corretta usando x ". Notare la formula come scritto funziona perché stiamo usando indici basati su 0, altrimenti richiede modifiche minori.

Quindi, in questo esempio, y = 2 , x = 1 e width = 3 :

2 * 3 + 1 = 7

E l'indice 7 del nostro vettore originale [0 0 0 0 0 0 0 $ 0] ha il valore $ che volevamo. (Anche in questo caso, nota 7 è un indice a base zero).

    
risposta data 25.05.2013 - 18:54
fonte
1

Quando leggi un file immagine, è una serie lineare di pixel. Facciamo un esempio. Supponi di avere un'immagine 32x32. Ciò si traduce in una serie di 1024 punti. Per ottenere l'indice lineare del pixel in y=4 e x=16 , utilizzerai la formula y * witdth + x , che in questo caso è 4 * 32 + 16 = 144

    
risposta data 25.05.2013 - 18:04
fonte

Leggi altre domande sui tag