Manipuler la saturation

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Manipuler la saturation

Message par Fortix »

Salutation,

Quelqu'un aurais une procedure qui permet de manipuler la saturation d'une couleur:

par exemple si la valeure de la saturation est < 120 et bien la valeur devient 120, idem si elle est > et qui renvoit la nouvelle couleur

j'ais une procedure qui permet de calculer présisement la valeur de la saturation d'une couleur de 0 à 240

Code : Tout sélectionner

ProcedureDLL Round2(Number.f) 

    x.f = Number-Round(Number,0) 
    
    If x>=0.5 
        ProcedureReturn Round(Number, 1) 
    Else 
        ProcedureReturn Round(Number, 0) 
    EndIf 
    
EndProcedure

ProcedureDLL Saturation(Color)
 
    R = Red(Color) : G = Green(Color) : B = Blue(Color) 
    
    If R < G And R < B 
        Min = R
         
        If G > B 
            Max = G 
        Else 
            Max = B 
        EndIf 
    ElseIf G < B 
        Min = G 
        
        If R > B 
            Max = R 
        Else 
            Max = B 
        EndIf 
    Else 
        Min = B
         
        If R > G 
            Max = R 
        Else 
            Max = G 
        EndIf 
    EndIf 
    
    If Max+Min =< 255 
        ProcedureReturn Round2((Max-Min)/(Max+Min)*240) 
    Else 
        ProcedureReturn Round2((Max-Min)/(510-(Max+Min))*240) 
    EndIf
     
EndProcedure 
qui n'est pas de moi!!!


Merci pour votre aides
Mwoua
Messages : 44
Inscription : lun. 24/oct./2005 10:28

Message par Mwoua »

Salut

Sur Wikipédia, y'a ce qu'il te faut :

http://fr.wikipedia.org/wiki/Codage_inf ... s_couleurs

Attention à bien gérer les cas spéciaux (R=V=B par exemple).
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Merci :D

mais le plus gros du travail serait de l'interpreter en PB 8O , j'y plonge
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

J'ais donc crée une procedure "Filtre_01(ValColorS)"qui permet de retirer 50% (donc de 240 on passe à 120)

mais le problème c'est que cse n'est pas du toust précis et le pire c'est qu'il modifit la valeur de la luminositée :oops: ,

donc pour ceux qui voudrons me donner un coup de main, j'ais employé une méthode bizard, je pense qu'il s'agit là d'une retouche au pire une vraie procedure qui retir 50% de la saturation d'un pixel sans modifier la lumière

Code : Tout sélectionner



Global Min$,Max$,Neutre$
Global Min,Max


ProcedureDLL Round2(Number.f) 

    x.f = Number-Round(Number,0) 
    
    If x>=0.5 
        ProcedureReturn Round(Number, 1) 
    Else 
        ProcedureReturn Round(Number, 0) 
    EndIf 
    
EndProcedure


ProcedureDLL Luminance(Color) ; luminosité 

    R = Red(Color) : G = Green(Color) : B = Blue(Color)
     
    If R < G And R < B 
        Min = R
         
        If G > B 
            Max = G 
        Else 
            Max = B 
        EndIf 
    ElseIf G < B 
        Min = G
         
        If R > B 
            Max = R 
        Else 
            Max = B 
        EndIf 
    Else 
        Min = B
         
        If R > G 
            Max = R 
        Else 
            Max = G 
        EndIf 
    EndIf
     
    ProcedureReturn Round2(240*(Max + Min)/510)
     
EndProcedure 



ProcedureDLL Saturation(Color)

    Shared Min$,Max$,Neutre$
    Shared Min,Max
 
    R = Red(Color) : G = Green(Color) : B = Blue(Color) 
    
    If R < G And R < B 
        Min = R
        Min$="rouge"
         
        If G > B 
            Max = G 
            Max$="vert"
            Neutre$="bleu"
        Else 
            Max = B
            Max$="bleu"
            Neutre$="vert" 
        EndIf 
    ElseIf G < B 
        Min = G
        Min$="vert" 
        
        If R > B 
            Max = R
            Max$="rouge" 
            Neutre$="bleu"
        Else 
            Max = B
            Max$="bleu" 
            Neutre$="rouge"
        EndIf 
    Else 
        Min = B
        Min$="bleu"
         
        If R > G 
            Max = R
            Max$="rouge"
            Neutre$="vert" 
        Else 
            Max = G
            Max$="vert"
            Neutre$="rouge" 
        EndIf 
    EndIf 
    
    If Max+Min =< 255 
        ProcedureReturn Round2((Max-Min)/(Max+Min)*240) 
    Else 
        ProcedureReturn Round2((Max-Min)/(510-(Max+Min))*240) 
    EndIf
     
EndProcedure 


Procedure Filtre_01(ValColorS)   ;<= Filtre -50% Saturation

    r=Red(ValColorS):v=Green(ValColorS):b=Blue(ValColorS)

        dt=(Max-Min)/2;:Debug dt
        
        If b<>r And b<>v And r<>v       ;:Debug "Trois valeurs différentes"
        
            If Neutre$="vert"
            
                If v>dt
                    v=v-(dt/3)
                Else
                    v=v+(dt/3)
                EndIf
                
                If Max$="rouge"
                    r=r-(dt/3)
                Else
                    b=b-(dt/3)
                EndIf
                
                If Min$="rouge"
                    r=r+(dt/3)
                Else
                    b=b+(dt/3)
                EndIf
                    
            ElseIf Neutre$="rouge"
                
                If r>dt
                    r=r-(dt/3)
                Else
                    r=r+(dt/3)
                EndIf
                                   
                If Max$="vert"
                    v=v-(dt/3)
                Else
                    b=b-(dt/3)
                EndIf
                                
                If Min$="vert"
                    v=v+(dt/3)
                Else
                    b=b+(dt/3)
                EndIf
                
            ElseIf Neutre$="bleu"
                
                If b>dt
                    b=b-(dt/3)
                Else
                    b=b+(dt/3)
                EndIf
                
                If Max$="rouge"
                    r=r-(dt/3)    
                Else
                    v=v-(dt/3)            
                EndIf
                
                If Min$="rouge"
                    r=r+(dt/3)
                Else
                    v=v+(dt/3)
                EndIf
            EndIf        
        Else                    ;:Debug "Deux valeurs égales"
        ;-----------------------------
            If r=v Or r=b
                If r=v
                    If v>b
                        r=r-(dt/3)
                        v=v-(dt/3)
                        b=b+(dt/3)                   
                    Else
                        r=r+(dt/3)
                        v=v+(dt/3)
                        b=b-(dt/3)                     
                    EndIf              
                Else
                    If b>v
                        r=r-(dt/3)
                        b=b-(dt/3)
                        v=v+(dt/3)                  
                    Else
                        r=r+(dt/3)
                        b=b+(dt/3)
                        v=v-(dt/3)
                    EndIf                 
                EndIf
            EndIf
            
            If b=v 
                
                    If v>r
                        b=b-(dt/3)
                        v=v-(dt/3)
                        r=r+(dt/3)                   
                    Else
                        r=r-(dt/3)
                        v=v+(dt/3)
                        b=b+(dt/3)                     
                    EndIf              
                
            EndIf
     
        EndIf

    ProcedureReturn RGB(r,v,b)

EndProcedure





couleur=ColorRequester()

Debug ""
Debug "******SANS FILTRE******"
Debug "Saturation: "+Str(Saturation(couleur))+" /240"
Debug "Luminance: "+Str(Luminance(couleur))+" /240"
Debug "Info:"
Debug "Rouge: "+Str(Red(couleur))
Debug "Vert: "+Str(Green(couleur))
Debug "bleu: "+Str(Blue(couleur))
Debug ""

Debug ""
Debug "******AVEC FILTRE******"
;Debug "Luminance: "+Str(Luminance(Filtre_02(couleur,90)))+" /240"
Debug "Saturation: "+Str(Saturation(Filtre_01(couleur)))+" /240"
Debug "Lumière Après Désaturation: "+Str(Luminance(Filtre_01(couleur)))+" /240"
Debug ""

ainsi je pourais continuer mon pojet :D , merci à vous
vos réactions svp :D
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

sinon j'ai trouvé ce site

http://www.easyrgb.com/math.html

ca a l'air interessant pour ton projet :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Manipuler la saturation

Message par Backup »

Fortix a écrit :Salutation,

Quelqu'un aurais une procedure qui permet de manipuler la saturation d'une couleur:

par exemple si la valeure de la saturation est < 120 et bien la valeur devient 120, idem si elle est > et qui renvoit la nouvelle couleur
tu veux quoi en fait ?

j'ai une procedure qui eclaircie ou fonce une couleur c'est ça que tu veux ?
"couleur luminosity"
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Arrg c'est domage Case :x , ton tyau est très intéressant mais il ne traite pas de la saturation, c'est domage , c'est domage :oops: , et pourtant c'est la partie la plus dûre


Dobro, je veux juste trouver un moyen de manipuler la saturation d'une couleur le plus précisement possible, pour être précis :

-je veux dans un premier temps retirer 50% quelques soit la saturation capturé;

ça sera un très grand pas pour moi et surtous celà me permettra d'analiser la technique employer pour manipuler la Sat; ensuite je pourais voler de mes ailes

merci pour vos interventions :D

Note: actuellement je pense avoir trouvé une vague solution pour manipuler se dernier en observant des résultas:

si R=0 et V=0 et B=0
alors Sat=0

si R=255 et V=255 et B=255
alors Sat=0

si R<>0 et V<>0 et B<>0
alors Sat<>0

si R=V ou R=B et V<>B
alors Sat<>0






merci pour vos interventions :D
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Essai ça :

Code : Tout sélectionner

;======================================
;=             Saturation             =
;======================================

Procedure.c Min(v1.c,v2.c)
If v1 > v2
ProcedureReturn v2
Else
ProcedureReturn v1
EndIf
EndProcedure

Procedure.c Max(v1.c,v2.c)
If v1 > v2
ProcedureReturn v1
Else
ProcedureReturn v2
EndIf
EndProcedure


Procedure.d RGB_TO_SAT(R.c, V.c, B.c)
  Color1.d = Min(Min(R, V), B)
  Color2.d = Max(Max(R, V), B)
  c.d = (Color1 + Color2) / 2
  
  If c = 0 Or c = 255
    ProcedureReturn 0
  Else
    If c < 256 / 2
      ProcedureReturn (240 * (c - Color1) / (c - 0))
    Else
      ProcedureReturn (240 * (Color2 - c) / (256 - c))
    EndIf
  EndIf
EndProcedure

Debug RGB_TO_SAT(130,150,200)


Et pour aller de la saturation à la couleur, il faut ajouter la Teinte + luminosité.

En gros, Couleur = Contraste (saturation) + teinte + luminosité.


:)
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Merci Mytic, :D , je pense qu'on ne pourra jamais être plus précis que toi :lol:



il ne reste plus qu'à trouver un moyen de retirer 50% de la saturation obtenu et de manipule les trois canaux RVB individuellement pour augmenter ou diminuer




Plus la valeur de l'écart entre la valeur de la couleur Max et celle de la valeur Min est grande et plus c'est Saturé et inverse





merci pour vos réactions :D
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Voilà tous les outils pour manipuler la saturation : :D

Code : Tout sélectionner

;======================================
;=           Saturation 2             =
;======================================

Procedure.c Min(v1.c,v2.c)
If v1 > v2
ProcedureReturn v2
Else
ProcedureReturn v1
EndIf
EndProcedure

Procedure.c Max(v1.c,v2.c)
If v1 > v2
ProcedureReturn v1
Else
ProcedureReturn v2
EndIf
EndProcedure


Procedure.d RGB_TO_SAT(R.c, V.c, B.c)
  Color1.d = Min(Min(R, V), B)
  Color2.d = Max(Max(R, V), B)
  c.d = (Color1 + Color2) / 2
  
  If c = 0 Or c = 255
    ProcedureReturn 0
  Else
    If c < 256 / 2
      ProcedureReturn (240 * (c - Color1) / (c - 0))
    Else
      ProcedureReturn (240 * (Color2 - c) / (256 - c))
    EndIf
  EndIf
EndProcedure

Procedure.d RGB_TO_HUE(R, V, B)
  sens.l = 0
  plage.l = 0
  Proportion.d = 0
  Color1.d = Min(Min(R, V), B)
  Color2.d = 0
  Color3.d = Max(Max(R, V), B)
  
  If V = Color1 And R = Color3 : Plage = 6: Color2 = B: sens = -1: EndIf
  If V = Color1 And B = Color3 : Plage = 4: Color2 = R: sens = 1: EndIf
  If R = Color1 And B = Color3 : Plage = 4: Color2 = V: sens = -1: EndIf
  If R = Color1 And V = Color3 : Plage = 2: Color2 = B: sens = 1: EndIf
  If B = Color1 And V = Color3 : Plage = 2: Color2 = R: sens = -1: EndIf
  If B = Color1 And R = Color3 : Plage = 0: Color2 = V: sens = 1: EndIf
  
  If Color3 = Color1
    Proportion = 0
  Else
    Proportion = (Color2 - Color1) / (Color3 - Color1)
  EndIf
  
  ProcedureReturn (240 * (Plage + sens * Proportion) / 6)
EndProcedure

Procedure.d RGB_TO_INT(R, V, B)
 
  Color1.d = Min(Min(R, V), B)
  Color3.d = Min(Min(R, V), B)
  
  ProcedureReturn (240 * ((Color1 + Color3) / 2) / 255)
EndProcedure

Procedure.l HSI_TO_Color(H.d,S.d,I.d)
  HB.b = H
  ColorL.d = 0
  ColorH.d = 0
  Plage.c = (H - 0.5) / 40    
      
  Proportion.l = (HB % 40) / 40  
  
  Select Plage
  Case 0: R = 1: B = 0: V = Proportion
  Case 1: V = 1: B = 0: R = 1 - Proportion
  Case 2: V = 1: R = 0: B = Proportion
  Case 3: B = 1: R = 0: V = 1 - Proportion
  Case 4: B = 1: V = 0: R = Proportion
  Case 5: R = 1: V = 0: B = 1 - Proportion
  EndSelect
  
  If I < 240 / 2 
    ColorL = (I / 240) * (1 - (S / 240))
    ColorH = (I / 240) * (1 + (S / 240))
  Else
    ColorL = (I / 240) - (1 - (I / 240)) * (S / 240)
    ColorH = (I / 240) + (1 - (I / 240)) * (S / 240)
  EndIf
  
  Rouge.c = 255 * (ColorL + R * (ColorH - ColorL))
  Vert.c = 255 * (ColorL + V * (ColorH - ColorL))
  Bleu.c = 255 * (ColorL + B * (ColorH - ColorL))
  ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure

Debug RGB_TO_SAT(130,150,200)
:idea:
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Les Pros sont des pros :D ,merci Mytic
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Salut @Mytic

j'ais un topic à problème concernant la manip avancée de la Saturation sur ce lien:
http://www.purebasic.fr/french/viewtopic.php?t=9089

tu peux nous rejoindre et nous aider stp :lol:

merci :D
Répondre