Javascool floutage probleme programme

Résolu/Fermé
chisukiwi - Modifié par KX le 29/05/2016 à 19:38
 chisukiwi - 29 mai 2016 à 23:11
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
29 mai 2016 à 20:01
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
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
29 mai 2016 à 20:48
"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
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
29 mai 2016 à 22:43
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
jai finalement reussi merci beaucoup pour ton aide !
0