-\r
close all; % deletes all figures whose handles are not hidden\r
clear all; % removes all variables from memory\r
-clc; % clears the Command Window display\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
end\r
nSelectedDirectory = numel(SelectedDirectory); % Counts directories\r
\r
+%{\r
[ResFile, res_path] = uiputfile('*.xlsm', 'Save results to');\r
if (ResFile == 0)\r
error('No file elected to save the results to.')\r
end\r
ResFile = [res_path, ResFile];\r
+%}\r
\r
% helper variables\r
infmt = 'hh:mm:ss.SS'; % Time format in file names\r
\r
%%\r
% load of all directories in cycles\r
-for iii=1:1:nSelectedDirectory % Cycles for directories with files\r
+for iii=1:nSelectedDirectory % Cycles for directories with files\r
\r
\r
%%\r
nFFiles = numel(FFiles); % Counts files\r
LevelNum=str2double(SelectedDirectory{iii}(7:9))*1000;\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
- Figure = imread([FFiles(1).folder '/' ImageName]);\r
- ContrastFigure = imadjust(Figure); % Adjust the contrast of the image using imadjust.\r
- [MeterScale, polypar_Metr] = meter(SelectedDirectory{iii}, ContrastFigure, ResFile);\r
- D_num=str2double(SelectedDirectory{iii}(21)); % position of camera\r
-\r
-% Set loop variables\r
- step=1;\r
- startFile= 40; %945; %200 (20. )\r
- endFile= 110; %nFFiles; %1000; %325 (20.)\r
- nFFiles=(endFile - startFile / step) + 1; % Attention!!!\r
-\r
%% variable allocation\r
\r
Height = zeros(1,nFFiles);\r
Metr_fit_B = zeros(1,nFFiles);\r
\r
%%\r
-% load all files in a loop\r
- for jjj=1:nFFiles % Cycles for figures files\r
- file_ind = startFile + (jjj - 1) * step;\r
- ImageName = FFiles(file_ind).name;\r
- Figure = imread([FFiles(file_ind).folder '/' ImageName]);\r
- ContrastFigure = imadjust(Figure); % Adjust the contrast of the image using imadjust.\r
- IntensitiesAverFin{jjj} = get_representative_intensities(ContrastFigure);\r
-\r
-% Figure with average intensity, without the bands with hole and meter\r
- f = figure();\r
- ax = axes(f);\r
- imshow(ContrastFigure, 'Parent', ax)\r
- hold(ax, 'on');\r
- plot(ax, IntensitiesAverFin{jjj},'-y','linewidth',2)\r
- if jjj > 1 %subtracts the intensities\r
- plot(IntensitiesAverFin{jjj-step},'Color',[0.9290 0.6940 0.1250],'linewidth',2)\r
- hold on\r
- IntensitiesAverFin_2{jjj}=IntensitiesAverFin{jjj}-IntensitiesAverFin{jjj-step};\r
- waytrend=mean(IntensitiesAverFin_2{jjj},2); % waytrend will tell whether to calculate the minimum or maximum green intensity IntensitiesAverFin_2{jjj}\r
- if waytrend<=0;\r
- plot(-IntensitiesAverFin_2{jjj},'-g','linewidth',2)\r
- else\r
- plot(IntensitiesAverFin_2{jjj},'-g','linewidth',2)\r
- end\r
- hold on\r
- end\r
-\r
- Time(jjj)=duration([(ImageName(8:9)) ':' (ImageName(10:11)) ':' (ImageName(12:16))],'Format',infmt) - start_time;\r
- infmd = ['yy' 'MM' 'dd'];\r
- Date(jjj) = datetime(ImageName(1:6),'InputFormat',infmd);\r
-\r
- % % plot(lk,abs(pk),'oc','linewidth',2)\r
- if D_num==1\r
- LevelPixels=MeterScale(1+(1000-LevelNum)/100); % x level in pixels in the original image\r
- if jjj == 1\r
- [pk,lk] = findpeaks(-IntensitiesAverFin{jjj}(1:(LevelPixels+30))); %10\r
- [Height(jjj),pkH]=max(pk);\r
- qH=lk(pkH);\r
- Metr_fit_H(jjj)=polyval(polypar_Metr,qH);\r
- plot(ax, qH, -Height(jjj), 'or', 'linewidth', 2)\r
- else\r
- if waytrend<=0;\r
- [pk,lk] = findpeaks(-IntensitiesAverFin_2{jjj}(1:(LevelPixels+30))); %10\r
- else\r
- [pk,lk] = findpeaks(IntensitiesAverFin_2{jjj}(1:(LevelPixels+30))); %10\r
- end\r
- [Height(jjj),pkH]=max(pk);\r
- if max(pk)>=10; % error cleaning %30\r
- qH=lk(pkH);\r
- Metr_fit_H(jjj)=polyval(polypar_Metr,qH);\r
- end\r
- plot(ax, qH, Height(jjj), 'om', 'linewidth', 2)\r
- end\r
-\r
- elseif D_num==2\r
- LevelPixels=MeterScale(1); % x level in pixels in the original image\r
- if jjj == 1\r
- [pk,lk] = findpeaks(-IntensitiesAverFin{jjj}(LevelPixels:end)); %10\r
- [Height(jjj),pkH]=max(pk);\r
- qH=LevelPixels+lk(pkH);\r
- Metr_fit_H(jjj)=polyval(polypar_Metr,qH);\r
- plot(ax, qH, -Height(jjj), 'or', 'linewidth', 2)\r
- else\r
- if waytrend<=0;\r
- [pk,lk] = findpeaks(-IntensitiesAverFin_2{jjj}(LevelPixels:end)); %10\r
- else\r
- [pk,lk] = findpeaks(IntensitiesAverFin_2{jjj}(LevelPixels:end)); %10\r
- end\r
- [Height(jjj),pkH]=max(pk);\r
- qH=LevelPixels+lk(pkH);\r
- Metr_fit_H(jjj)=polyval(polypar_Metr,qH);\r
- if max(pk)<30; % error cleaning %30\r
- qH=NaN;\r
- Metr_fit_H(jjj)=NaN;\r
- end\r
- plot(ax, qH, Height(jjj), 'or', 'linewidth', 2)\r
- end\r
- end\r
-\r
- if jjj == 1\r
- [pk2,lk2] = findpeaks(-IntensitiesAverFin{jjj},'MinPeakProminence',5); % Small peaks at the bubble/liquid interface\r
-\r
- [pk3,lk3] = findpeaks(-IntensitiesAverFin{jjj},'MinPeakProminence',5,'MinPeakDistance',30); % Throw out small random peaks in the liquid, peaks far apart cca 1cm\r
- [one,nqq]=size(lk3);\r
- [one,npp]=size(lk2);\r
-\r
- if npp==0\r
- pk2=NaN;\r
- lk2=NaN;\r
- elseif nqq==0\r
- pk3=NaN;\r
- lk3=NaN;\r
- end\r
-\r
- for qqq=1:1:nqq\r
- for ppp=1:1:npp\r
- if lk3(qqq)==lk2(ppp)\r
- pk2(ppp)=NaN;\r
- lk2(ppp)=NaN;\r
- end\r
- end\r
- end\r
-\r
- % % plot(lk2,abs(pk2),'om','linewidth',2)\r
- hold on\r
-\r
- [Bottom(jjj),pk2B]=max(abs(pk2)); % For 1-4 files\r
- qB=lk2(pk2B); % For 1-4 files\r
-\r
- Metr_fit_B(jjj)=polyval(polypar_Metr,qB);\r
- if Metr_fit_B(jjj)>=(Metr_fit_H(jjj)-2) % Throw out the bubble/liquid interface if it is above the surface, 2cm 2D interface\r
- Metr_fit_B(jjj)=NaN;\r
- qB=NaN;\r
- elseif Bottom(jjj)<=(max(abs(pk))+min(abs(pk)))*0.62 % 0.65 is an estimate of how much intensity the bubbles need\r
- Metr_fit_B(jjj)=NaN; % For 1-4 files\r
- qB=NaN;\r
- end\r
- plot(ax, qB, Bottom(jjj), 'ob', 'linewidth', 2)\r
- else\r
- if D_num==1\r
- LevelPixels=MeterScale(1+(1000-LevelNum)/100); % x level in pixels in the original image\r
- if waytrend<=0;\r
- [pk2,lk2] = findpeaks(-IntensitiesAverFin_2{jjj}(LevelPixels:end)); %10\r
- else\r
- [pk2,lk2] = findpeaks(IntensitiesAverFin_2{jjj}(LevelPixels:end)); %10\r
- end\r
- [Bottom(jjj),pk2B]=max(pk2);\r
- qB=LevelPixels+lk2(pk2B);\r
- Metr_fit_B(jjj)=polyval(polypar_Metr,qB);\r
- if max(pk2)<=45; % error cleaning\r
- qB=NaN;\r
- Metr_fit_B(jjj)=NaN;\r
- end\r
- plot(ax, qB, Bottom(jjj), 'oc', 'linewidth', 2)\r
- elseif D_num==2\r
- LevelPixels=MeterScale(1); % x level in pixels in the original image\r
- if waytrend<=0;\r
- [pk2,lk2] = findpeaks(-IntensitiesAverFin_2{jjj}(LevelPixels:end)); %10\r
- else\r
- [pk2,lk2] = findpeaks(IntensitiesAverFin_2{jjj}(LevelPixels:end)); %10\r
- end\r
- [Bottom(jjj),pk2B]=max(pk2);\r
- qB=LevelPixels+lk2(pk2B);\r
- Metr_fit_B(jjj)=polyval(polypar_Metr,qB);\r
- if max(pk2)<=20; % error cleaning\r
- qB=NaN;\r
- Metr_fit_B(jjj)=NaN;\r
- end\r
- plot(ax, qB, Bottom(jjj), 'oc', 'linewidth', 2)\r
- end\r
- end\r
-\r
- writematrix(["ImageName" "Date" "Time [s]" "Intensities Height [-]" "Intensities Bottom [-]" "Height [cm]" "Bottom [cm]" "Level [cm]"], ResFile, "Sheet", SelectedDirectory{iii}, "Range", "A1:H1");\r
- writematrix([ImageName string(Date(jjj)) seconds(Time(jjj)) Height(jjj) Bottom(jjj) Metr_fit_H(jjj) Metr_fit_B(jjj) LevelNum], ResFile, "Sheet", SelectedDirectory{iii}, "Range", ['A' num2str(file_ind+1) ':H' num2str(file_ind+1)]);\r
-\r
- end % jjj, Cycles for figures files\r
-\r
- hf4=figure ('Name','Velocity','NumberTitle','off','PaperSize',[8.5 6],'PaperUnits','centimeters');\r
- hp1=plot(seconds(Time), Metr_fit_H,'-or','linewidth',2); % [1 startFile:step:nFFiles]\r
- hold on\r
- hp2=plot(seconds(Time), Metr_fit_B,'-ob','linewidth',2);\r
- hold on\r
- hp3=plot(seconds(Time),LevelNum*ones(size(Time)),'-og','linewidth',2);\r
-\r
- xlabel('time [s]','FontWeight','bold');\r
- ylabel('position [cm]','FontWeight','bold');\r
- grid('on');\r
- [legend_h,object_h,plot_h,text_strings] = legend([hp1,hp2,hp3],'Height', 'Bottom', 'Level','Location','southeast' );\r
- set(legend_h, 'Box', 'off', 'FontSize',7)\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
+ 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
-%--------------------------------------------------------------------------\r
- print ('-dpng', '-r1200', 'Velocity.png')\r
-%--------------------------------------------------------------------------\r
+ [image_width, image_height] = size(Figure);\r
+ sumfig = zeros(image_width, image_height);\r
+ minfig = Figure;\r
+ 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
+ wait_bar = waitbar(0, '');\r
+ set(gca(wait_bar).Title, 'Interpreter', 'none');\r
+ for jjj=startFile:step:nFFiles % 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
+\r
+ sumfig = sumfig + double(Figure);\r
+ minfig = min(minfig, Figure);\r
+ maxfig = max(maxfig, Figure);\r
+ end % jjj, Cycles for figures files\r
\r
- %%xlswritefig(hf4, ResFile, SelectedDirectory{iii}, 'J2')\r
+ close(wait_bar);\r
+\r
+ meanfig = uint8(sumfig ./ nFFiles);\r
+ changefig = maxfig - minfig;\r
+\r
+ figure\r
+ subplot(2,2,1);\r
+ title('Pixel maxima');\r
+ imshow(maxfig);\r
+ subplot(2,2,2);\r
+ title('Pixel minima');\r
+ imshow(minfig);\r
+ subplot(2,2,3);\r
+ title('Pixel means');\r
+ imshow(meanfig);\r
+ subplot(2,2,4);\r
+ title('Difference between max and min');\r
+ imshow(changefig);\r
\r
end % iii, Cycles for directories with files\r
+++ /dev/null
-function [MeterScale, polypar_Metr] = meter(SelectedDirectory, ContrastFigure, ResFile)
-
- [p, q] = size(ContrastFigure);
-% Meter
- D_num=str2double(SelectedDirectory(21)); % position of camera
-
- reply = input('Is this a NEW EXPERIMENT that does not yet have calculated parameters for the cm scale? (y/n): ','s'); % y, n Selects where to find parameters for the cm scale. Either in the array or guess them.
- if strcmp(reply,'n')
- AxisIntensArray=[22,22,22,22,25,27,7,7,7,7,7,23,3,20,11,2,4,19,6,25,3]; % this needs to be guessed
- AxisIntensUpArray=[60,60,65,65,34,5,29,29,29,29,29,22,26,2,27,2,28,2,29,2,29]; % this needs to be guessed
- AxisEmptyArray=[190,190,190,190,200,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190]; % this needs to be guessed 190
- LevelMeterArray=[0.95,0.95,0.95,1,0.11,0.8,0.2,0.2,0.2,0.1,0.29,0.9,0.39,0.9,0.39,0.6,0.29,0.9,0.25,0.7,0.27];
- AxisIntens=AxisIntensArray(Selected-13); % The number of all files minus 9 in which there is no data
- AxisIntensUp=AxisIntensUpArray(Selected-13);
- AxisEmpty=AxisEmptyArray(Selected-13);
- LevelMeter=LevelMeterArray(Selected-13);
- elseif strcmp(reply,'y')
- AxisIntens=25; % 1.- 4. =22; 5. - 29 6.-27 7.8.9.11.11.-7 12.=23 13.=3 % Right this needs to be guessed
- AxisIntensUp=2; % 3. = 65; 1. a 2. = 60; 5. - 34 6. a 7.8.9.10.11. = 29 12.=22 13.=26 % Left this needs to be guessed
- AxisEmpty=190; % 5. = 200; 6. 7.8.9.10.11.12.13 = 190 % this needs to be guessed 190
- LevelMeter=0.7; % 5. = 0.11, 4. = 1; 1., 2. a 3. = 0.95, 6. =0.9; 7.8.9.=0.2 10.=0.1 11.=0.29 12.=0.9 13.=0.39 % number on the meter so that the left dash is above the surface and the right is below the surface
- end
-
- Meter=ContrastFigure(floor(p*3/4-p*1/16+p*1/64):floor(p*3/4+p*1/64), 1:q);
- ContrastMeter = imadjust(Meter);
- [r,s]=size(ContrastMeter);
- ContrastMeterMid=ContrastMeter(floor(end/2),:);
-
- hf1=figure ('Name','Contrasted meter','NumberTitle','off','PaperSize',[8.5 6],'PaperUnits','centimeters');
- imshow(ContrastMeter)
- hold on
- plot(ContrastMeterMid,'-m','linewidth',2)
- hold on
-
- for kkk=2:1:q
- if kkk<(1-LevelMeter)*q && ContrastMeterMid(kkk)>AxisIntensUp % looks for intensity minima for dashes on the axis above the level, Left
- ContrastMeterMid(kkk)=0;
- elseif kkk>=(1-LevelMeter)*q && ContrastMeterMid(kkk)>AxisIntens % looks for intensity minima for dashes on the axis under the level, Right
- ContrastMeterMid(kkk)=0;
- else
- ContrastMeterMid(kkk)=1;
- end
- if ContrastMeterMid(kkk) == ContrastMeterMid(kkk-1) % looking for the right side of the peak
- ContrastMeterMid(kkk-1)=0;
- end
- end
- for mmm=q:-1:AxisEmpty
- if ContrastMeterMid(mmm)==1 % erases the peaks (written numbers) to the left of the dashes on the axis
- ContrastMeterMid((mmm-AxisEmpty):mmm-1)=0;
- mmm=mmm-AxisEmpty;
- end
- end
- ooo=1;
- for nnn=1:1:q
- if ContrastMeterMid(nnn)==1 % Writes x places of dashes on the axis
- MeterScale(ooo)=nnn;
- ooo=ooo+1;
- end
- end
-
- if D_num==1
- plot(MeterScale, floor(r/2) * ones(10, 1),'oc','linewidth',2)
- elseif D_num==2
- plot(MeterScale(1:end-1), floor(r/2) * ones(8, 1),'oc','linewidth',2)
- end
-%--------------------------------------------------------------------------
- print ('-dpng', '-r1200', ['Contrasted_meter.png'])
-%--------------------------------------------------------------------------
-
-
- hf2=figure ('Name','Intensity minima for dashes on the axis','NumberTitle','off','PaperSize',[8.5 6],'PaperUnits','centimeters');
- plot(ContrastMeterMid,'-m','linewidth',2)
-
- xlim([1,q]);
- ylim([0,1]);
-%--------------------------------------------------------------------------
- print ('-dpng', '-r1200', ['Intensity_places_dashes.png'])
-%--------------------------------------------------------------------------
-clear Meter
-clear ContrastMeter
-clear ContrastMeterMid
-
-% Calculation of the actual position in mm using the scale of the meter
-
- hf3=figure ('Name','Dashes scale','NumberTitle','off','PaperSize',[8.5 6],'PaperUnits','centimeters');
- if D_num==1
- plot(MeterScale,[1000;900;800;700;600;500;400;300;200;100],'ob','linewidth',2)
- hold on
- polypar_Metr = polyfit(MeterScale,[1000;900;800;700;600;500;400;300;200;100],2);
- elseif D_num==2
- plot(MeterScale(1:end-1),[1800;1700;1600;1500;1400;1300;1200;1100],'ob','linewidth',2)
- hold on
- polypar_Metr = polyfit(MeterScale(1:end-1),[1800;1700;1600;1500;1400;1300;1200;1100],2);
- end
- no_layer_fit=1: 1 : q;
- Metr_fit=polyval(polypar_Metr,no_layer_fit);
- plot(no_layer_fit,Metr_fit,'-r','linewidth',2);
- hold on
- if D_num==1
- xlim([0,q]);
- ylim([0,1200]);
- elseif D_num==2
- xlim([0,q]);
- ylim([0,2000]);
- end
-%--------------------------------------------------------------------------
- print ('-dpng', '-r1200', 'Dashes_scale.png')
-%--------------------------------------------------------------------------
-
- writematrix("Contrasted meter", ResFile, "Sheet", append("Met ", SelectedDirectory), "Range","A2"); %[cell2mat(SelectedDirectory(iii)) ': Meter scale'],'A1'); ['Meter scale ' num2str(iii)]
- %%xlswritefig(hf1, ResFile, ['Met ' cell2mat(SelectedDirectory(iii))] , 'A4')
- writematrix("Intensity: places of dashes on the axis", ResFile, "Sheet", append("Met ", SelectedDirectory), "Range", "A6");
- %%xlswritefig(hf2, ResFile, ['Met ' cell2mat(SelectedDirectory(iii))], 'B8')
- writematrix("Dashes scale", ResFile, "Sheet", append("Met ", SelectedDirectory), "Range", "K6");
- %%xlswritefig(hf3, ResFile, ['Met ' cell2mat(SelectedDirectory(iii))], 'L8')
- writematrix(["Meter Scale" "Dashes scale"], ResFile, "Sheet", append("Met ", SelectedDirectory), "Range", "A28");
- writematrix(["AxisIntens" "AxisIntensUp" "AxisEmpty" "LevelMeter"], ResFile, "Sheet", append("Met ", SelectedDirectory), "Range", "D28");
- if D_num==1
- writematrix([MeterScale' [1000;900;800;700;600;500;400;300;200;100]], ResFile, "Sheet", append("Met ", SelectedDirectory), "Range", "A29");
- elseif D_num==2
- writematrix([MeterScale(1:end-1)' [1800;1700;1600;1500;1400;1300;1200;1100]], ResFile, "Sheet", append("Met ", SelectedDirectory), "Range", "A29");
- end
- writematrix([AxisIntens AxisIntensUp AxisEmpty LevelMeter], ResFile, "Sheet", append("Met ", SelectedDirectory), "Range", "D29");