bonjour, je cherche à remplir un BufferedImage ( en java ) par un tableau de pixel (2d) donné et convertir le BufferedImage sur un fichier par exemple (image.jpg), s'il y a quelqu'un qui peut m'aider, merci d'avance.
Version imprimable
bonjour, je cherche à remplir un BufferedImage ( en java ) par un tableau de pixel (2d) donné et convertir le BufferedImage sur un fichier par exemple (image.jpg), s'il y a quelqu'un qui peut m'aider, merci d'avance.
Tout dépend de ce qu'il y a dans ton tableau 2D (int, Color, autre). :P
D'une manière générale, un BufferedImage RGB utilise un Raster qui est composé d'un buffer linéaire d'entiers (un tableau 1D de int au format rgb). Il faut donc convertir ton tableau 2D et tableau 1D d'entiers:
Je vais supposer un tableau 2D d'objets "java.awt.Color":
Code:
1
2
3
4
5
6
7
8
9
10
11 public static BufferedImage ColorArrayToBufferedImage(Color[][] data, int w,int h) { BufferedImage bimg = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB); int[] linearbuffer = new int[w*h]; int i=0; for(int y=0;y<h;y++) for(int x=0;x<w;x++) linearbuffer[i++]=data[x][y].getRGB(); bimg.getRaster().setDataElements(0, 0, w, h, linearbuffer); return bimg; }
merci, mais c'est pas exactement ce que je cherche, pour bien comprendre ma questionne :
HarrisFast hs=new HarrisFast(tab,im.getWidth(),im.getHeight());
tab2=hs.filter(3, 1.2, 32, 8);
je pense que vous avez compris (L'histoire des points d'interêt ), le probleme c'est comment rendre le tab2 dans un buffer pour qu'ensuite je peux l'afficher ou enregistrer dans un fichier jpeg
Ah. Dans ce cas le tableau 2D contient des niveaux de gris. Donc une modification s'impose:
Code:
1
2
3
4
5
6
7
8
9
10
11 public static BufferedImage GrayLevelArrayToBufferedImage(int[][] data, int w,int h) { BufferedImage bimg = new BufferedImage(w,h,BufferedImage.TYPE_BYTE_GRAY); byte[] linearbuffer = new byte[w*h]; int i=0; for(int y=0;y<h;y++) for(int x=0;x<w;x++) linearbuffer[i++]=(byte)data[x][y]; bimg.getRaster().setDataElements(0, 0, w, h, linearbuffer); return bimg; }
Sinon, pour tester le filtre HarrisFast, tu peux télécharger le programme de Millie. :king:
Merci Beaucoup pseudocode :D
C'est ce que je cherche.
Je l'ai testé sur une image, il est trés efficace.
Il me reste une chose, comment connaitre la position des points d'interêt finals parceque j'en ai besoin pour faire ensuite une comparaison avec d'autres images
Il me reste une chose, comment connaitre la position des points d'interêt finals parceque j'en ai besoin pour faire ensuite une comparaison avec d'autres images
Tu peux modifier le code de la méthode "filter" pour retourner la liste des coins plutot qu'une BufferedImage:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 public List<int[]> filter(int window, double sigma, int minMeasure, int minDistance) { // precompute derivatives computeDerivatives(window, sigma); // Harris measure map int[][] harrismap = computeHarrisMap(); // for each pixel in the hmap, keep the local maxima for (int y=1; y<height-1; y++) { for (int x=1; x<width-1; x++) { int h = harrismap[x][y]; if (h<minMeasure) continue; if (!isSpatialMaxima(harrismap, x, y)) continue; // add the corner to the list corners.add( new int[]{x,y,h} ); } } // remove corners to close to each other (keep the highest measure) Iterator<int[]> iter = corners.iterator(); while(iter.hasNext()) { int[] p = iter.next(); for(int[] n:corners) { if (n==p) continue; int dist = (int)Math.sqrt( (p[0]-n[0])*(p[0]-n[0])+(p[1]-n[1])*(p[1]-n[1]) ); if( dist>minDistance) continue; if (n[2]<p[2]) continue; iter.remove(); break; } } return corners; }
Tu pourra toujours construire toi même la BufferedImage avec les croix en overlay, si tu en as besoin.
Un merci pour vous pseudocode.