/** * @param itr - tableau contenant les facteurs d'intérêt de l'image * @return un graphe représentant ce tableau */ public Graph verticalToGraph(int[][] itr) { int nbSommets = width * height + 2; int i, j; Graph g = new Graph(nbSommets); // sommet tout en haut for (j = 0; j < width; j++) g.addEdge(new Edge(0, j + 1, 0)); for (i = 0; i < height - 1; i++) { for (j = 0; j < width; j++) { // arête vers la gauche if (j > 0) { g.addEdge(new Edge(width * i + j + 1, width * (i + 1) + (j - 1) + 1, itr[i][j])); } // arête vers la droite if (j < width - 1) { g.addEdge(new Edge(width * i + j + 1, width * (i + 1) + (j + 1) + 1, itr[i][j])); } // arête centrale g.addEdge(new Edge(width * i + j + 1, width * (i + 1) + j + 1, itr[i][j])); } } // sommet tout en bas for (j = 0; j < width; j++) g.addEdge(new Edge(width * (height - 1) + j + 1, height * width + 1, itr[i][j])); return g; }
/** * @param itr - tableau contenant les facteurs d'intérêt de l'image * @return un graphe représentant ce tableau */ public Graph horizontalToGraph(int[][] itr) { int nbSommets = width * height + 2; int i, j; Graph g = new Graph(nbSommets); // sommet tout en haut for (j = 0; j < height; j++) g.addEdge(new Edge(0, j + 1, 0)); for (i = 0; i < width - 1; i++) { for (j = 0; j < height; j++) { // arête vers le haut if (j > 0) { g.addEdge(new Edge(height * i + j + 1, height * (i + 1) + j - 1 + 1, itr[j][i])); } // arête vers le bas if (j < height - 1) { g.addEdge(new Edge(height * i + j + 1, height * (i + 1) + j + 1 + 1, itr[j][i])); } // arête centrale g.addEdge(new Edge(height * i + j + 1, height * (i + 1) + j + 1, itr[j][i])); } } // sommet tout en bas for (j = 0; j < height; j++) g.addEdge(new Edge(height * (width - 1) + j + 1, height * width + 1, itr[j][i])); return g; }
/** * Graphe vertical pour l'algorithme de Suurballe * * @param itr - facteurs d'intérêts de l'image * @return - graphe vertical des facteurs d'intérêts */ public Graph verticalToGraph2(int[][] itr) { int h = (height - 2) * 2 + 2; int nbSommets = h * width + 2; int i, j; Graph g = new Graph(nbSommets); // sommet tout en haut for (j = 0; j < width; j++) g.addEdge(new Edge(0, j + 1, 0)); int iCourant = 0; // lignes centrales for (i = 0; i < h; i++) { if (i != h - 1) { if (i % 2 == 0) { for (j = 0; j < width; j++) { // arête vers la gauche if (j > 0) { g.addEdge(new Edge(i * width + j + 1, (i + 1) * width + j, itr[iCourant][j])); } // arête vers la droite if (j < width - 1) { g.addEdge(new Edge(i * width + j + 1, (i + 1) * width + j + 2, itr[iCourant][j])); } // arête centrale g.addEdge(new Edge(i * width + j + 1, (i + 1) * width + j + 1, itr[iCourant][j])); } iCourant++; } else { for (j = 0; j < width; j++) { g.addEdge(new Edge(i * width + j + 1, (i + 1) * width + j + 1, 0)); } } } } // derniere ligne for (j = (nbSommets - 1) - width; j < nbSommets - 1; j++) { int pos = j % this.width - 1; if (pos == -1) { pos = this.width - 1; } g.addEdge(new Edge(j, nbSommets - 1, itr[height - 1][pos])); } return g; }