Problème de Parcours et temps d'exécution énorme
Bonjour à tous
Donc voilà j'ai un gros souci avec ImageJ, j'ai une très grande image (321*481) sur la quel je fais un traitement compliqué où il y a 4 boucles imbriquées.
le traitement se répète 23839668801 fois 8O (càd chaque pixel avec les autres pixels de l'image). le traitement consiste dans le calcul d'un noyau gaussien, au départ je croyais que c'été l'exponentiel qui était groumant en temps mais je viens de l'enlever (pour voir) et c'est toujours le même problème :cry:, j'ai conclu que c'été le parcours. le calcul me prend presque 1heure.:mur:
Voici le code:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| import ij.*;
import ij.process.*;
import ij.gui.*;
import java.awt.*;
import ij.plugin.filter.*;
import java.util.*;
import ij.measure.ResultsTable;
public class pgm_ implements PlugInFilter {
ImagePlus imp;
public int setup(String arg, ImagePlus imp) {
this.imp = imp;
return DOES_ALL;
}
public double distance(double r,double g,double b, double r1, double g1,double b1){
double res;
res=Math.sqrt((r-r1)*(r-r1)+(g-g1)*(g-g1)+(b-b1)*(b-b1));
return res;
}
/////////////////////////////// Ma
public double Ma(int [] pixels){
int i,j,a;
double Ma=0,var=0;
double sigma=0.2;
double sig=sigma*sigma;
double var1=1/(3.14159265358979*0.08);
double v,noyau;
for(i=0; i<pixels.length; i++){
for(a=0; a<pixels.length; a++){
int c = pixels[a];
double r = (c & 0xff0000)>>16;
double g = (c & 0x00ff00)>>8;
double b = (c & 0x0000ff);
int c1 = pixels[i];
double r1 = (c1 & 0xff0000)>>16;
double g1 = (c1 & 0x00ff00)>>8;
double b1 = (c1 & 0x0000ff);
v=distance(r1/255,g1/255,b1/255,r/255,g/255,b/255);
var=Math.exp((v*v)/(-0.08));
noyau= var1*var;
Ma=Ma+noyau;
}
}
return Ma;
}
/////////////////Ma
public void run(ImageProcessor ip) {
ip.invert();
imp.updateAndDraw();
IJ.wait(500);
ip.invert();
imp.updateAndDraw();
int nbrows=ip.getHeight();
int nbcols=ip.getWidth();
int[] pixels = (int[]) ip.getPixels();
int k=4;
/////////////////Ma
double Ma=Ma(pixels);
IJ.showMessage("Ma= "+Ma);
}
} |
Je voulais savoir s'il y a un moyen pour mieux parcourir l'image ou des suggestions pour réduire ce temps de calcule.
Merci