Implement the prototype of the data analysis
authorLukáš Jiřiště <jiriste@icpf.cas.cz>
Tue, 20 Aug 2024 12:03:37 +0000 (14:03 +0200)
committerLukáš Jiřiště <jiriste@icpf.cas.cz>
Tue, 20 Aug 2024 12:03:37 +0000 (14:03 +0200)
Also get rid of some pointless comments and commands.

Bubliny.m
get_levels.m [new file with mode: 0644]
name_to_time.m [new file with mode: 0644]
smooth_peaks.m [new file with mode: 0644]

index 89cb88a02621e4725d43686493059bcf16451aaf..29a0460c80f80dd6c97a908257cb9fa11ea56247 100755 (executable)
--- a/Bubliny.m
+++ b/Bubliny.m
@@ -1,16 +1,15 @@
-close all;                                                                  % deletes all figures whose handles are not hidden\r
-clear all;                                                                  % removes all variables from memory\r
+close all;\r
+clear all;\r
 \r
 %% vstupni data T:\00-Orvalho\Travnickova\Bubble column\r
-%\r
-\r
-%%\r
 \r
 % User dialog for the data directory used for files\r
 \r
 DirectoryName = get_data_dir();\r
 \r
-%DirectoryPath='T:\00-Orvalho\Travnickova\Bubble column\';\r
+if DirectoryName == 0\r
+       return\r
+end\r
 \r
 DDirectory = dir(DirectoryName);                                            % Loads directories or subdirectories to struct FFiles(1).name, FFiles(1).folder, FFiles(1).date - i s casem\r
 \r
@@ -23,10 +22,10 @@ end
 list={DDirectory.name};\r
 [Selected,OK] = listdlg('ListString',list,'ListSize',[200 500]);\r
 SelectedDirectory = list(Selected)';\r
-if isempty(SelectedDirectory)                                               % handles the error, when no spreadsheet is selected\r
-       error('No experiment selected.')\r
+if isempty(SelectedDirectory)\r
+       return\r
 end\r
-nSelectedDirectory = numel(SelectedDirectory);                              % Counts directories\r
+nSelectedDirectory = numel(SelectedDirectory);\r
 \r
 %{\r
 [ResFile, res_path] = uiputfile('*.xlsm', 'Save results to');\r
@@ -37,36 +36,20 @@ ResFile = [res_path, ResFile];
 %}\r
 \r
 % helper variables\r
-infmt = 'hh:mm:ss.SS';         % Time format in file names\r
-FileType = '*.png';            % extension of image file\r
+FileType = '*.png';\r
 \r
-%%\r
 % load of all directories in cycles\r
 for iii=1:nSelectedDirectory  % Cycles for directories with files\r
-\r
-\r
-%%\r
 % read names of all files\r
-\r
        FileName=([DirectoryName '/' SelectedDirectory{iii} '/' FileType]);\r
        FFiles = dir(FileName);                                                 % Loads files to struct FFiles(1).name, FFiles(1).folder, FFiles(1).date - i s casem\r
-       nFFiles = numel(FFiles);                                                % Counts files\r
-       LevelNum=str2double(SelectedDirectory{iii}(7:9))*1000;\r
 \r
-%% variable allocation\r
-\r
-       Height = zeros(1,nFFiles);\r
-       Metr_fit_H = zeros(1,nFFiles);\r
-       Bottom = zeros(1,nFFiles);\r
-       Metr_fit_B = zeros(1,nFFiles);\r
-\r
-%%\r
 % Initiation from the first file\r
        ImageName = FFiles(1).name;\r
-       start_time = duration([(ImageName(8:9)) ':' (ImageName(10:11)) ':' (ImageName(12:16))],'Format',infmt);\r
+       start_time = name_to_time(FFiles(1).name);\r
        Figure = imread([FFiles(1).folder '/' ImageName]);\r
-       ContrastFigure = imadjust(Figure);                                  % Adjust the contrast of the image using imadjust.\r
-       D_num=str2double(SelectedDirectory{iii}(21));                   % position of camera\r
+\r
+       %%D_num=str2double(SelectedDirectory{iii}(21));                   % position of camera\r
 \r
        [image_width, image_height] = size(Figure);\r
        sumfig = zeros(image_width, image_height);\r
@@ -74,17 +57,16 @@ for iii=1:nSelectedDirectory  % Cycles for directories with files
        maxfig = Figure;\r
 \r
 % load of all files in cycles\r
-       step=1;\r
-       startFile= 1;                                          %945;   %200 (20. )\r
-       endFile= numel(FFiles); %nFFiles;                                           %1000;  %325 (20.)\r
-       nFFiles=endFile;                                                        % Attention!!!\r
+       step = 10;\r
+       startFile = 1;                                          %945;   %200 (20. )\r
+       endFile = numel(FFiles); %nFFiles;                                           %1000;  %325 (20.)\r
        wait_bar = waitbar(0, '');\r
        set(gca(wait_bar).Title, 'Interpreter', 'none');\r
-       for jjj=startFile:step:nFFiles                                      % Cycles for figures files\r
+       for jjj=startFile:step:endFile                                      % Cycles for figures files\r
                ImageName = FFiles(jjj).name;\r
                Figure = imread([FFiles(jjj).folder '/' ImageName]);\r
 \r
-               waitbar(jjj/nFFiles, wait_bar, ['Preproccessing images from meassurement ' num2str(iii) '/' num2str(nSelectedDirectory)]);\r
+               waitbar((jjj - startFile)/(endFile - startFile), wait_bar, ['Preproccessing images from meassurement ' num2str(iii) '/' num2str(nSelectedDirectory)]);\r
 \r
                sumfig = sumfig + double(Figure);\r
                minfig = min(minfig, Figure);\r
@@ -93,9 +75,10 @@ for iii=1:nSelectedDirectory  % Cycles for directories with files
 \r
        close(wait_bar);\r
 \r
-       meanfig = uint8(sumfig ./ nFFiles);\r
+       meanfig = uint8(sumfig / ((endFile - startFile) / step + 1));\r
        changefig = maxfig - minfig;\r
 \r
+       %{\r
        figure\r
        subplot(2,2,1);\r
        title('Pixel maxima');\r
@@ -109,13 +92,32 @@ for iii=1:nSelectedDirectory  % Cycles for directories with files
        subplot(2,2,4);\r
        title('Difference between max and min');\r
        imshow(changefig);\r
+       %}\r
 \r
        mask = get_mask(changefig, meanfig);\r
        figure\r
-       imshow(meanfig .* uint8(mask));\r
-       figure\r
        plot(mean(double(meanfig), Weights = mask));\r
        \r
        meter = get_meter(maxfig, mask);\r
 \r
+       [~, calm_level] = min(mean(double(meanfig), Weights = mask));\r
+\r
+       wait_bar = waitbar(0, '');\r
+       set(gca(wait_bar).Title, 'Interpreter', 'none');\r
+       intensity = [];\r
+       step = 10;\r
+       N = floor((endFile - startFile)/step) + 1;\r
+       for j = 1:N\r
+               file_ind = startFile + (j - 1) * step;\r
+               ImageName = FFiles(file_ind).name;\r
+               Figure = imread([FFiles(file_ind).folder '/' ImageName]);\r
+               waitbar(j/N, wait_bar, ['Proccessing images from meassurement ' num2str(iii) '/' num2str(nSelectedDirectory)]);\r
+               intensity = mean(double(Figure), Weights = mask);\r
+               [water(j), bubble_top(j), bubble_bot(j)] = get_levels(intensity);\r
+       end\r
+       close(wait_bar);\r
+\r
+       figure\r
+       plot(meter([water; bubble_top; bubble_bot]'));\r
+\r
 end  % iii, Cycles for directories with files\r
diff --git a/get_levels.m b/get_levels.m
new file mode 100644 (file)
index 0000000..5327925
--- /dev/null
@@ -0,0 +1,33 @@
+function [water, bubble_top, bubble_bot] = get_levels(intensity, threshold, level_width)
+       if nargin < 2
+               threshold = 125;
+       end
+       if nargin < 3
+               level_width = 50;
+       end
+
+       water = NaN;
+       bubble_top = NaN;
+       bubble_bot = NaN;
+       signal = intensity > threshold;
+       diff_sig = abs(signal(3:end) - signal(1:end-2));
+       diff_sig = smooth_peaks(diff_sig, level_width);
+       indeces = (1:numel(diff_sig)) + 1;
+       features = indeces(diff_sig == 1);
+       features = [1 features numel(signal)];
+       for i = 2:numel(features)
+               signal(features(i - 1):features(i)) = mean(signal(features(i - 1):features(i))) > 0.5;
+       end
+       features = features(2:end-1);
+       for i = 1:numel(features)
+               top_state = signal(features(i) - 1);
+               bot_state = signal(features(i) + 1);
+               if (top_state == 0 && bot_state == 1)
+                       bubble_bot = features(i);
+               elseif (top_state == 1 && bot_state == 0)
+                       bubble_top = features(i);
+               elseif (top_state == 1 && bot_state == 1)
+                       water = features(i);
+               end
+       end
+end
diff --git a/name_to_time.m b/name_to_time.m
new file mode 100644 (file)
index 0000000..19ac704
--- /dev/null
@@ -0,0 +1,3 @@
+function time = name_to_time(name)
+       time = duration([(name(8:9)) ':' (name(10:11)) ':' (name(12:16))], 'Format', 'hh:mm:ss.SS');
+end
diff --git a/smooth_peaks.m b/smooth_peaks.m
new file mode 100644 (file)
index 0000000..8041832
--- /dev/null
@@ -0,0 +1,26 @@
+function sig = smooth_peaks(sig, window)
+       i = 1;
+       while true
+               start_point = find(sig(i:end) == 1, 1) + i - 1;
+               if isempty(start_point)
+                       break
+               end
+               end_point = find(sig(start_point:min(end, start_point + window)) == 1, 1, 'last') + start_point - 1;
+               if isempty(end_point)
+                       break
+               end
+               while true
+                       new_end = find(sig(end_point:min(end, end_point + window)) == 1, 1, 'last') + end_point - 1;
+                       if new_end == end_point
+                               break
+                       end
+                       end_point = new_end;
+               end
+               sig(start_point:end_point) = 0;
+               i = ceil(mean(start_point, end_point));
+               if i == 1
+                       i = i + 1;
+               end
+               sig(i - 1) = 1;
+       end
+