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

SDL Discussion :

Filtres sur image


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut Filtres sur image
    Bonjour a tous !

    Apres avoir effectué un logiciel stéganographique, je me suis lancé dans la réalisation de filtres. Ces derniers prennent une photo et la transforment, selon le souhait de l'utilisateur, en noir et nlanc, aplatissent les couleurs ( dans mon code c'est un aplatissement sur 4 ) ...
    Mon problème réside dans le fait que la transformation en Noir et Blanc dégrade énormément l'image. Avez vous une solution ?

    Mon code:
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    #include <cstdlib>
    #include <cstdio>
    #include <iostream>
    #include "SDL/SDL.h"
    #include "prototypes.h"
     
    const int LARGEUR_ECRAN = 640;
    const int HAUTEUR_ECRAN = 480;
     
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *Tampon = NULL;
     
        SDL_Rect position;
        SDL_Event event;
     
        int i = 0;
        int continuer = 1;
     
        SDL_Init(SDL_INIT_VIDEO);
     
        Tampon = SDL_LoadBMP("./image.bmp");
     
        ecran = SDL_SetVideoMode(Tampon->w, Tampon->h, 32, SDL_HWSURFACE);
     
        position.x = 0;
        position.y = 0;
     
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
     
        Manipulation(Tampon);
     
        SDL_BlitSurface(Tampon, NULL, ecran, &position);
        SDL_Flip(ecran);
     
        while (continuer)
        {
     
            SDL_WaitEvent(&event);
     
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
     
                case SDL_KEYDOWN:
                if(event.key.keysym.sym == SDLK_ESCAPE)
                {
                    continuer = 0;
                    break;
                }
            }
        }
     
        SDL_FreeSurface(Tampon);
        SDL_Quit();
     
        return EXIT_SUCCESS;
     
    }
     
    void Manipulation(SDL_Surface* surface)
    {
            int x, y;
     
            Uint8 r_s, g_s, b_s, a_s;
     
            Uint32 pixel_s;
     
            SDL_LockSurface(surface);
     
            for (y = 0 ; y < surface->h; y ++)
            {
                    for ( x = 0 ; x < surface->w; x ++)
                    {
                            pixel_s = getPixel(surface, x, y);
     
                            SDL_GetRGBA(pixel_s, surface->format, &r_s, &g_s, &b_s, &a_s);
     
                            Uint8 Moyenne = (r_s + g_s + b_s) / 3;
     
                            if(Moyenne < 123)
                            {
                                r_s = 0;
                                g_s = 0;
                                b_s = 0;
                            }
                            else if(Moyenne >= 124)
                            {
                                r_s = 255;
                                g_s = 255;
                                b_s = 255;
                            }
     
                            pixel_s=SDL_MapRGBA(surface->format, r_s, g_s, b_s, a_s);
     
                            setPixel(surface, x, y, pixel_s);
     
                    }
            }
            SDL_UnlockSurface(surface);
    }
     
    Uint8 Verifier_valeur(Uint8 valeur)
    {
        if(valeur < 123)
        {
            valeur = 0;
        }
        if(valeur > 123)
        {
            valeur = 255;
        }
     
        return valeur;
    }
    Je ne vous ai pas mis le pixel.cpp ( pas important dans mon cas ).

    Si ça vous interesse de voir mes autres filtres, regardez dans le zip.

    le zip

    Je précise que ce que vous présente la n'est pas définitif, je vais faire des filtres qui fonctionnent avec les lignes de commandes pour gérer tous les formats d'images.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je pense que tu aurais de meilleurs résultats en prennant non pas la moyenne, mais la formule standard qui définit le niveau de gris :
    luminance = 0.30 * red + 0.59 * green + 0.11 * blue
    http://en.wikipedia.org/wiki/Grayscale

    Ensuite il faut aussi voir par rapport au seuil, je ne sais pas si 123 est la meilleure valeur (au fait, la moitié de 256 c'est 128).

  3. #3
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    Mais la ce que tu me propose, c'est de faire un niveau de gris, et ça je sais le faire ( il est dans le zip ).

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par ironzorg
    Mais la ce que tu me propose, c'est de faire un niveau de gris, et ça je sais le faire ( il est dans le zip ).
    Oui mais pourquoi pas transformer en niveau de gris avant de passer soit en noir, soit en blanc ?

    Le résultat sera sûrement meilleur,

    Jc

  5. #5
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    Oui mais pourquoi pas transformer en niveau de gris avant de passer soit en noir, soit en blanc ?
    Oui mais ma logique consistait a faire:
    - faire la moyenne des composantes
    - si la moyenne tend vers le noir, mettre toutes les composantes en noir
    - si la moyenne tend vers le blanc, mettre toutes les composantes en blanc


    Par définition, le gris se forme quand les composantes ont la meme valeur, donc si on applique mon théorème, on obtiendra rien du tout car le gris ne tends ni vers le blanc, ni vers le noir !

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par ironzorg
    Par définition, le gris se forme quand les composantes ont la meme valeur, donc si on applique mon théorème, on obtiendra rien du tout car le gris ne tends ni vers le blanc, ni vers le noir !
    Moi je définis cela comme ceci :

    Calculer le facteur lumière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    luminance = 0.30 * red + 0.59 * green + 0.11 * blue
    Ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Si luminance > seuil_noir
       couleur = blanche
    sinon
       couleur = noir
    fsi
    Jc

Discussions similaires

  1. Filtre sur image d'un œil
    Par benthebest dans le forum OpenCV
    Réponses: 17
    Dernier message: 27/05/2012, 20h44
  2. Filtre sur image trop importante
    Par lucazzo dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 21/06/2008, 15h23
  3. appliquer des filtres sur image
    Par MANU_2 dans le forum Débuter
    Réponses: 1
    Dernier message: 10/01/2008, 12h02
  4. filtre alpha sur image
    Par nicerico dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/05/2007, 22h35
  5. Filtre sur image compatible I.E
    Par sacados1 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 13/03/2007, 13h57

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