Déterminer si une image est foncée

Sujets variés concernant le développement en PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Déterminer si une image est foncée

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Merci pour votre aide, je vais faire des essais.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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

Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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 :)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message 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
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Message 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)
Répondre