baseFileName = "porosity layers.png";
fullFileName = fullfile(folder, baseFileName);
fullFileNameOnSearchPath = baseFileName;
if ~exist(fullFileNameOnSearchPath, 'file')
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
grayImage = imread(fullFileName);
[rows, columns, numberOfColorChannels] = size(grayImage)
numberOfColorChannels = 3
if numberOfColorChannels == 3
grayImage = grayImage(:, :, 1);
caption = sprintf('Original image : %s', baseFileName);
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
g.WindowState = 'maximized';
g.Name = 'Demo by Image Analyst';
mask = imclearborder(air, 4, "Borders","right");
air = bwareafilt(imfill(air, 'holes'), 1);
title('Air Mask Image', 'FontSize', fontSize);
airBoundaries = bwboundaries(air);
visboundaries(airBoundaries, 'LineWidth',2);
kernel = kernel / sum(kernel, "all");
localSumImage = imfilter(grayImage, kernel, 'replicate');
imshow(localSumImage, []);
title('Local Porosity Image', 'FontSize', fontSize);
verticalProfile = sum(localSumImage, 1);
plot(verticalProfile, 'b-', 'LineWidth', 2);
xlabel('Column Number', 'FontSize',fontSize)
ylabel('Sum within column', 'FontSize',fontSize)
title('Average Vertical Profile', 'FontSize', fontSize);
[labeledImage, Centers] = imsegkmeans(localSumImage, numberOfClasses);
B = labeloverlay(localSumImage, labeledImage);
title("Initial K-Means Labeled Image", 'FontSize', fontSize)
finalClasses = zeros(size(labeledImage), class(labeledImage));
for k = 1 : numberOfClasses
thisClass = ismember(labeledImage, k);
thisClass = bwareafilt(thisClass, 1);
col1 = find(thisClass(1, :), 1, 'first');
col2 = find(thisClass(1, :), 1, 'last');
if ~isempty(col1) && ~isempty(col2)
thisClass(1, col1:col2) = true;
col1 = find(thisClass(end, :), 1, 'first');
col2 = find(thisClass(end, :), 1, 'last');
if ~isempty(col1) && ~isempty(col2)
thisClass(end, col1:col2) = true;
thisClass = imfill(thisClass, 'holes');
finalClasses(thisClass) = k;
imagePosition = min(3*6, k+15);
subplot(3, 6, imagePosition)
caption = sprintf('Class #%d', k);
title(caption, 'FontSize', fontSize);
props = regionprops(finalClasses, 'Centroid');
xy = vertcat(props.Centroid);
xCentroid = xy(:, 1)
xCentroid =
438.73480887561
835.390401814233
147.547561186356
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
[sortedValues, initialClassOrder] = sort(xCentroid, 'ascend')
sortedValues =
147.547561186356
438.73480887561
835.390401814233
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
initialClassOrder =
3
1
2
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
finalClasses2 = zeros(size(finalClasses), class(finalClasses));
for k = 1 : numberOfClasses
thisClass = ismember(finalClasses, initialClassOrder(k));
fprintf('Assigning original class %d (at x = %.1f) to new class label number %d.\n', k, xCentroid(k), initialClassOrder(k))
finalClasses2(thisClass) = k;
end
Assigning original class 1 (at x = 438.7) to new class label number 3.
Assigning original class 2 (at x = 835.4) to new class label number 1.
Assigning original class 3 (at x = 147.5) to new class label number 2.
finalClasses = finalClasses2;
for k = 1 : numberOfClasses
thisClass = ismember(finalClasses, k);
imagePosition = min(3*6, k+15);
subplot(3, 6, imagePosition)
caption = sprintf('Class #%d', k);
title(caption, 'FontSize', fontSize);
title("Final Labeled Image", 'FontSize', fontSize)
for k = 1 : numberOfClasses
thisClass = ismember(finalClasses2, k);
boundaries = bwboundaries(mask);
classBoundaries{k} = boundaries{k};