IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Accentuation de contraste monochrome


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 13
    Points
    13
    Par défaut Accentuation de contraste monochrome
    Bonjour, je cherche à refaire un des filtres les plus connus de Photoshop, le contraste automatique.
    Je connais quelques méthodes d'étirement d'histogramme mais aucune ne donne le même résultat.
    J'ai lus sur le site d'adobe, qu'il ne prenait pas en compte les 5% des extrêmes de l'histogramme.

    J'utilise OpenCV pour réaliser mes traitements

    La méthode qui s'en rapproche le plus est celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    void contrastAuto(Mat img)
    {
    	double min;
    	double max;
     
    	minMaxLoc(img, &min, &max);
     
    	float diff = max - min;
     
    	max = max*0.95;
    	min = min*1.05;
     
    	for(int y=0; y<img.cols; ++y)
    		for(int x=0; x<img.rows; ++x)
    			img.data[y*img.rows + x] = MAX(MIN((((img.data[y*img.rows + x] - min) / diff) * 255), 255), 0);
    }
    L’égalisation fournit dans OpenCV equalizeHist à tendance à brûler l'image.
    La méthode de création de LUT en fonction de l'histogramme donne la même chose que equalizeHist

    Et enfin un autre résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void normalize_gray (Mat img)
    {
    	double min, max, alpha, beta;
    	minMaxLoc(img, &min, &max);
     
    	max = max*0.95;
    	min = min*1.05;
     
    	alpha = 255.0 / (max - min);
    	beta = -min * alpha;
     
     
    	for (int i = 0; i < img.cols * img.rows; ++i)
    		img.data[i] = MAX(MIN(alpha * img.data[i] + beta, 255), 0);
    }
    Si quelqu'un c'est déjà posé la question de sont fonctionnement, je suis preneur
    Merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Je n'ai pas trouvé exactement le même algorithme, mais je m'en suis rapproché si cela intéresse quelqu'un...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    void equalizeLut(Mat *img)
    {
    	if (img->type() == CV_8UC1)
    	{
    		int* histogram = new int[256];
    		for (int i = 0; i<256; ++i)
    			histogram[i] = 0;
     
    		const unsigned int size = img->cols*img->rows;
    		for (int i = 0; i<size; ++i)
    			histogram[(int)img->data[i]]++;	
     
    		int min = 0, max = 0;
    		int ind = 0;
    		while (min < (double)(size*0.01))
    		{
    			min += histogram[ind++];
    		}
    		min = ind;
    		ind = 255;
    		while (max < (double)(size*0.01))
    		{
    			max += histogram[ind--];
    		}
    		max = ind;
    		delete(histogram);
     
    		int* tableLut = new int[256];
    		double minG, maxG;
     
    		minMaxLoc(*img, &minG, &maxG);
     
    		for (int i = 0; i<256; ++i)
    			tableLut[i] = MAX(MIN(int(((i - min)*(maxG-minG) / (double)(max - min)+minG))-0.5, 255), 0);
     
    		Mat Output(img->size(), CV_8UC1);
    		for (int i = 0; i<size; ++i)
    			Output.data[i] =  tableLut[(int)img->data[i]]; 
                    delete(tableLut);
    		img->release();
    		Output.copyTo(*img);
     
    		Output.release();
    	}
    }
    J'admet un bricolage au niveau des minimas et maximas...
    J'attend un peu avant de mettre résolue

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les caractères accentues
    Par newnew dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 15/10/2004, 13h58
  2. Accentuation - pages html générées par Java
    Par phoebe dans le forum Linux
    Réponses: 4
    Dernier message: 28/05/2004, 12h49
  3. Comment entrer des lettres accentuées sous postgresql ?
    Par Chihuahua dans le forum Requêtes
    Réponses: 11
    Dernier message: 28/08/2003, 08h04
  4. Bulk insert et caractère accentué
    Par slc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/04/2003, 12h52
  5. Pb Lecture de bitmap monochrome
    Par Loïc38 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/07/2002, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo