Page 1 sur 1

Déterminer si une image est foncée

Publié : jeu. 26/mars/2009 6:54
par Anonyme2
J'aimerais dessiner un cadre autour d'une image mais si l'image est foncée, le cadre sera clair, si l'image est claire, le cadre devra être foncée.

Pour ceux qui tripotent des images (plus que moi), existe-t-il des formules pour déterminer ça, la précision n'a pas un importance capitale, il faut simplement que le cadre soit visible sur le fond.

Merci

Publié : jeu. 26/mars/2009 18:11
par nico
L'idée qui me vient à l'esprit pour réaliser ça, serait de passer l'image en niveau de gris, de la réduire, comptabiliser les pixels en valeur et faire une moyenne.

Publié : jeu. 26/mars/2009 23:43
par Ollivier
Même idée que nico, que je salue au passage, mais sans la mise en niveau de gris, vu qu'une moyenne générale de l'image est une mise en niveau de gris indirecte.

Utiliser un quad qui va accumuler les valeurs.

"Piquer" 1000 pixels au hasard de l'image

Code : Tout sélectionner

Define Accu.Q

for i = 1 to 1000
   X = random(imagewidth(n) - 1)
   Y = random(imageheight(n) - 1)
   Couleur = point(X, Y)
   for j = 1 to 3
      Accu + Couleur & $FF
      Couleur >> 8
   next j
next i

Couleur / 3000
Couleur est un coef entre 0 et 255.

Publié : ven. 27/mars/2009 5:00
par Anonyme2
Merci pour votre aide, je vais faire des essais.

Publié : ven. 27/mars/2009 7:20
par cederavic
Je pense qu'il vaudra mieu calculer la luminosité sur les bordures seulement de l'image, car elle peut tres bien etre dans l'ensemble tres claire mais avec des bordures foncées.
Il y a pas longtemps j'ai vu un post sur le calcule des teintes / saturation / luminosité, ça devrait t'aider : http://www.purebasic.fr/french/viewtopi ... ght=teinte

Publié : ven. 27/mars/2009 7:37
par Anonyme2
Merci cederavic (ça fait un bail ...) et ça fait plaisir de te lire à nouveau.

je pensais faire la moyenne mais seulement sur le bord car je me disais que la moyenne sur l'image totale n'était pas forcément le plus adapté pour entourer une image.

Je vais regarder ton lien.

Publié : ven. 27/mars/2009 12:53
par cederavic
Denis a écrit :Merci cederavic (ça fait un bail ...) et ça fait plaisir de te lire à nouveau.

je pensais faire la moyenne mais seulement sur le bord car je me disais que la moyenne sur l'image totale n'était pas forcément le plus adapté pour entourer une image.

Je vais regarder ton lien.
C'est exactement ce que je te disais :lol:
Je pourcours toujours le forum de temps en temps, même si je suis beaucoup moin présent qu'avant...

C'est quelque chose dans ce genre que tu cherche ?

Code : Tout sélectionner


UsePNGImageDecoder()
UseJPEGImageDecoder()
UseTIFFImageDecoder()
UseJPEG2000ImageDecoder()
UseTGAImageDecoder()

Procedure Max(R, G, B)
  If R >= G And R >= B
    ProcedureReturn R
  ElseIf G >= R And G >= B
    ProcedureReturn G
  ElseIf B >= R And B >= G
    ProcedureReturn B
  EndIf
EndProcedure

Procedure Min(R, G, B)
  If R <= G And R <= B
    ProcedureReturn R
  ElseIf G <= R And G <= B
    ProcedureReturn G
  ElseIf B <= R And B <= G
    ProcedureReturn B
  EndIf
EndProcedure

Procedure.f Luminance(Color)

  R = Red(Color) : G = Green(Color) : B = Blue(Color)
  Mmax = Max(R, G, B)
  Mmin = Min(R, G, B)
  
  Lum.f = (Mmax + Mmin) / 510 * 240
  ProcedureReturn Lum

EndProcedure

If LoadImage(0, OpenFileRequester("Charger une image", "", "Image|*.bmp;*.png;*.jpg;*.tga|All|*.*", 0))
  ResizeImage(0, 425, 320, #PB_Image_Smooth)
  CopyImage(0, 1)
  
  Lum.f
  
  StartDrawing(ImageOutput(0))
    
    For x = 0 To 425
      For y = 0 To 5
 
        Lum + Luminance(Point(x, y))
      
      Next
    Next
    
    For x = 0 To 425
      For y = 315 To 320
 
        Lum + Luminance(Point(x, y))
      
      Next
    Next
    
    For x = 0 To 5
      For y = 5 To 315
 
        Lum + Luminance(Point(x, y))
      
      Next
    Next
    
    For x = 420 To 425
      For y = 5 To 315
 
        Lum + Luminance(Point(x, y))
      
      Next
    Next
    
    Lum / 10224
    Lum = 128 - Lum / 2
  
  StopDrawing()
  
  Color = RGB(Lum, Lum, Lum)
  
  StartDrawing(ImageOutput(1))
    Box(0, 0, 425, 5, Color)
    Box(0, 315, 425, 5, Color)
    Box(0, 5, 5, 315, Color)
    Box(420, 5, 5, 315, Color)
  StopDrawing()
  
  OpenWindow(#PB_Any, 0, 0, 850, 320, "Contourage", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ImageGadget(0, 0, 0, 425, 320, ImageID(0))
    ImageGadget(1, 425, 0, 425, 320, ImageID(1))
    
  Repeat
  
    Delay(20)
    
  Until WindowEvent() = #WM_CLOSE

Else
  MessageRequester("Erreur", "Impossible d'ouvrir l'image")
EndIf


Publié : mer. 22/avr./2009 18:43
par Le Soldat Inconnu
A la bourre pour la réponse, je tombe sur ce sujet en recherchant autre chose

Moi, avec mes essais sur les images et couleur, pour savoir si c'est clair ou foncé, le plus simple reste de simplement additionné les couches R G B

en gros, si tu as une couleur RGB(124, 255, 64)
Tu ajoutes 124 + 255 + 64

plus la valeur est forte et plus c'est clair.

0 -> noir
765 -> blanc

l'idée du niveau de gris n'est pas bête mais elle ajoute une division par 3 à ce calcul

Donc pour la rapidité, un simple ajout :)

Publié : mer. 22/avr./2009 22:57
par cederavic
Le probleme avec ta methode d'adition c'est que rgb 85, 85, 85 aura le même resultat que rgb 255, 0, 0 qui lui est pourtant beaucoup plus clair.
C'est pas pour rien qu'il y a la Luminance / Teinte / Saturation :P

Publié : jeu. 23/avr./2009 1:20
par minirop
Le Soldat Inconnu a écrit :l'idée du niveau de gris n'est pas bête mais elle ajoute une division par 3 à ce calcul
et alors ? tu divises pas par 3 et ça revient au même :roll: (faut comparer ce qui est comparable au final vu que tu auras un intervalle plus grand)