/// <summary> /// Cette première innovation est un filtre qui affiche une image à la Andy Warhol /// </summary> public void Innovation1() { int larg = this.image.GetLength(0); int haut = this.image.GetLength(1); MyImage newimage = new MyImage(2 * larg, 2 * haut); int[,] moyennes = new int[larg, haut]; for (int i = 0; i < image.GetLength(0); i++) { for (int j = 0; j < image.GetLength(1); j++) { int moyenne = (image[i, j].Rouge + image[i, j].Vert + image[i, j].Bleu) / 3; ///on réutilise une partie de la fonction nuance de gris moyennes[i, j] = moyenne; } } for (int i = 0; i < larg; i++) { for (int j = 0; j < haut; j++) { newimage.image[i, j] = new Pixel(moyennes[i, j], moyennes[i, j] / 5, moyennes[i, j] / 5); ///on rajoute de petites valeurs pour que l'image soit plus claire newimage.image[i + larg, j] = new Pixel(0, moyennes[i, j], 0); newimage.image[i, j + haut] = new Pixel(moyennes[i, j] / 3, moyennes[i, j] / 3, moyennes[i, j]); ///pareil pour le bleu newimage.image[i + larg, j + haut] = new Pixel(0, moyennes[i, j], moyennes[i, j]); } } Enregistrement(newimage.image); }
/// <summary> /// Main qui permet de lancer toutes les méthodes. C'est un menu déroulant /// </summary> /// <param name="args"></param> static void Main(string[] args) { bool execute = true; while (execute == true) { #region Menu Textuel Console.Clear(); Console.WriteLine("\nChoissisez au clavier une des sous-parties :\n" + "\n- Opérations géometriques (a)" + "\n- Gris et couleurs (b)" + "\n- Matrices de convolution (c)" + "\n- Divers (d)" + "\n- Innovations... (e)" + "\n\nFermer la console (f)"); ConsoleKeyInfo choixUtilisateur; do { choixUtilisateur = Console.ReadKey(true); } #endregion while (choixUtilisateur.Key != ConsoleKey.A && choixUtilisateur.Key != ConsoleKey.B && choixUtilisateur.Key != ConsoleKey.C && choixUtilisateur.Key != ConsoleKey.D && choixUtilisateur.Key != ConsoleKey.E && choixUtilisateur.Key != ConsoleKey.F); if (choixUtilisateur.Key == ConsoleKey.A) { #region Menu Textuel Console.Clear(); Console.WriteLine("\n [Opérations géometriques]" + "\n" + "\n- Miroir (a)" + "\n- Agrandir (b)" + "\n- Rotation (c)" + "\n- Rétrécir horizontallement (d)" + "\n- Rétrécir verticallement (e)" + "\n- Rétrécir globalement (f)"); #endregion #region Boutons pour lancer les méthodes do { choixUtilisateur = Console.ReadKey(true); }while (choixUtilisateur.Key != ConsoleKey.A && choixUtilisateur.Key != ConsoleKey.B && choixUtilisateur.Key != ConsoleKey.C && choixUtilisateur.Key != ConsoleKey.D && choixUtilisateur.Key != ConsoleKey.E && choixUtilisateur.Key != ConsoleKey.F); if (choixUtilisateur.Key == ConsoleKey.A) { MyImage image = new MyImage(choixImage()); image.Miroir(); Process.Start("newimage.bmp"); }///Miroir if (choixUtilisateur.Key == ConsoleKey.B) { MyImage image = new MyImage(choixImage()); image.Agrandir2(); Process.Start("newimage.bmp"); }///Agrandir if (choixUtilisateur.Key == ConsoleKey.C) { int angle; do { Console.WriteLine("Entrez l'angle souhaité"); }while (!int.TryParse(Console.ReadLine(), out angle)); MyImage image = new MyImage(choixImage()); angle = angle % 360; if (angle == 90 || angle == 180 || angle == 270) ///permet d'eviter la perte de qualité de l'autre methode, et plus rapide. { image.Rotation(angle); } else { image.Rotation3(angle); } Process.Start("newimage.bmp"); }///Rotations if (choixUtilisateur.Key == ConsoleKey.D) { MyImage image = new MyImage(choixImage()); image.Retrecicement(true); Process.Start("newimage.bmp"); }///Rétrécissement Horizontal if (choixUtilisateur.Key == ConsoleKey.E) { MyImage image = new MyImage(choixImage()); image.Retrecicement(false); Process.Start("newimage.bmp"); }///Rétrécissement Vertical if (choixUtilisateur.Key == ConsoleKey.F) { MyImage image = new MyImage(choixImage()); image.Retrecicement(true); image = new MyImage("newimage.bmp"); image.Retrecicement(false); Process.Start("newimage.bmp"); } ///Rétrécissement Global #endregion } ///Opérations géométriques if (choixUtilisateur.Key == ConsoleKey.B) { #region Menu Textuel Console.Clear(); Console.WriteLine("\n [Gris et couleurs]" + "\n" + "\n- Noir et blanc (a)" + "\n- Nuances de gris (b)" + "\n- Filtre 4 couleur (c)"); #endregion #region Boutons pour lancer les méthodes do { choixUtilisateur = Console.ReadKey(true); }while (choixUtilisateur.Key != ConsoleKey.A && choixUtilisateur.Key != ConsoleKey.B && choixUtilisateur.Key != ConsoleKey.C); if (choixUtilisateur.Key == ConsoleKey.A) { MyImage image = new MyImage(choixImage()); image.NoirEtBlanc(); Process.Start("newimage.bmp"); }///Filtre noir et blanc if (choixUtilisateur.Key == ConsoleKey.B) { MyImage image = new MyImage(choixImage()); image.NuancesDeGris(); Process.Start("newimage.bmp"); }///Filtre nuances de gris if (choixUtilisateur.Key == ConsoleKey.C) { MyImage image = new MyImage(choixImage()); image.Innovation1(); Process.Start("newimage.bmp"); } #endregion }///Gris et couleurs if (choixUtilisateur.Key == ConsoleKey.C) { #region Menu Textuel Console.Clear(); Console.WriteLine("\n [Matrice de Convolution]" + "\n" + "\n- Détection des Contours (a)" + "\n- Flou (b)" + "\n- Repoussage (c)" + "\n- Renforcement (d)"); #endregion #region Boutons pour lancer les méthodes do { choixUtilisateur = Console.ReadKey(true); }while (choixUtilisateur.Key != ConsoleKey.A && choixUtilisateur.Key != ConsoleKey.B && choixUtilisateur.Key != ConsoleKey.C && choixUtilisateur.Key != ConsoleKey.D); if (choixUtilisateur.Key == ConsoleKey.A) { MyImage image = new MyImage(choixImage()); image.DetectionContours(); Process.Start("newimage.bmp"); } ///Détection des contours if (choixUtilisateur.Key == ConsoleKey.B) { MyImage image = new MyImage(choixImage()); image.Flou(); Process.Start("newimage.bmp"); }///Flou if (choixUtilisateur.Key == ConsoleKey.C) { MyImage image = new MyImage(choixImage()); image.Repoussage(); Process.Start("newimage.bmp"); }///Repoussage if (choixUtilisateur.Key == ConsoleKey.D) { MyImage image = new MyImage(choixImage()); image.Renforcement(); Process.Start("newimage.bmp"); } ///Renforcement #endregion } ///Matrice de convolution if (choixUtilisateur.Key == ConsoleKey.D) { #region Menu Textuel Console.Clear(); Console.WriteLine("\n [Divers]" + "\n" + "\n- Histogramme (a)" + "\n- Fractale (b)"); #endregion #region Boutons pour lancer les méthodes do { choixUtilisateur = Console.ReadKey(true); }while (choixUtilisateur.Key != ConsoleKey.A && choixUtilisateur.Key != ConsoleKey.B); if (choixUtilisateur.Key == ConsoleKey.A) { MyImage image = new MyImage(choixImage()); Console.Clear(); Console.WriteLine("\nChargement... Veuillez patienter svp."); image.Histogramme2(); Process.Start("newimage.bmp"); } ///Histogramme if (choixUtilisateur.Key == ConsoleKey.B) { MyImage fractale = new MyImage(400, 400); Console.Clear(); Console.WriteLine("\nChargement... Veuillez patienter svp."); fractale.Fractaleee(); Process.Start("newimage.bmp"); } ///Fractale #endregion } ///Divers if (choixUtilisateur.Key == ConsoleKey.E) { #region Menu Textuel Console.Clear(); Console.WriteLine("\n [Innovations]" + "\n" + "\n- Filtre 4 couleurs (a)" + "\n- Images aléatoires (b)"); #endregion #region Boutons pour lancer les méthodes do { choixUtilisateur = Console.ReadKey(true); }while (choixUtilisateur.Key != ConsoleKey.A && choixUtilisateur.Key != ConsoleKey.B /*&& * choixUtilisateur.Key != ConsoleKey.C && choixUtilisateur.Key != ConsoleKey.D && choixUtilisateur.Key != ConsoleKey.E*/); if (choixUtilisateur.Key == ConsoleKey.A) { MyImage image = new MyImage(choixImage()); image.Innovation1(); Process.Start("newimage.bmp"); } /// Filtre 4 couleurs / Innovation if (choixUtilisateur.Key == ConsoleKey.B) { MyImage image = new MyImage(500, 500); image.Innovation2(); Process.Start("newimage.bmp"); } #endregion } ///Innovations if (choixUtilisateur.Key == ConsoleKey.F) /// Pour fermer la console et mettre fin au programme { execute = false; } } }
/// <summary> /// Histogramme d'une image. Cette méthode affich 3 histogrammes. Un pour chaque sous pixel donc RGB. /// </summary> public void Histogramme2() { MyImage histo = new MyImage(256 * 3, 250); int nbPixels = this.image.GetLength(0) * this.image.GetLength(1); for (int x = 0; x < 256; x++) { int sommeRouge = 0; int sommeVert = 0; int sommeBleu = 0; for (int i = 0; i < this.image.GetLength(0); i++) { for (int j = 0; j < this.image.GetLength(1); j++) { // Console.WriteLine(this.image[i, j].Rouge); if (this.image[i, j].Rouge == x) { sommeRouge++; } if (this.image[i, j].Vert == x) { sommeVert++; } if (this.image[i, j].Bleu == x) { sommeBleu++; } } } sommeRouge = sommeRouge * 20000 / nbPixels; sommeVert = sommeVert * 20000 / nbPixels; sommeBleu = sommeBleu * 20000 / nbPixels; if (sommeRouge >= 250) { sommeRouge = 249; } if (sommeVert >= 250) { sommeVert = 249; } if (sommeBleu >= 250) { sommeBleu = 249; } while (sommeVert > 0) { histo.image[x, sommeVert] = new Pixel(0, 150, 0); sommeVert--; } while (sommeRouge > 0) { histo.image[x + 256, sommeRouge] = new Pixel(255, 0, 0); sommeRouge--; } while (sommeBleu > 0) { histo.image[x + 512, sommeBleu] = new Pixel(0, 0, 255); sommeBleu--; } } Enregistrement(histo.image); }
/// <summary> /// Première méthode pour l'histogramme qui ne fonctionne pas. /// </summary> public void Histogramme() { MyImage histo = new MyImage(750, 256); //Remplacer comme pour fractale avec nouveau constructeur Pixel[,] hist_R = new Pixel[250, 256]; Pixel[,] hist_V = new Pixel[250, 256]; Pixel[,] hist_B = new Pixel[250, 256]; //Le 250 c'est la hauteur du cadre et 256 le nombre de bit for (int i = 0; i < 250; i++) { for (int j = 0; j < 250; j++) { hist_R[i, j] = new Pixel(255, 255, 255); hist_V[i, j] = new Pixel(255, 255, 255); hist_B[i, j] = new Pixel(255, 255, 255); //Je créer les 3 cadres blancs qui vont loger les histogrammes //On pourra en faire un qui regroupe les 3 ou les niveaux de gris } } int index = 0; //On va refaire 3 fois la même chose pour R,G et B //Rouge for (int x = 0; x < 256; x++) //ici x va parcours les différents valeurs que peut prendre un bit { for (int i = 0; i < hauteur; i++) { for (int j = 0; j < largeur; j++) { if (x == image[j, i].Rouge) { hist_R[index, x] = new Pixel(255, 0, 0); index++; } } } } for (int i = 0; i < 250; i++) { for (int j = 0; j < 256; j++) { histo.image[i + 500, j].Rouge = hist_R[i, j].Rouge; histo.image[i + 500, j].Vert = hist_R[i, j].Vert; histo.image[i + 500, j].Bleu = hist_R[i, j].Bleu; } } //Vert for (int x = 0; x < 256; x++) //ici x va parcours les différents valeurs que peut prendre un bit { for (int i = 0; i < hauteur; i++) { for (int j = 0; j < largeur; j++) { if (x == image[j, i].Vert) { hist_V[index, x] = new Pixel(0, 255, 0); index++; } } } } for (int i = 0; i < 250; i++) { for (int j = 0; j < 256; j++) { histo.image[i + 250, j].Rouge = hist_V[i, j].Rouge; histo.image[i + 250, j].Vert = hist_V[i, j].Vert; histo.image[i + 250, j].Bleu = hist_V[i, j].Bleu; } } //Bleu for (int x = 0; x < 256; x++) //ici x va parcours les différents valeurs que peut prendre un bit { for (int i = 0; i < hauteur; i++) { for (int j = 0; j < largeur; j++) { if (x == image[j, i].Vert) { hist_B[index, x] = new Pixel(0, 0, 255); index++; } } } } for (int i = 0; i < 250; i++) { for (int j = 0; j < 256; j++) { histo.image[i, j].Rouge = hist_B[i, j].Rouge; histo.image[i, j].Vert = hist_B[i, j].Vert; histo.image[i, j].Bleu = hist_B[i, j].Bleu; } } Enregistrement(histo.image); }