Javascool floutage probleme programme

Résolu
chisukiwi -  
 chisukiwi -
Bonjour,
je suis un élève de terminal s si avec option isn , je dois faire un programme pour dans 3 j , mon programme a pour but de flouter , c'est du Javascool voici ce que jai fais
int x;

int y;


void filtre() {
   int w = getWidth();
   int h = getHeight();
   println(h);
   println(w);
   int xtab[][][] = new int[w][h][3];
   for (int y = 0; y < h; y ++) for (int x = 0; x < w; x ++) xtab[x][y] = getPixelColor(x, y);
   for (int j = 0; j < h; j ++) for (int i = 0; i < w; i ++) // filtrePixel(i,j);
    {
      int red = xtab[i][j][0];
      int green = xtab[i][j][1];
      int blue = xtab[i][j][2];
      setPixel(i, j, red/4, green/4, blue/4);
   }
}

void main() {
   reset(500,500,false);
   load("http://2.bp.blogspot.com/_gx7OZdt7Uhs/TRtrw4MtylI/AAAAAAAAFlE/lS_Nn4lVSpE/s1600/desktop+wallpaper+mountain.jpg");
   filtre();
}



sa ne floute que la parti superieur droit , la professeur na pas réussis a m'aider du coup je me tourne vers vous

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

À l'avenir merci de préciser quelle proglet de Java's Cool tu utilises.
Ici je vais considérer que tu utilises codagePixels.

Ton problème est lié au système de coordonnées des pixels, dont je remets ci-dessous le schéma explicatif :
Les pixels vont de -width à +width en largeur et de -height à +height en hauteur, donc quand tu fais tes boucles de 0 à width et de 0 à height tu en oublies la moitié sur chaque dimension, ce qui explique pourquoi seul le quartier des x≥0, y≥0 est traité.

Remarque : le tableau xtab ne sert à rien, de plus il va te poser problème pour accéder aux x<0 et y<0, il vaut mieux t'en passer. Exemple :

for (int y = -h; y <= h; y++) {
for (int x = -w; x <= w; x++) {
    int[] rgb = getPixelColor(x, y);
    int red = rgb[0];
    int green = rgb[1];
    int blue = rgb[2];
    setPixel(x, y, red/4, green/4, blue/4);
}
}

Remarque : ce que tu fais ce n'est pas du floutage, tu assombris les couleurs mais l'image est toujours aussi net qu'avant.
0
chisukiwi
 
que devrais-je faire alors , ( c'est mon professeur qui ma donner le programme car elle n'arrivais pas a faire le traitement prosperisation) flouter l'image ne revien pas a divisé les couleur ?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
"que devrais-je faire alors"
Déjà avec le code que je t'ai donné tu règles ton problème de départ, le traitement se fera bien sur l'intégralité de l'image, et non plus sur un quart?

"flouter l'image ne revien pas a divisé les couleur ?"
Si on raisonne dans ce sens, "déflouter" l'image reviendrait à multiplier les couleurs... c'est clairement insuffisant.
Tu pourrais d'ailleurs faire le test, d'abord tu divises puis tu multiplies, tu vas bien retomber sur la même image (plus ou moins), ça ne peut pas être du floutage.

Pour moi le flou cela correspond à une moyenne du pixel avec ses voisins.
Remarque : le choix des pixels choisis comme voisins et leur pondération respective dans le calcul de la moyenne donnera un flou plus ou moins pertinent.

Exemple :
c[x][y] = (4*c[x][y]+c[x-1][y]+c[x+1][y]+c[x][y-1]+c[x][y+1])/8

Avec c[x][y] la couleur (red, green ou blue) du pixel [x][y]
Attention :
1) au bord de l'image certains voisins n'existent pas
2) les voisins à considérer sont les pixels de l'image originale, n'utilise pas ceux que tu as déjà modifié au fur et à mesure de ta boucle.
0
chisukiwi
 
merci bien , voici ce que jai fais

// Fonction appliquée à chaque pixel
int filtrePixel(int i, int j) {
    return (getPixelColor(i, j) + getPixelColor(i + 1, j)+ getPixelColor(i, j + 1)+ getPixelColor(i - 1, j)+ getPixelColor(i, j - 1)) / 5;
}
// Boucle sur tous les pixels
void filtre() {
    for(int j = -getHeight() + 1; j <= getHeight() - 1; j = j + 1) {
        for(int i = -getWidth() + 1; i <= getWidth() - 1; i = i + 1) {
            setPixel(i, j, filtrePixel(i, j));
        }
    }
}

void main() {
    load("http://javascool.gforge.inria.fr/documents/sketchbook/codagePixels/doisneaubuffon.jpg");
    for(int n = 0; n < 5; n = n + 1) {
        filtre();
    }
}

je suis reparti du programme de base , c'est le programme floutage en noir et blanc parcontre il m'affiche une erreur concernant les "+" je n'st pas compris pourquoi

et voici un autre programme de base que la professeur ma envoyer pas plus tard que ya 10 minute

// la variable tab va stocker les niveaux de Rouge, Vert, Bleu de chaque pixel de l'image
int[][][] tab = new int[500][500][3];

void changerCouleurs(){
 for (int i=0;i<500;i++) 
     for (int j=0;j<500;j++){
      int r=tab[i][j][0];
      int g=tab[i][j][1];
   int b=tab[i][j][2];
      setPixel(i,j,g,b,r);
     }
}


void main() {
   reset(500, 500, false);
   // on affiche l'image dans la fenêtre
   load("http://ecoledecontes.etab.ac-lille.fr/files/2015/12/Tigre-blanc.jpg",false);  
   // on stocke les couleurs des pixels de l'image originale dans le tableau tab
   for (int i = 0; i < 500; i ++) 
    for (int j = 0; j < 500; j ++) 
     tab[i][j] = getPixelColor(i, j);

   
   changerCouleurs();
   
}

celui ci est pour inverser les couleur il fonctionne mais je ne vois pas la ou il fais le changement de couleur je penssais a fair une ligne de code
(getPixelColor(i, j) + getPixelColor(i + 1, j)+ getPixelColor(i, j + 1)+ getPixelColor(i - 1, j)+ getPixelColor(i, j - 1)) / 5;
car vous m'aviez dit que ce n'est qu'une moyenne de couleur entre les pixel , pouriez vous m'indiquer si je suis dans la bonne voie ?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
getPixelColor renvoie un tableau avec les trois couleurs rouge/vert/bleu c'est pour cela que tu ne peux pas faire les sommes dessus, par contre il faut faire ce calcul sur chacune des couleurs rouge/vert/bleu.

int[] rgb   = getPixelColor(x, y);
int[] rgb00 = getPixelColor(x-1, y-1);
int[] rgb01 = getPixelColor(x-1, y+1);
int[] rgb10 = getPixelColor(x+1, y-1);
int[] rgb11 = getPixelColor(x+1, y+1);
int red   = (rgb[0]+rgb00[0]+rgb01[0]+rgb10[0]+rgb11[0])/5;
int green = (rgb[1]+rgb00[1]+rgb01[1]+rgb10[1]+rgb11[1])/5;
int blue  = (rgb[2]+rgb00[2]+rgb01[2]+rgb10[2]+rgb11[2])/5;
setPixel(x,y,red,green,blue);

Remarque : ce code n'est pas utilisable tel quel, à cause de mon "attention 2)" de tout à l'heure. D'où l'utilité de copier les niveaux red/green/blue d'origine dans le tableau tab proposé dans le deuxième code.
0
chisukiwi
 
jai finalement reussi merci beaucoup pour ton aide !
0