Bonjour,
Je me permet d'écrire sur le forum en espérant trouver en solution à mon problème après plusieurs itérations de mon code...
Dans le cadre d'un projet de thèse j'ai testé un capteur sous un flux de particule ionisante et acquit des données (.bin) pendant cette irradiation.
Mon banc de test ma permis de récupérer des images de 2048/2048 pixel avec un niveau de gris de 0 à 4095 (8Mo par images...).
Ma contrainte principale est que j'ai plus de 5000 images à post traiter sur plusieurs type de particule testé en un temps limité.
Après analyse de quelque images il en ressort que les particules peuvent impacter plusieurs pixels groupés.
Ci-dessous mon code, la première partie me permet de faire un post-traitement en prenant en compte ma première image et de la comparé à deux image consécutive.
Ca me permet d’enlever les pixels qui auraient des problèmes à chaque itération (en prenant la ref) puis en comparant deux image consécutive d'enlever les problèmes qui pourrait arriver en cours de test en les comptant qu'une fois.
A ça s’ajoute un filtre de bruit (VALUE_PixErrorThreshold) que j'ai calibré à 10 (test fait dans le noir mais il y a un niveau de bruit max de 10)
Actuellement j'ai le threshold appliqué et nombre de pixel en erreur dans chaque images. (je suis déjà content de moi, et ça en 0.1s par traitement d'image !!!
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 close all clear all %Variable Generale ResultingTable = zeros(1,2); % Pixels Errors | ImageTrouble VALUE_PixErrorThreshold = 10; % Max 4096 %VALUE_PixErrorThresholdTrouble = 5000; % [FileNames,PathName] = uigetfile('.bin','Select One or More Files','MultiSelect','on'); FileName = char(FileNames(1)); fid = fopen (fullfile(PathName,FileName), 'r'); IMG_REF = fread(fid,[2048,2048],'uint16','b'); fclose(fid); IMG_REF = IMG_REF'; %Rotate for NbEvent = 2:(length(FileNames)-1) % Take pictures by 2, first picture is the Ref picture tic; FileName = char(FileNames(NbEvent)); fid = fopen (fullfile(PathName,FileName), 'r'); IMG_ANALASED_1= fread(fid,[2048,2048],'uint16','b'); fclose(fid); IMG_ANALASED_1 = IMG_ANALASED_1'; FileName = char(FileNames(NbEvent+1)); fid = fopen (fullfile(PathName,FileName), 'r'); IMG_ANALASED_2 = fread(fid,[2048,2048],'uint16','b'); fclose(fid); IMG_ANALASED_2 = IMG_ANALASED_2'; %%Comparaison des deux matrices IMG_ANALASED_1_COMP = abs(IMG_ANALASED_1 - IMG_REF); IMG_ANALASED_1_COMP = IMG_ANALASED_1_COMP > VALUE_PixErrorThreshold; IMG_ANALASED_2_COMP = abs(IMG_ANALASED_2 - IMG_REF); IMG_ANALASED_2_COMP = IMG_ANALASED_2_COMP > VALUE_PixErrorThreshold; IMG_MID = (IMG_ANALASED_2_COMP - IMG_ANALASED_1_COMP); IMG_TOTAUX_RES = (IMG_ANALASED_2_COMP - IMG_MID); NbrPixError(1, NbEvent+1) = nnz(IMG_TOTAUX_RES); %Couting non zeros pixels in picture PixErrorThreshold (1, NbEvent+1)= VALUE_PixErrorThreshold; %Spot Event HELP... :calim2: toc; end % concatenate all the tables Tab_Final=[PixErrorThreshold;NbrPixError]; Tab_Final=Tab_Final'; writematrix(Tab_Final, 'Resultats.txt')
Ce que je voudrais c'est pouvoir avoir un tableaux où une ligne = Nombre de pixel groupé en erreur (incluant même un pixel seul) puis a la suite de cette ligne le nombre de pixel impacté par groupe. Exemple [3 51 1 23] ==> 3 groupe de pixel 51pixgroupe1 1pixel group2 23pixgroup3 et ça pour chaque image post traité
Au départ j'avais pris octave et la fonction imfindcircles mais je n'arrivais pas à récupérer le nombre exacte de pixel dans mes cercle et je pense que je n'avais pas les pixels seul... Maintenant je suis sur Matlab et j'ai essayé la fonction findgroups mais je pense que je dois faire fausse route...
Quelqu’un pourrait s'il vous plait m'aider, voir simplement m'aiguiller ?
Merci par avance !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 A1 = [1024.5 1024.5]; Entier_A1 = int16(A1); [C,R] = imfindcircles(IMG_TOTAUX_RES,[5 10],'sensitivity',0.85); A=min(min(IMG_TOTAUX_RES)); B=max(max(IMG_TOTAUX_RES)); imshow(IMG_TOTAUX_RES, [A,B]) Entier_C = int16(C); if int16(Entier_C==Entier_A1) SpotEvent(1, NbEvent+1) = 0; else NbSpotEvent = rows(C); SpotEvent(1, NbEvent+1) = NbSpotEvent; endif
Partager