Analyser une image

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Analyser une image

Message 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
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Analyser une image

Message par falsam »

Quel est la taille de ton image pour qu'elle justifie d’être couper en 4 ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Analyser une image

Message 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 ! :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Analyser une image

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




@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: Analyser une image

Message 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.
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Analyser une image

Message par venom »

oui fin vous m'avez compris :mrgreen:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Analyser une image

Message par dayvid »

Ok, merci bien !

Sinon quoi d'autre ?
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Analyser une image

Message 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.
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)]
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Analyser une image

Message 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 ? :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Analyser une image

Message par Le Soldat Inconnu »

C'est fait pour :D
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)]
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Analyser une image

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



...
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Répondre