begin process at 2012 02 15 01:24:43
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths et Algorithmes

 > TRANSFORMÉE DE HOUGH

TRANSFORMÉE DE HOUGH


 Information sur la source

Note :
Aucune note
Catégorie :Maths et Algorithmes Classé sous :hough, transformée, droites, contour, image Niveau :Débutant Date de création :08/08/2007 Vu / téléchargé :12 887 / 819

Auteur : zolotaya

Ecrire un message privé
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 Description

Ce petit code permet d'éffectuer la transformée de Hough sur une image.
Il prend en entrée une image du type (png / jpeg ou gif) qui est séléctionnée au début du programme
Cette image ne doit contenir que le contour des formes (cf "filetre de sobel" par exemple).
Il crée deux images. 1 contenant tout les pixel luent, l'autres contenant les pixels luent + la droite dominante de l'image trouvée.

Plusieurs améliorations peuvent etre apportée surtout dans la recherche du / des maximas.
Il est possible également de l'étendre à plusieurs droites dans l'image ...

Source

  • package houghTransform;
  • import java.awt.Canvas;
  • import java.awt.Color;
  • import java.awt.Graphics;
  • import java.awt.Image;
  • import java.awt.image.BufferedImage;
  • import java.io.FileNotFoundException;
  • import java.io.FileOutputStream;
  • import java.io.OutputStream;
  • import javax.imageio.ImageIO;
  • import javax.swing.JFileChooser;
  • /**
  • * @author Zolotaya
  • */
  • public class Hough {
  • int[][] accu;
  • static int maxRho;
  • /** Constructeur */
  • public Hough() {
  • // TODO Auto-generated constructor stub
  • JFileChooser choix = new JFileChooser();
  • if (choix.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
  • String filename = choix.getSelectedFile().getAbsolutePath();
  • try {
  • BufferedImage bi = loadImage(filename);
  • Applyhough(bi);
  • } catch (Exception e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • }
  • }
  • }
  • /** Fonction d'application de la transformée de Hough */
  • public void Applyhough(BufferedImage bi){
  • int compt = 0;
  • int maxRho = (int)(Math.sqrt( (bi.getWidth()*bi.getWidth()) + (bi.getHeight()*bi.getHeight()) ) + 0.5);
  • Hough.maxRho = maxRho;
  • // création du "conteneur" de données
  • accu = new int [360][2*maxRho];
  • for (int i = 0; i < accu.length ; i++){
  • for (int j = 0 ; j < accu[i].length ; j++){
  • accu[i][j] = 0;
  • }
  • }
  • // création d'une image avec en bleu les pixels luent, en rouge les droites trouvée (cf plus loin)
  • BufferedImage dst = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
  • // On parcour toute l'image
  • for (int x = 0 ; x < bi.getWidth() ; x++) {
  • for (int y = 0 ; y < bi.getHeight() ; y++){
  • // Si le pixel n'appartient pas au fond (n'est pas noir)
  • int rgb = bi.getRGB(x, y);
  • rgb = rgb & 0xFF;
  • if (rgb > 0){
  • for (int angle = 0 ; angle < 360 ; angle ++){
  • double theta = Math.toRadians(angle);
  • double rho = x*Math.cos(theta) + y*Math.sin(theta);
  • int indexAngle = (int) (angle);
  • int indexRho = (int)(rho+maxRho + 0.5);
  • accu[indexAngle][indexRho]++;
  • }
  • dst.setRGB(x, y, rgb);
  • compt++;
  • }
  • }
  • }
  • try {
  • SaveImage(dst, new FileOutputStream("PixelRead.png"));
  • } catch (FileNotFoundException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • } catch (Exception e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • }
  • int[] droite = maxi();
  • try {
  • dst = tracerDroite(droite, dst);
  • SaveImage(dst, new FileOutputStream("droite.png"));
  • } catch (FileNotFoundException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • } catch (Exception e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • }
  • }
  • /** Fonction de recherche des maximums */
  • public int[] maxi(){
  • int maxi = 0;
  • int[] droite = new int[3];
  • // On parcours tout l'accumulateur pour trouver le maximum
  • for (int i = 0 ; i < accu.length ; i++){
  • for (int j = 0 ; j < accu[i].length ; j++){
  • if ( maxi < accu[i][j]){
  • maxi = accu[i][j];
  • droite[0] = i; // angle
  • droite[1] = j; // distance
  • droite[2] = maxi; // peut servir pour la recherche des maximas suivant
  • }
  • }
  • }
  • return droite;
  • }
  • /** Fonction de tracage des droites + calcul de leur équation */
  • private static BufferedImage tracerDroite(int[] droite, BufferedImage src){
  • int angle = droite[0];
  • int rho = droite[1] - maxRho;
  • // droite de la forme ax +by + c = 0 -->
  • // si b != 0 y = (-ax + c)/b
  • // sinon droite verticale
  • double a = Math.cos(Math.toRadians(angle));
  • double b = Math.sin(Math.toRadians(angle));
  • double c = rho;
  • // On fixe 2 nombre :
  • int x0 = -src.getWidth();
  • int x1 = src.getWidth();
  • double y0 , y1;
  • // On calcul les deux droites :
  • // SI la droite n'est pas verticale
  • if (b != 0){
  • y0 = (-a*x0 + c)/b;
  • y1 = (-a*x1 + c)/b;
  • // On affiche l'équation de la droite
  • System.out.println("droite : y = "+a+"*x + "+b );
  • // On trace les droites trouvées
  • Graphics g = src.getGraphics();
  • g.setColor(Color.red);
  • g.drawLine(x0, (int)(y0 + 0.5), x1, (int)(y1 + 0.5));
  • } else {
  • x0 = rho;
  • y0 = 0;
  • x1 = rho;
  • y1 = src.getHeight();
  • // On affiche l'équation de la droite
  • System.out.println("droite : y = "+a+"*x + "+b );
  • // On trace les droites trouvées
  • Graphics g = src.getGraphics();
  • g.setColor(Color.red);
  • g.drawLine(x0, (int)(y0 + 0.5), x1, (int)(y1 + 0.5));
  • }
  • // On retourne l'image source
  • return src;
  • }
  • /** Fonction de sauvegarde d'image */
  • public static void SaveImage(BufferedImage imBW, OutputStream os) throws Exception {
  • Graphics g = imBW.createGraphics();
  • g.drawImage(imBW, 0, 0, null);
  • g.dispose();
  • ImageIO.write(imBW, "png", os);
  • os.close();
  • imBW = null;
  • os = null;
  • }
  • // Fonction d'ouverture des images (.jpeg / .gif / .png)
  • public BufferedImage loadImage(String f) throws Exception {
  • Image im2 = null;
  • java.awt.MediaTracker mt2 = null;
  • java.io.FileInputStream in = null;
  • byte[] b = null;
  • int size = 0;
  • in = new java.io.FileInputStream(f);
  • if (in != null) {
  • size = in.available();
  • b = new byte[size];
  • in.read(b);
  • im2 = java.awt.Toolkit.getDefaultToolkit().createImage(b);
  • in.close();
  • }
  • mt2 = new java.awt.MediaTracker(new Canvas());
  • if (im2 != null) {
  • if (mt2 != null) {
  • mt2.addImage(im2, 0);
  • mt2.waitForID(0);
  • }
  • }
  • BufferedImage input = new BufferedImage(im2.getWidth(null), im2
  • .getHeight(null), BufferedImage.TYPE_INT_ARGB);
  • Graphics g = input.createGraphics();
  • g.setColor(Color.white);
  • g.fillRect(0, 0, im2.getWidth(null), im2.getHeight(null));
  • g.drawImage(im2, 0, 0, null);
  • g.dispose();
  • g = null;
  • return input;
  • }
  • /** Point d'entrée */
  • public static void main(String[] args) {
  • // TODO Auto-generated method stub
  • new Hough();
  • }
  • }
package houghTransform;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.JFileChooser;

/**
 * @author Zolotaya
 */
public class Hough {

	int[][] accu;
	static int maxRho;

	/**	Constructeur */
	public Hough() {
		// TODO Auto-generated constructor stub
		JFileChooser choix = new JFileChooser();
		if (choix.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
			String filename = choix.getSelectedFile().getAbsolutePath();
			try {
				BufferedImage bi = loadImage(filename);
				Applyhough(bi);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/** Fonction d'application de la transformée de Hough */
	public void Applyhough(BufferedImage bi){
		int compt = 0;
		int maxRho = (int)(Math.sqrt( (bi.getWidth()*bi.getWidth()) + (bi.getHeight()*bi.getHeight()) ) + 0.5);
		Hough.maxRho = maxRho;
		// création du "conteneur" de données
		accu = new int [360][2*maxRho];
		for (int i = 0; i < accu.length ; i++){
			for (int j = 0 ; j < accu[i].length ; j++){
				accu[i][j] = 0;
			}
		}
		// création d'une image avec en bleu les pixels luent, en rouge les droites trouvée (cf plus loin)
		BufferedImage dst = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
		// On parcour toute l'image 
		for (int x = 0 ; x < bi.getWidth() ; x++) {
			for (int y = 0 ; y < bi.getHeight() ; y++){
				// Si le pixel n'appartient pas au fond (n'est pas noir)
				int rgb = bi.getRGB(x, y);
				rgb = rgb & 0xFF;
				if (rgb > 0){
					for (int angle = 0 ; angle < 360 ; angle ++){
						double theta = Math.toRadians(angle);
						double rho = x*Math.cos(theta) + y*Math.sin(theta);
						int indexAngle = (int) (angle);
						int indexRho = (int)(rho+maxRho + 0.5); 
						accu[indexAngle][indexRho]++;
					}
					dst.setRGB(x, y, rgb);
					compt++;
				}
			}
		}
		
		try {
			SaveImage(dst, new FileOutputStream("PixelRead.png"));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		int[] droite = maxi();
		
		try {
			dst = tracerDroite(droite, dst);
			SaveImage(dst, new FileOutputStream("droite.png"));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**  Fonction de recherche des maximums */
	public int[] maxi(){
		int maxi = 0;
		int[] droite = new int[3];
		// On parcours tout l'accumulateur pour trouver le maximum
		for (int i = 0 ; i < accu.length ; i++){
			for (int j = 0 ; j < accu[i].length ; j++){
				if ( maxi < accu[i][j]){
					maxi = accu[i][j];
					droite[0] = i; // angle
					droite[1] = j; // distance
					droite[2] = maxi; // peut servir pour la recherche des maximas suivant
				}
			}
		}
		return droite;
	}
	
	/** Fonction de tracage des droites + calcul de leur équation */
	private static BufferedImage tracerDroite(int[] droite, BufferedImage src){

		int angle = droite[0];
		int rho = droite[1] - maxRho;
		
		// droite de la forme ax +by + c = 0 --> 
		// si b != 0 y = (-ax + c)/b
		// sinon droite verticale 
		double a = Math.cos(Math.toRadians(angle));
		double b = Math.sin(Math.toRadians(angle));
		double c = rho;
		
		// On fixe 2 nombre :
		int x0 = -src.getWidth();
		int x1 = src.getWidth();
		
		double y0 , y1; 
		// On calcul les deux droites : 
		// SI la droite n'est pas verticale
		if (b != 0){
			y0 = (-a*x0 + c)/b;
			y1 = (-a*x1 + c)/b;
			// On affiche l'équation de la droite
			System.out.println("droite : y = "+a+"*x + "+b );
			// On trace les droites trouvées
			Graphics g = src.getGraphics();
			g.setColor(Color.red);
		    g.drawLine(x0, (int)(y0 + 0.5), x1, (int)(y1 + 0.5));
		} else {
			x0 = rho;
			y0 = 0;
			x1 = rho;
			y1 = src.getHeight();
			// On affiche l'équation de la droite
			System.out.println("droite : y = "+a+"*x + "+b );
			// On trace les droites trouvées
			Graphics g = src.getGraphics();
			g.setColor(Color.red);
		    g.drawLine(x0, (int)(y0 + 0.5), x1, (int)(y1 + 0.5));
		}
	    // On retourne l'image source
		return src;
	}
	
	/** Fonction de sauvegarde d'image */
	public static void SaveImage(BufferedImage imBW, OutputStream os) throws Exception {
		Graphics g = imBW.createGraphics();
		g.drawImage(imBW, 0, 0, null);
		g.dispose();
		ImageIO.write(imBW, "png", os);
		os.close();
		imBW = null;
		os = null;
	}

	// Fonction d'ouverture des images (.jpeg / .gif / .png)
	public BufferedImage loadImage(String f) throws Exception {
		Image im2 = null;
		java.awt.MediaTracker mt2 = null;

		java.io.FileInputStream in = null;
		byte[] b = null;
		int size = 0;

		in = new java.io.FileInputStream(f);
		if (in != null) {
			size = in.available();
			b = new byte[size];
			in.read(b);
			im2 = java.awt.Toolkit.getDefaultToolkit().createImage(b);
			in.close();
		}

		mt2 = new java.awt.MediaTracker(new Canvas());
		if (im2 != null) {
			if (mt2 != null) {
				mt2.addImage(im2, 0);
				mt2.waitForID(0);
			}
		}
		BufferedImage input = new BufferedImage(im2.getWidth(null), im2
				.getHeight(null), BufferedImage.TYPE_INT_ARGB);
		Graphics g = input.createGraphics();
		g.setColor(Color.white);
		g.fillRect(0, 0, im2.getWidth(null), im2.getHeight(null));
		g.drawImage(im2, 0, 0, null);
		g.dispose();
		g = null;
		return input;
	}

	/** Point d'entrée */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Hough();
	}

}

 Conclusion

J'essairais de rejouter d'autres options (quand j'aurais le temps) sur la détéction des contours d'une image, améliorations de la séléctions des maximas, séléction du nombre de droites... En gros essayer de faire un petit soft sympa ;-).

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   hough
    •   bin
      •   houghTransform
        • Hough.classTélécharger ce fichier [Réservé aux membres club]5 484 octets
    •   src
    • .classpathTélécharger ce fichier [Réservé aux membres club]370 octets
    • .projectTélécharger ce fichier [Réservé aux membres club]381 octets
    • droite.pngTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 042 octets
    • essai.pngTélécharger ce fichier [Réservé aux membres club]Voir ce fichier3 126 octets
    • PixelRead.pngTélécharger ce fichier [Réservé aux membres club]Voir ce fichier1 868 octets

Télécharger le zip


 Sources de la même categorie

IMPLÉMENTATION DE L'ENSEMBLE C AVEC JAVA par Scupper
CALCUL D'EXPONENTIEL ( PRÉCISION MODIFIABLE) par Scupper
Source avec Zip TRANSFORMATION D'UNE EXPRESSION ARITHMETIQUE (INFIXÉ) EN POS... par billatosco
PROBLÈME DES N-REINES par jojolemariole
Source avec Zip ARRAYMATRIX -MATRICE MULTIDIMENSIONELLE ET GÉNÉRIQUE- , IMP... par labandus

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture SELECTEUR D'IMAGE EN SWING par Julien39
Source avec Zip Source avec une capture JVIEWER 0.7 par Romano58
Source avec Zip Source avec une capture EXTRACTION DES IMAGES CONTENUES DANS UN PDF par jojolemariole
Source avec une capture TÉLÉCHARGEMENT D'IMAGES (POCHETTES CD, DVD, LIVRES...) SUR I... par dufour137
FAIRE DEFILER UNE IMAGE par Nic.C

Commentaires et avis

Commentaire de LeFauve42 le 14/08/2007 13:31:28

Salut,

Je n'ai aucune idee de ce qu'est une transformee de Hough, mais comme je suis curieux de nature je suis venu jeter un oeil a ton post.

Je n'en sais pas beaucoup plus maintenant helas... lol

Pourrais-tu rajouter une ou deux images (genre avant et apres) ?

A+,
Eric

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Image instable, clignotante... [ par mleloc ] Bonjour, j'ai cr&#233;&#233; une applet qui transforme une image grace a l'ondelette de Haar puis affiche sa transform&#233;e.Malheureusement, lorsque transformée de hough en langage C [ par janouta ] Bonjour, je suis une étudiante en train de préparer mon projet de fin d'étude , je débute en traitement d'image et je dois réaliser un analyseur de co Trouver un cercle dans une image !! [ par kenada56 ] Slt !! Je cherche un moyen permettant de d&#233;tecter un cercle dans une image. J'ai essay&#233; avec le Transform&#233; de Hough, mais je n'ai pa r& Détection du mammelon à partir du contour du sein [ par algeroc87 ] Bonjour, D'abord j'espère que vous allez bien toute l'équipe parceque ça fait un moment que j'ai pas trainé ici En faite je voulais juste avoir des centre de contour d'image [ par takwatouma ] Bonjourj'ai testé un code de contour actif.je veux detecter centre de gravité de ce contour comment je peux acceder au different point de contour.et q La transformée de Hough [ par dh11 ] Salut, Je suis une étudiante débutante en java et je suis en train de faire une application :détection des visages dans une image et je veux utilise [clos] detection de contour d'image avec java [ par mmlm ] bonjour Je veut obtenir le code source de détection de contour d'image a travers une boutton avec java . MERCI detection de contour d'image avec java [ par mmlm ] Je souhaite afficher le contour d'une images avec une application java. Sur le site je n'ai trouvé que des exemples avec c++ or je dois utiliser JAVA Afficher une image aleatoire et deplacable avec la souris sur une Applet java [ par liondes ] salut tout le monde SVP je suit débutant en java si vous pouvez m'aidez n&#8217;hésiter pas mon problème concerne le chargement d'une image [color=bl cacher une image dans un fichier wav [ par hajerboug ] Bonjour, Est il possible de cacher une image dans un fichier wav en utilisant la méthode du LSB. La représentation binaire d'un fichier wav me semble


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 6,240 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales