Page 1 sur 1

Manipuler la saturation

Publié : sam. 15/déc./2007 23:35
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

Publié : dim. 16/déc./2007 16:16
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).

Publié : lun. 17/déc./2007 11:55
par Fortix
Merci :D

mais le plus gros du travail serait de l'interpreter en PB 8O , j'y plonge

Publié : dim. 23/déc./2007 20:57
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

Publié : dim. 23/déc./2007 22:49
par case
sinon j'ai trouvé ce site

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

ca a l'air interessant pour ton projet :)

Re: Manipuler la saturation

Publié : dim. 23/déc./2007 23:35
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"

Publié : lun. 24/déc./2007 21:06
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

Publié : mar. 25/déc./2007 16:24
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é.


:)

Publié : mar. 25/déc./2007 17:11
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

Publié : mar. 25/déc./2007 17:56
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:

Publié : mar. 25/déc./2007 18:23
par Fortix
Les Pros sont des pros :D ,merci Mytic

Publié : ven. 06/mars/2009 12:26
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