Bonjour,
Pour un projet, je dois calculer le bruit dans une image 12 millions de pixel. Pour avoir une mesure représentative je dois acquérir 100 images que je dois traiter par la suite avec scilab. Ce qui nous fait 1,2 milliards de point à charger.
Pour réduire le nombre de point à charger j'ai divisé cette image en 56 images de 384 x 512 pixel. Je dispose donc de 56 dossiers, contenant 100 fichiers de données enregistrés au format csv (séparateur = ","). J'ai choisit le format csv car je n'ai pas réussit à importer les données en format *.txt ...
Le but du programme que j'ai implémenter est donc de parcourir les 56 dossiers, ouvrir les 100 fichiers. Je me retrouve donc avec une hypermatrice de dimensions (384 x 512 x 100).
Ensuite, je calcul en chaque point la variance sur les 100 points. Le résultat est donc une matrice de variance de dimensions (384 x 512). Celle-ci est enregistrée dans un fichier *txt
Voici mon problème :
la quantité importante de données nécessite une utilisation importante de la mémoire de l'ordinateur.
Le programme parvient à réaliser un tour de boucle, donc le traitement statiistique d'un dossier. Arrivé au second, une erreur d'allocation mémoire est renvoyée. Pour éxecuter à nouveau le programme il me faut redémarrer Scilab pour libérer la mémoire.
J'aimerai pouvoir libérer la mémoire à la fin de la boucle pour ne pas avoir à intervenir pendant le traitement des 56 dossiers. Par l'utilisation de fonctions scilab (clear ne suffit pas avec l'utilisation que j'en fait). Si non par l'implémentation de fonction en C (malloc, halloc) que je ne connais pas très bien.
Voici le code scilab que j'ai implenté
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 clc; clear all; //augmentation taille pile stacksize(10.1^8); nom_repertoire = "K:\"//modifier selon le repertoire à ouvrir dossier = input("Saisir le dossier dans lequel se trouve l"'""ensemble des données images :","string") nom_repertoire = nom_repertoire + dossier clear dossier; ListFolder = dir(nom_repertoire)//Liste le contenue du dossier FolderName = ListFolder(2) //Recupère le nom des dossiers [NbrFolder,x] = size(FolderName) // Recupère le nombre de dossiers clear x; for i = 1:1:NbrFolder A = int(zeros(384,512,100)) // déclaration hypermatrice TargetFolder = nom_repertoire + "\" + FolderName(i)+'\dataImg_1\' // Construit le chemin où se trouve les fichiers data ListFile = dir(TargetFolder) // Liste le contenue du dossier FileName = ListFile(2) // Recupère le noms des fichiers clear ListFile [NbrFile,x] = size(FileName) // Recupère le nombre de fichiers (100) clear x; for i = 1:1:NbrFile A(:,:,i) = csvRead(TargetFolder + FileName(i),",") // Importe les données dans une hypermatrice end for r = 1 : 1 : 384 //nombre de lignes for c = 1 : 1 : 512 // nombre de colonnes a(1,:) =A(r,c,:) // vecteur qui contient les 100 valeurs aux coordonnées (r,c) s(r,c)= variance(a,2)^2 // Calcul de la variance au carrée du vecteur end end fprintfMat(TargetFolder + "sCarreMat.txt",s,"%.2f") // Enregistre la matrice s dans un fichier txt clear TargetFolder; clear s; clear A; xpause(10000); end clear all; mprintf("\n*******************ANALYSE BRUIT TEMPO TERMINEE********************\n")
Partager