Creer une mosaique à partir d'une image

Signaler
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
-
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
-
Bonjour,

je suis occupé depuis un moment sur un programme pour créer des mosaiques à partir d'une image un peu comme celle ci http://gillardg.deviantart.com/art/Ann-so-M-126477495

j'ai donc commencé par me créer une liste d'images (Pix), avec la couleur dominante,
le problème que je rencontre c'est au moment de comparer le pixel de l'image principale avec la couleur dominante des images de (pix)

impossible de trouver 2 couleurs les mêmes pourtant je m'étais dit qu'avec 10000 images ça devrait marcher :)
quelqu'un aurait il une idée??

9 réponses

Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Heu... je pige rien du tout la, tu peux détailler ? Pas de source, pas de programme, pas de code, Juste une image...
 
Peut être sur www.devinsfrance.com ^^

Plus serieusement, expose mieux ton problème si tu veux de l'aide.

@+ Mayzz.
                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
Bonjour,
bonjour , je pensais que l'image était parlante :) 1 chaque image à une couleur dominante que l'on peut déduire avec un algo simple et arbitraire
je fais donc un tableau avec la structure thumb
avec 10000 images :) 

'struct thumb = filename + dominant color

Public
Structure thumb
Dim FilePath AsString

Dim colo As Color
EndStructure

maintenant j'ouvre une image  on va l'apeler bmp
que je mets dans un tableau de structure pixel
'struct pixel = position + color

PublicStructure pixel
Dim x AsInteger

Dim y AsInteger

Dim col As Color
EndStructurepour créer une mosaique à partir de bmp : mosaic qui sera une représentation de bmp ou chaque pixel de l'image sera un carré de 50*50 ( thumb )

 mosaic sera donc 50 X plus grand
pour chaque pixel trouver dans tableau thumb couleur correspondante  ( c'est la que j'ai un problème car tout le reste fonctionne )

j'ai un tableau de structure contennant  10000 images qui ont chacune une couleur dominante
j'ai un tableau de pixel  contenant  10000 pixel ce qui me donnera une mosaic de 5000*5000
mais impossible de trouver les couleurs correspondantes
j'ai pensé peut être limiter le nombre de couleurs aux couleur WEB mais comment trouver la couleur web la plus proche de la couleur thumb et la couleur web la plus proche de la couleur pixel ??

mettre thumb
dans mosaic
  position = pixel.x*50 pixel.y*50

a+
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Tu souhaite donc remplacer un pixel par une image, ok

Petite correction 10000 * 50 = 500 000 ^^

Pour commencer, tu peux travailler avec les pixels en mode RGB, ou en mode HSB, le problème vien du fait qu'il va faloir substituer des couleurs, car ta palette d'image est restreinte par rapport au couleurs 24Bits (je ne compte pas le Plan Alpha).

Si tu part du principe qu'un pixel est composé de 3Bytes (toujours sans compter le plan A), un pour le Rouge, un pour le vert, et un pour le bleu, cela te donne donc une palette de 255 ^ 3 = 16 581 375, on est donc loin de ta palette de 10 000...

Chacune des images de ton tableau devra donc être marqué pour appartenir non pas à une couleur, mais à une fourchette de couleur à fin de réduire cette palette, pour le calcul, je ne sais pas vraiement, et je t'avoue que ca m'a l'air assez complexe, de plus je n'ai pas le temps de me penché la dessus...

Petit conseil, récupere les pixels de ton image sous forme de System.Drawing.Color, celle ci te donnerai les infos sur le RGB/HSB sans avoir de code à saisir. Pour moi le plus simple serait de travailler avec le HSB étant donné que tu va subtituer des couleurs, je pense qu'il faut prendre en compte que la teinte devrat être respecté, mais ton image aura moins de précision quand à la saturation et à la luminosité.
 





                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
salut , merci pour ta réponse ,
j'ai trouvé plus simple , une petite classe qui trouve la webcolor la plus proche, ça limite évidement le résultat mais c'est pas trop grave :)

voici le code mais c'est pas parfait , à mon sens on peut faire encore mieux
'
' * This code is provided "as is". Without any warranty.
'
Imports System
Imports System.Collections
Imports System.Drawing
Imports System.Reflection

Public NotInheritable Class ColorManagement
Private Shared WebColors As ArrayList
''' <summary>
''' Returns the "nearest" color from a given "color space"
''' </summary>
''' The color to be approximated
''' <returns>The nearest color</returns>
Private Sub New()
End Sub
Public Shared Function GetNearestWebColor(ByVal input_color As Color) As Color
' get the colorspace as an ArrayList
WebColors = GetWebColors()
' initialize the RGB-Values of input_color
Dim dbl_input_red As Double = Convert.ToDouble(input_color.R)
Dim dbl_input_green As Double = Convert.ToDouble(input_color.G)
Dim dbl_input_blue As Double = Convert.ToDouble(input_color.B)
' the Euclidean distance to be computed
' set this to an arbitrary number
' must be greater than the largest possible distance (appr. 441.7)
Dim distance As Double = 500.0
' store the interim result
Dim temp As Double
' RGB-Values of test colors
Dim dbl_test_red As Double
Dim dbl_test_green As Double
Dim dbl_test_blue As Double
' initialize the result
Dim nearest_color As Color = Color.Empty
For Each o As Object In WebColors
' compute the Euclidean distance between the two colors
' note, that the alpha-component is not used in this example
dbl_test_red = Math.Pow(Convert.ToDouble((CType(o, Color)).R) - dbl_input_red, 2.0)
dbl_test_green = Math.Pow(Convert.ToDouble((CType(o, Color)).G) - dbl_input_green, 2.0)
dbl_test_blue = Math.Pow(Convert.ToDouble((CType(o, Color)).B) - dbl_input_blue, 2.0)
temp = Math.Sqrt(dbl_test_blue + dbl_test_green + dbl_test_red)
' explore the result and store the nearest color
If temp < distance Then
distance = temp
nearest_color = CType(o, Color)
End If
Next o
' done :-)
Return nearest_color
End Function
''' <summary>
''' Returns an ArrayList filled with "WebColors"
''' </summary>
''' <returns>WebColors</returns>
''' <remarks>Many thanks to Julijan Sribar for his excellent article (http://www.codeproject.com/cs/miscctrl/MultiTabColorPicker.asp)</remarks>
Private Shared Function GetWebColors() As ArrayList
Dim color As Type = (GetType(Color))
Dim propertyInfos() As PropertyInfo = color.GetProperties(BindingFlags.Public Or BindingFlags.Static)
Dim colors As New ArrayList()
For Each pi As PropertyInfo In propertyInfos
If pi.PropertyType.Equals(GetType(Color)) Then
Dim c As Color = CType(pi.GetValue(CObj(GetType(Color)), Nothing), Color)
colors.Add(c)
End If
Next pi
Return colors
End Function
End Class
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
décidément la freetxtbox n'aime pas chrome , ou est ce le contraire ???

svp pourrais on avoir une freetextbox compatible chrome ??mdr
je vais poser la question à google pour voir si on peut rendre chrome compatible avec la freetextbox
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
D'après une infos des admins le nouveau site est en cours de développement... (Ya pas que chrome, ya Opéra et IE8 en mode normal aussi...)

Sinon pour le code, d'après ce que je peux voir il convertit les couleurs 24/32 en couleurs web ? Mais cela ne va pas trop réduire ta palette ???

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
ça réduit à 141 :(
mais j'ai pas d'autres idées pour l'instant.
si tu vois un moyen simple de faire une palette de disons 2560 couleurs, je suis preneur :)
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
ben heu... en fait non, mis à part ce que j'ai posté plus haut...

Sinon diviser les Bytes de couleur / 16, ce qui donne 256 / 16 = 16

Puis une palette de 4096 soit 16 ^ 3

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
ben oui l'idée est vraiment bonne :)
faut juste trouver les images pour ce faire
vais essayer :)