How shall I ignore the reflection in an image and select the rest of the image in a bounding box and obtain the results also automate it in order to process multiple images?
1 次查看(过去 30 天)
显示 更早的评论
I have a number of images of a combined droplet spreading on a surface. I need to do image processing in order to calculate the droplet spreading length and height as indicated in the attached images. I have run a code which binarizes and thresholds the image and a applies a boundingbox to capture the dimension of the blob. Now it can be seen from the image that there is a reflection of the combined droplet blob which is visible as the solid substrate is glass. The Matlab code accurately captures the spreading width horizontally through the bounding box but for the vertical direction it includes the reflected portion as well. So how can it be done? Also how could I automate it so the code loads a series of images (say 25 images) processes those image files and returns both the pixel size of the length and breadth?
What modifications on this code could be incorporated
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 18;
folder = 'C:\Users\Admin\Desktop\Droplet images for calculation\0.50 cmc on water\0.5 cmc head on\fixing time';
baseFileName = '0.5 cmc head on0211.tif';
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~isfile(fullFileName)
% The file doesn't exist -- didn't find it there in that folder.
% Check the entire search path (other folders) for the file by stripping off the folder.
fullFileNameOnSearchPath = baseFileName; % No path this time.
if ~exist(fullFileNameOnSearchPath, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
fullFileName = fullFileNameOnSearchPath;
end
[grayImage,map] = imread(fullFileName);
grayImage = rgb2gray(grayImage);
imshow(grayImage,map)
binaryImage = ~imbinarize(grayImage);
% Erase from line 758 down:
binaryImage(687:end, :) = false; % 758
% Fill holes.
binaryImage = imfill(binaryImage, 'holes');
% Get rid of any msall noise blobs.
binaryImage = bwareafilt(binaryImage, 1); % Take largest blob only.
imshow(binaryImage)
impixelinfo;
props = regionprops(binaryImage, 'BoundingBox');
spreadingWidth = props.BoundingBox(3)
droplet_height = props.BoundingBox(4)
rectangle('Position', props.BoundingBox, 'Edgecolor', 'g', 'LineWidth', 2)
fprintf('Done running %s.m ...\n', mfilename);
0 个评论
采纳的回答
Image Analyst
2024-1-20
Rather than remove it, just scan across your binary image finding where it's white
[rows, columns] = size(binaryImage)
topRows = nan(1, columns);
for col = 1 : columns
t = find(binaryImage(:, col), 1, 'first');
if ~isempty(t)
topRows(col) = t;
end
end
inDroplet = ~isnan(topRows);
leftColumn = find(inDroplet, 1, 'first')
rightColumn = find(inDroplet, 1, 'last')
spreadingWidth = rightColumn - leftColumn; % Pixel center to pixel center. Add 1 if you want whole pixels.
4 个评论
Image Analyst
2024-1-21
You can do
spreadingHeight = range(topRow)
or
spreadingHeight = max(topRow) - min(topRow)
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!