CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Java] Flouter une partie d'une image

RLink
RLink
Niveau 14
01 décembre 2016 à 22:42:09

Bonjour à vous,
J'ai reçu un exercice en Java aujourd'hui, dont le but consiste à "Flouter " une imagette dans une image, je m'explique;

L'imagette est un carré/rectangle avec des nombres donnés dedans,
Je dois retrouver l'imagette dans une "Image " ( tableau 2D composé de chiffres )
Et ensuite la flouter ( Faire la somme des nombres dans l'imagette + un bout du carré lié à l'imagette, et diviser par le nombre de valeurs, en gros je fais la moyenne des valeurs ).

Le problème, c'est que nous avons un bout de code donné pour cela, donc pas moyen de refaire un code propre soi-même. Il faut modifier un code assez flou d'origine pour flouter l'imagette et ensuite afficher l'image entière, avec dedans l'imagette floutée.

Voici le code (Attention les yeux ):

public class TD5A {
public static void main(String[] args) {
int photo[][] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};
int imagette[][] = {{7,8,9},{12,13,14}};

System.out.println("image d'origine :");
affichageMat(photo);
System.out.println("imagette recherchée :");
affichageMat(imagette);
System.out.println("-> Nb d'imagette dans l'image: " + rechercheImagette(photo,imagette));
System.out.println("-> floutage de l'imagette :" );
int [][] tab2 = (floutage(imagette));
affichageMat(tab2);
System.out.println();
System.out.println("Maintenant le tableau fini: ");
System.out.println();
int [][] image = fusion(photo, imagette, tab2);
affichageMat(image);

}

public static void affichageMat( int[][] tab)
{
for (int i=0;i<tab.length;i++)
{
for (int j=0;j<tab[0].length;j++)
System.out.print(tab[i][j]+"\t");
System.out.println();
}

}

public static int[][] extractMat(int[][] image, int i, int j, int tailleLigne, int tailleColonne)
{
int[][] resu = new int[tailleLigne] [tailleColonne];
for(int ii=0;ii<tailleLigne;ii++)
for(int jj=0;jj<tailleColonne;jj++)
resu[ii][jj] = image[i+ii][jj+j];
return resu;
}

public static boolean testEgalite(int[][] m1, int[][]m2)
{
for(int i=0;i<m1.length;i++)
for (int j=0; j<m1[0].length;j++)
if (m1[i][j]!=m2[i][j])
return false;
return true;
}

public static int rechercheImagette(int[][] image, int[][] imagette)
{
int nb = 0;
for (int i=0; i<image.length-imagette.length+1; i++ )
for (int j=0; j<image[0].length-imagette[0].length+1; j++)
{
int[][] zoneATester = extractMat(image,i,j,imagette.length,imagette[0].length);
if (testEgalite(imagette,zoneATester) )
nb++;
}
return nb;
}

public static int[][] floutage( int[][] tab) {
int[][] tab2 = new int[tab.length][tab[0].length];
for (int i=0;i<tab.length;i++)
{
for (int j=0; j<tab[0].length; j++)
{
int somme = 0;
int nb = 0;
for (int ii=i-1;ii<=i+1;ii++)
if (0<=ii && ii<tab.length)
for (int jj=j-1;jj<=j+1;jj++)
if (0<=jj && jj<tab[0].length)
{
somme += tab[ii][jj];
nb++;
}
tab2[i][j]= somme/nb;
}
}
return tab2;
}
public static int[][] fusion(int [][] image, int [][] imagette,int[][] tab2){
for (int i=0; i<image.length-imagette.length+1; i++ )
for (int j=0; j<image[0].length-imagette[0].length+1; j++)
{
int[][] zoneATester = extractMat(image,i,j,imagette.length,imagette[0].length);
if (testEgalite(imagette,zoneATester) ) {
for(int x = 0; x < imagette.length; x++){
for(int y = 0; y < imagette[0].length; y++){
image[i][j] = tab2[x][y];
}
}
}
}
return image;
}
}

Voilà, du coup j'arrive à flouter,

mais au moment d'afficher les valeurs du tableau, je n'ai qu'une seule valeur qui soit devenue floue.

( pour un tableau comme ceci:
1 2 3
4 5 6
7 8 9

et une imagette floutée comme ceci
2 2
2 2
Il se passera quelque chose comme cela

1 2 3
2 5 6 :g) seul le 4 s'est changé en 2
7 8 9
)

Bon, je sais que j'explique VRAIMENT mal, mais du coup je viens quand même demander si vous n'auriez pas un ou deux conseils,
je vous remercie d'avance.

(Je suis sur Eclipse, alors je peux fournir des screens du code avec les résultats, pour plus de détails ).

EDIT: La seule partie que j'ai modifié ( hors main, pour appeler ma nouvelle fonction ) est la fonction "fusion" le reste est "natif " et "marche parfaitement "

Message édité le 01 décembre 2016 à 22:43:14 par RLink
RLink
RLink
Niveau 14
02 décembre 2016 à 06:59:05

Bonjour,
C'est vrai, j'y ai pas pensé, je fais ça vers 9h, pour l'instant j'ai pas le temps :hap:

RLink
RLink
Niveau 14
02 décembre 2016 à 08:49:55

Voilà le pastebin : http://pastebin.fr/48569
Je suis encore sur l'exo, j'ai jusqu'à 11h30 pour le finir.

RLink
RLink
Niveau 14
02 décembre 2016 à 10:14:00

Fini :hap:
Merci quand même :noel:

Elmohe
Elmohe
Niveau 9
03 décembre 2016 à 18:28:39

Quand même, je sais pas qui vous a donné ce code mais utiliser exprès un System.out.println(); pour sauter une ligne au lieu d'un simple \n, si c'est un prof je lui voudrais pas que du bien :sournois:

lokilok
lokilok
Niveau 16
03 décembre 2016 à 18:47:35

Le 03 décembre 2016 à 18:28:39 Elmohe a écrit :
Quand même, je sais pas qui vous a donné ce code mais utiliser exprès un System.out.println(); pour sauter une ligne au lieu d'un simple \n, si c'est un prof je lui voudrais pas que du bien :sournois:

J'imagine qu'il doit se dire que c'est plus propre parce que le/les caractères utilisés pour effectuer un retour à la ligne sont différent selon la plateforme, donc avec un println t'as pas besoin d'écrire ce/ces caractères donc t'es pas dépendant de la plateforme.

Évidement c'est faux, mais j'imagine que ça doit être ce qu'il pense.

EDIT: Ah quoi que c'est peut-être vrai pour java je sais pas, pour C++ de ce que j'ai compris en cherchant sur google les \n étaient automatiquement converti selon la plateforme ciblé, mais c'est peut-être pas le cas pour java.

Message édité le 03 décembre 2016 à 18:48:16 par lokilok
Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment