Page 1 sur 1

Analyser une image

Publié : lun. 26/sept./2011 14:35
par dayvid
Hello !

Bien voilà, je rencontre un petit problème gênant
Je lit une image avec Point(), Cependant plus l'image est grande et plus c'est long, normale me direz-vous !

Alors je décide de découper l'image en 4 sous image en me disant que si je lit chacune d'elle
en même temps grâce a des thread, sa ira bien plus vide mais StartDrawing ne peut pas le faire
car il ne peut faire qu'une seule opération a la fois sur une surface et il est là le problème
car si je pouvais faire StartDrawing avec point() en même temps sur chacune des images
ça irais bien plus vite !

J'ai été asses clair ?

Bref j'ai commencer ceci qui fonctionne très bien
une procédure pour 1 image (4 au totale) car sa va un peut plus vite comme ça
que si c'étais une seule image car j'ai essayer avec des thread grâce des sémaphores
mais c'est pas bien, trop lent, il s'emmêle les pinceaux

Code : Tout sélectionner

Enumeration 1
  #Image
  #Image1
  #Image2
  #Image3
  #Image4
EndEnumeration

Global NewList CouleurImage.l()

Global LargeurImage
Global HauteurImage

Enumeration 10
  #Fenetre
EndEnumeration

Procedure Fenetre()
  If OpenWindow(#Fenetre, 327, 177, 500, 300, "Fenêtre windows",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar | #PB_Window_SizeGadget)
    
    Shared LargeurImage1, HauteurImage1
    
    If IsImage(#Image1)
      ImageGadget(11, 10, 10, 1, 1, ImageID(#Image1))
      ImageGadget(12, 10 + LargeurImage1, 10, 1, 1, ImageID(#Image2))
      ImageGadget(13, 10, 10 + HauteurImage1, 1, 1, ImageID(#Image3))
      ImageGadget(14, 10 + LargeurImage1, 10 + HauteurImage1, 1, 1, ImageID(#Image4))
    EndIf
    
    Repeat ; Départ des évènements de boucle
      
      Event = WaitWindowEvent(1) ; Cette ligne attend pendent (Minuteur) qu'un évènement soit recus par la fenêtre
      
    Until Event = #PB_Event_CloseWindow ; Fin des évènements de boucle
    
  EndIf
EndProcedure

; Procedure de chargement d'une image
Procedure.l ChargementImage(NumeroImage)
  
  UsePNGImageDecoder()
  
  Chargement_Image:
  Filtre$ = "Image Bmp (*.Bmp)|*.Bmp|Image Png (*.Png)|*.Png|Image Jpeg (*.Jpeg)|*.Jpeg"
  FichierImage$ = OpenFileRequester("Choisissez un fichier à charger", GetHomeDirectory() + "Bureau\", Filtre$, 0)
  
  If FichierImage$
    
    If FindString(GetFilePart(FichierImage$), ".bmp", 1) Or FindString(GetFilePart(FichierImage$), ".png", 1) Or FindString(GetFilePart(FichierImage$), ".jpeg", 1)
      ; Ok
    Else
      MessageRequester("Fichier invalide !", "      Veuillez choisir un fichier d'image invalide !", 48)
      ProcedureReturn 0
    EndIf
    
    If LoadImage(NumeroImage, FichierImage$) <> 0
      ProcedureReturn LoadImage(NumeroImage, FichierImage$)
    Else
      MessageRequester("Erreur de chargement !", "      Impossible de charger le fichier " + Chr(34) + GetFilePart(FichierImage$) + Chr(34) + " !", 16)
      ProcedureReturn 0
    EndIf
    
  EndIf
  
  ProcedureReturn 0
EndProcedure

Procedure TraitementImage1()
  
  Shared LargeurImage1, HauteurImage1, LargeurImage2, HauteurImage2, ProfondeurImage
  
  GrabImage(#Image, #Image1, 0, 0, LargeurImage1, HauteurImage1)
  
  StartDrawing(ImageOutput(#Image1))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  
  X1 = 0
  Y1 = 0
  
  Repeat
    
    AddElement(CouleurImage())
    CouleurImage() = Point(X1, Y1)
    
    If X1 <> LargeurImage1 - 1
      X1 + 1
    Else
      X1 = 0
      Y1 + 1
    EndIf
    
  Until X1 = LargeurImage1 - 1 And Y1 = HauteurImage1 - 1
  
  StopDrawing()
  
EndProcedure

Procedure TraitementImage2()
  
  Shared LargeurImage1, HauteurImage1, LargeurImage2, HauteurImage2, ProfondeurImage
  
  GrabImage(#Image, #Image2, LargeurImage1, 0, LargeurImage2, HauteurImage1)
  
  StartDrawing(ImageOutput(#Image2))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  
  X2 = 0
  Y2 = 0
  
  Repeat
    
    AddElement(CouleurImage())
    CouleurImage() = Point(X2, Y2)
    
    If X2 <> LargeurImage2 - 1
      X2 + 1
    Else
      X2 = 0
      Y2 + 1
    EndIf
    
  Until X2 = LargeurImage2 - 1 And Y2 = HauteurImage1 - 1
  
  StopDrawing()
  
EndProcedure

Procedure TraitementImage3()
  
  Shared LargeurImage1, HauteurImage1, LargeurImage2, HauteurImage2, ProfondeurImage
  
  GrabImage(#Image, #Image3, 0, HauteurImage2, LargeurImage1, HauteurImage2)
  
  StartDrawing(ImageOutput(#Image3))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  
  X3 = 0
  Y3 = 0
  
  Repeat
    
    AddElement(CouleurImage())
    CouleurImage() = Point(X3, Y3)
    
    If X3 <> LargeurImage1 - 1
      X3 + 1
    Else
      X3 = 0
      Y3 + 1
    EndIf
    
  Until X3 = LargeurImage1 - 1 And Y3 = HauteurImage2 - 1
  
  StopDrawing()
  
EndProcedure

Procedure TraitementImage4()
  
  Shared LargeurImage1, HauteurImage1, LargeurImage2, HauteurImage2, ProfondeurImage
  
  GrabImage(#Image, #Image4, LargeurImage1, HauteurImage2, LargeurImage2, HauteurImage2)
  
  StartDrawing(ImageOutput(#Image4))
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  
  X4 = 0
  Y4 = 0
  
  Repeat
    
    AddElement(CouleurImage())
    CouleurImage() = Point(X4, Y4)
    
    If X4 <> LargeurImage2 - 1
      X4 + 1
    Else
      X4 = 0
      Y4 + 1
    EndIf
    
  Until X4 = LargeurImage2 - 1 And Y4 = HauteurImage2 - 1
  
  StopDrawing()
  
EndProcedure

Procedure CouleurPlusUtiliser()
  
EndProcedure

Procedure CouleurMoinsUtiliser()
  
EndProcedure

; Procedure pour inspecter l'image
Procedure AnalyseImage()
  
  Shared LargeurImage1, HauteurImage1, LargeurImage2, HauteurImage2, ProfondeurImage
  
  If IsImage(#Image)
    
    Debug "------------------------------------------------------------------------------------------------------------------"
    Debug "Largeur de l'image = " + Str(LargeurImage)
    Debug "Hauteur de l'image = " + Str(HauteurImage)
    Debug "Nombre de pixel de l'image: " + Str(LargeurImage * HauteurImage)
    Debug "Profondeur de l'image = " + Str(ProfondeurImage) + " Bit"
    Debug "------------------------------------------------------------------------------------------------------------------"
    Debug "Découpage de l'image principale en 4 sous image..."
    Debug ""
    TI1 = ElapsedMilliseconds()
    TraitementImage1()
    TI2 = ElapsedMilliseconds()
    Debug "Dimention de l'mage 1: Largeur = " + Str(LargeurImage1) + ", Hauteur = " + Str(HauteurImage1)
    Debug "Temps de traitement de l'image 1: " + Str(TI2 - TI1) + " MilliSecondes"
    Debug ""
    TI3 = ElapsedMilliseconds()
    TraitementImage2()
    TI4 = ElapsedMilliseconds()
    Debug "Dimention de l'mage 2: Largeur = " + Str(LargeurImage2) + ", Hauteur = " + Str(HauteurImage1)
    Debug "Temps de traitement de l'image 2: " + Str(TI4 - TI3) + " MilliSecondes"
    Debug ""
    TI5 = ElapsedMilliseconds()
    TraitementImage3()
    TI6 = ElapsedMilliseconds()
    Debug "Dimention de l'mage 3: Largeur = " + Str(LargeurImage1) + ", Hauteur = " + Str(HauteurImage2)
    Debug "Temps de traitement de l'image 3: " + Str(TI6 - TI5) + " MilliSecondes"
    Debug ""
    TI7 = ElapsedMilliseconds()
    TraitementImage4()
    TI8 = ElapsedMilliseconds()
    Debug "Dimention de l'mage 4: Largeur = " + Str(LargeurImage2) + ", Hauteur = " + Str(HauteurImage2)
    Debug "Temps de traitement de l'image 4: " + Str(TI8 - TI7) + " MilliSecondes"
    Debug "------------------------------------------------------------------------------------------------------------------"
    TempsTotaleAnalyse = TI2 - TI1 + TI4 - TI3 + TI6 - TI5 + TI8 - TI7
    Debug "Temps moyen de traitement: " + Str(TempsTotaleAnalyse / 4) + " MilliSecondes"
    Debug "Temps totale de traitement des 4 image: " + Str(TempsTotaleAnalyse) + " MilliSecondes"
    Debug "------------------------------------------------------------------------------------------------------------------"
    Debug "Trie de la liste en court..."
  EndIf
  
  TT1 = ElapsedMilliseconds()
  SortList(CouleurImage(), #PB_Sort_Descending)
  TT2 = ElapsedMilliseconds()
  
  TempsTrie = TT2 - TT1
  TempsTotale = TempsTotaleAnalyse + TempsTrie
  
  Debug "Temps de trie de la liste de couleur: " + Str(TempsTrie) + " MilliSecondes"
  Debug "------------------------------------------------------------------------------------------------------------------"
  Debug "Temps de traitement totale: " + Str(TempsTotale) + " MilliSecondes"
  Debug "------------------------------------------------------------------------------------------------------------------"
  
EndProcedure

If ChargementImage(#Image)
  
  ProfondeurImage = ImageDepth(#Image, #PB_Image_OriginalDepth)
  
  LargeurImage = ImageWidth(#Image)
  HauteurImage = ImageHeight(#Image)
  
  LargeurImage1 = Round(LargeurImage / 2, #PB_Round_Down)
  LargeurImage2 = Round(LargeurImage / 2, #PB_Round_Up)
  HauteurImage1 = Round(HauteurImage / 2, #PB_Round_Down)
  HauteurImage2 = Round(HauteurImage / 2, #PB_Round_Up)
  
  AnalyseImage()
  Fenetre()
  
EndIf

Re: Analyser une image

Publié : lun. 26/sept./2011 16:51
par falsam
Quel est la taille de ton image pour qu'elle justifie d’être couper en 4 ?

Re: Analyser une image

Publié : ven. 30/sept./2011 14:07
par dayvid
Peut importe @falsam, oui peut importe tu voie car çava plus vite ainsi, si je pouvais même la couper en 8, 16, 32, 64, 128, 256, 512, 1024, etc je le ferais :lol:
Bon dison juste en 8 pour commencer, oui car les routine von plus vite ! :)

Re: Analyser une image

Publié : ven. 30/sept./2011 15:47
par venom
j'ai pas testé le code, mais si tu debug en allant forcement ça va te prendre un temps fou :wink:
essaie en enlevant les ligne debug pour voir.

moi j'ai un code qui me redessine une image pixel par pixel de 3648x2736 en a peine 5sec se qui est pas mal je trouve.

Âpres oui, je pense que de divisé le travail peut en effet faire gagner du temps.




@++

Re: Analyser une image

Publié : ven. 30/sept./2011 16:04
par Geo Trouvpatou
@Venom : Pas la peine d'enlever les lignes de débug, il suffit de désactiver le bouton "Utiliser le déboggueur" ou mettre "DisableDebugger" en début de code :wink: .

Bye.

Re: Analyser une image

Publié : ven. 30/sept./2011 16:09
par venom
oui fin vous m'avez compris :mrgreen:






@++

Re: Analyser une image

Publié : sam. 15/oct./2011 16:43
par dayvid
Ok, merci bien !

Sinon quoi d'autre ?

Re: Analyser une image

Publié : dim. 16/oct./2011 15:50
par Le Soldat Inconnu
Utiliser ma librairie Effect :)

Dedans, il y a un code pour lire une image 10 fois plus vite. Tu trouveras un exemple également.

Re: Analyser une image

Publié : lun. 17/oct./2011 13:48
par dayvid
Merci @Le Soldat Inconnu

Tous est dedans, j'ai le droit de l'étudier, de copier du code que je veut, de modifier a ma guise ? :)

Re: Analyser une image

Publié : lun. 17/oct./2011 16:28
par Le Soldat Inconnu
C'est fait pour :D

Re: Analyser une image

Publié : mer. 19/oct./2011 15:21
par dayvid
Super, c'est gentil ça :D

Hum dit moi LSI toi qui est balaise
tu voudrait pas m'aider un peut si le temps te le permet ?

Comment tu fait pour:

Charger une image a la vitesse de l'éclair comme pour les fichier texte ?
Comment enregistrer très vite une image
Comment je peut dessiner sur plusieurs surface en même temps (Plusieurs StartDrawing)



...