Effacer les filtres
Effacer les filtres

Trying to create a code to process images and create an excel sheet

4 vues (au cours des 30 derniers jours)
Matthew Loewer
Matthew Loewer le 10 Juil 2023
Modifié(e) : Aditya le 17 Nov 2023
I have been trying to create a code to process a folder's worth of images and create a workbook in excel with certain datapoints. I am currently getting a blank workbook. I have tried to fix the mistake for a while and I still don't know what it is. Please give me any suggestions for improvement. Here's my code:
clear
clc
close all
% Call Images from each folder ============================================
% path = cd;
path ='C:\Users\myname\Downloads\nozz4-2000_S0001';
info_folder = dir(path); [size_folder, s] = size(info_folder);
Data2 = [];
scale = 0.041524197; %mm/pix
D_top = 10-512*scale;
% scale = 0.063619997;
% D_top = 155;
framerate = 1/2000;
for i_folder = 3:1:size_folder
if info_folder(i_folder,1).isdir == 1
folder_name = info_folder(i_folder,1).name;
find_jpg = [path '\' folder_name '\*.tif'];
condition = dir(find_jpg);
[total_frame,s1] = size(condition);
%==================================================================
Data1 = [];
Data_number = cell(total_frame, 1);
for i = 1:1:total_frame
% =============================================================
% Image processing ============================================
I_file_name = condition(i,1).name; % I_file_name is the name of image.
I_name_path = [path '\' folder_name '\' I_file_name];
I = imread(I_name_path,'tif'); % I is the image for image processing.
I_double = double(I); % I_double is the numbers to calculate.
I_gauss = imgaussfilt(I,0.8);
I_double2 = double(I_gauss);
%==============================================================
% Image processing for each image =============================
I_adjust1 = I(:,:,1);
I_gauss = imgaussfilt(I_adjust1,0.8);
I_double2 = double(I_adjust1);
[xx,yy] = size(I_adjust1);
Num_cell = 0;
I_adjust = I_adjust1(Num_cell+1:xx-Num_cell,:);
I_norm = I_double2/(max(max(I_double2)));
I_norm = mat2gray(I_adjust/(max(max(I_adjust))));
dI_x = I_double2(:,2*Num_cell+1:yy) - I_double2(:,1:yy-2*Num_cell);
dI_y = I_double2(1:xx-2*Num_cell,:) - I_double2(1+2*Num_cell:xx,:);
dI_xy = sqrt(dI_x(1+Num_cell:xx-Num_cell,:).^2+dI_y(:,1+Num_cell:yy-Num_cell).^2);
I_grad = dI_xy/(max(max(dI_xy)));
I_Binary = imbinarize(imcomplement(I_norm),0.3);
I_Binary4 = imbinarize(I_grad,'adaptive','ForegroundPolarity','bright','Sensitivity',0.2);
I_Binary2=bwareafilt(I_Binary,1);
I_Binary3 = imfill(I_Binary2,'holes');
I_Binary_8 = uint8(I_Binary3);
I_Intensity_Region = I.*I_Binary_8;
[B,L] = bwboundaries(I_Binary3,'holes');
stats = regionprops(I_Binary3, 'Orientation', 'MajorAxisLength', ...
'MinorAxisLength', 'Eccentricity', 'Centroid', 'EquivDiameter', 'Circularity', 'BoundingBox');
Eccentricity1 = stats.Eccentricity;
D_position = stats.Centroid(2)*scale+D_top;
Majaxis = stats.MajorAxisLength*scale;
Minaxis = stats.MinorAxisLength*scale;
Orientation1 = stats.Orientation;
Centroid_x = stats.Centroid(1);
Centroid_y = stats.Centroid(2);
Equiv_Diam = stats.EquivDiameter*scale;
Circularity1 = stats.Circularity;
Drop_Area = Majaxis*Minaxis*pi;
Dsquared = Minaxis^2;
Width1 = stats.BoundingBox(3)*scale;
phi = linspace(0,2*pi,50);
cosphi = cos(phi);
sinphi = sin(phi);
xbar = stats.Centroid(1);
ybar = stats.Centroid(2);
a = stats.MajorAxisLength/2;
b = stats.MinorAxisLength/2;
theta = pi*stats.Orientation/180;
R = [ cos(theta) sin(theta)
-sin(theta) cos(theta)];
xy = [a*cosphi; b*sinphi];
xy = R*xy;
x = xy(1,:) + xbar;
y = xy(2,:) + ybar;
temp_data = [Eccentricity1, D_position,Majaxis, Minaxis, Orientation1,Centroid_x,Centroid_y, Equiv_Diam, Drop_Area, Dsquared, Circularity1, Width1];
Data_number{i} = temp_data;
imshow(I_Binary3)
%==============================================================
end
% Data process for each folder ====================================
Data1 = vertcat(Data_number{:});
%Append Data1 to Data2
Data2 = [Data2; Data1];
%==================================================================
% Export as Excel for each folder =================================
save_name = [folder_name '.xlsx'];
A1 = {'Eccentricity', 'D_position (mm)' ,...
'Majaxis (mm)', 'Minaxis (mm)', 'Orientation (Degrees)', 'Centroid_x (Pixels)', 'Centroid_y (Pixels)', ...
'Equiv_Diam (mm)', 'Droplet Area (mm^2)','Dsquared','circularity','width(mm)'};
writematrix(A1, save_name, 'Sheet1', 'A1');
writematrix(Data1, save_name, 'Sheet1', 'A2');
%==================================================================
subplot(2,2,1),imshow(I_adjust1); hold on; plot(x,y,'r','LineWidth',2);
subplot(2,2,2),imshow(I_Binary);hold on; plot(x,y,'r','LineWidth',2);
subplot(2,2,3),imshow(I_Binary2);hold on; plot(x,y,'r','LineWidth',2);
subplot(2,2,4),imshow(I_Binary3);hold on; plot(x,y,'r','LineWidth',2);
end
% Export as Excel for each folder =====================================
writematrix(Data2, 'ImageDropData4.xlsx');
%==================================================================
end
%
fprintf('ALL done.\n');
%==========================================================================
  4 commentaires
Mathieu NOE
Mathieu NOE le 11 Juil 2023
have you run your code step by step and checked that the image loading is working ?
are you processing / looking for tif or jpg files ?
this is a bit confusing : (jpg or tif ?)
find_jpg = [path '\' folder_name '\*.tif'];
Mathieu NOE
Mathieu NOE le 11 Juil 2023
also , I would do the code a bit simpler , maybe this way ? (does not contain all the details, just the core structure)
%% define path
yourpath = pwd; % or your specific path
list=dir(yourpath); %get info of files/folders in current directory
isfile=~[list.isdir]; %determine index of files vs folders
dirnames={list([list.isdir]).name}; % directories names (including . and ..)
dirnames=dirnames(~(strcmp('.',dirnames)|strcmp('..',dirnames))); % remove . and .. directories names from list
%% Loop on each folder
for ci = 1:length(dirnames) %
fileDir = char(dirnames(ci)); % current directory name
S = dir(fullfile(fileDir,'*.tif')); % get list of data files in directory according to name structure '*.tif'
S = natsortfiles(S); % sort file names into natural order (what matlab does not) , see FEX :
%(https://fr.mathworks.com/matlabcentral/fileexchange/47434-natural-order-filename-sort)
%% Loop inside folder
for k = 1:length(S) % read data
I = imread(fullfile(fileDir, S(k).name)); % or use a structure (S(k).data ) to store the full data structure
% your own code here for data processing. this is just for my demo
% for now :
title_str = [fileDir ' / ' S(k).name];
figure,image(I),title(title_str);
end
end

Connectez-vous pour commenter.

Réponse acceptée

Aditya
Aditya le 17 Nov 2023
Modifié(e) : Aditya le 17 Nov 2023
Hi Matthew,
From your query I understand that you are getting some issues while writing the data to the excel file.
To address your issue, I recommend making the following changes:
writecell(A1, save_name,"Sheet", 1, "Range",'A1');
writematrix(Data1, save_name, "Sheet",1,"Range", strcat('A2:L',num2str(1+total_frame)));
  • In the first line, we are using the writecell function because you have defined "A1" as a "1 x 12" cell in your code, which is not a matrix.
  • For the second line, since Data1 is defined as total_frame x 12 matrix, it is necessary to mention proper range. I have addressed this by using the strcat function to define the range as A2:L concatenated with the value of 1 + total_frame.
Refer to the below links for the above-mentioned functions:
Hope this helps!

Plus de réponses (0)

Catégories

En savoir plus sur Introduction to Installation and Licensing dans Help Center et File Exchange

Produits


Version

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by