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
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 "