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
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

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

(faut comparer ce qui est comparable au final vu que tu auras un intervalle plus grand)