How can I remove background around droplet?

10 views (last 30 days)
this is an image of water droplet containing particles on a solid surface. I want to remove background around the droplet i.e. I want to make all things black around the droplet? How can I do that? Second, I want to find out the height of droplet and the width of droplet. Can you help me?

Accepted Answer

Image Analyst
Image Analyst on 8 Nov 2018
Try this:
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 = 20;
%===============================================================================
% Read in gray scale demo image.
folder = pwd; % Determine where demo folder is (works with all versions).
baseFileName = 'image0515.jpg';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% 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
end
rgbImage = imread(fullFileName);
% Display the image.
subplot(2, 2, 1);
imshow(rgbImage, []);
title('Original Image', 'FontSize', fontSize, 'Interpreter', 'None');
axis('on', 'image');
hp = impixelinfo();
% Get the dimensions of the image.
% numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.
[rows, columns, numberOfColorChannels] = size(rgbImage)
if numberOfColorChannels > 1
% It's not really gray scale like we expected - it's color.
% Use weighted sum of ALL channels to create a gray scale image.
% grayImage = rgb2gray(rgbImage);
% ALTERNATE METHOD: Convert it to gray scale by taking only the green channel,
% which in a typical snapshot will be the least noisy channel.
grayImage = rgbImage(:, :, 2); % Take green channel.
else
grayImage = rgbImage; % It's already gray scale.
end
% Now it's gray scale with range of 0 to 255.
% Display the histogram of the image.
subplot(2, 2, 2);
[counts, binLocations] = imhist(grayImage);
% Suppress bin 1 because it's so tall
counts(1) = 0;
bar(binLocations, counts);
grid on;
title('Histogram of Image', 'FontSize', fontSize, 'Interpreter', 'None');
%------------------------------------------------------------------------------
% Set up figure properties:
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.96]);
% Get rid of tool bar and pulldown menus that are along top of figure.
% set(gcf, 'Toolbar', 'none', 'Menu', 'none');
% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')
drawnow;
% Binarize the image
% Get the mask where the region is solid.
binaryImage = grayImage > 50;
% Fill it and take the largest blob:
binaryImage = imfill(binaryImage, 'holes');
binaryImage = bwareafilt(binaryImage, 1);
% Display the image.
subplot(2, 2, 3);
imshow(binaryImage, []);
title('Initial Binary Image', 'FontSize', fontSize, 'Interpreter', 'None');
axis('on', 'image');
hp = impixelinfo();
drawnow;
% Use it to mask the original image.
finalImage = grayImage; % Initialize
finalImage(~binaryImage) = 0; % Erase outside the mask.
% Display the image.
subplot(2, 2, 4);
imshow(finalImage, []);
title('Final, Masked Image', 'FontSize', fontSize, 'Interpreter', 'None');
axis('on', 'image');
hp = impixelinfo();
I'm just using a threshold of 50, but if I were you, I'd try the triangle thresholding algorithm to binarize the image, because imbinarize didn't work. I've attached it.
  4 Comments
Image Analyst
Image Analyst on 9 Nov 2018
You should have just tried the file I attached. Anyway, I did it for you and got these images with the attached files. You can see the triangle threshold method produced a threshold of 59 gray levels.
balu p
balu p on 9 Nov 2018
Thank you Image Analyst. It works well! Thank you for your inputs and time!

Sign in to comment.

More Answers (1)

Akira Agata
Akira Agata on 8 Nov 2018
How about the following?
% Read the image and convert to gray scale
I = imread('image0000.jpg');
Igray = rgb2gray(I);
% Extract droplet
BW = Igray > 70;
BW2 = bwconvhull(BW);
% Mask the image
I2 = immultiply(Igray,BW2);
% Calculate the bounding box
s = regionprops(BW2,'BoundingBox');
% Visualize the result
figure
imshow(I2)
hold on
rectangle('Position',s.BoundingBox,'EdgeColor','c')
The height and width of the droplet corresponds to those of the bounding box. Looking at the s.BoundingBox, you can find height and width of it are 112 and 482 pixel, respectively.
>> s.BoundingBox
ans =
64.5000 53.5000 428.0000 112.0000
  6 Comments
Akira Agata
Akira Agata on 9 Nov 2018
Edited: Akira Agata on 9 Nov 2018
Seems to be needed some tricks to automatically set the threshold. Here is my second try. I hope it works for your other images!
% Read the image and convert to gray scale
I = imread('image0515.jpg');
Igray = rgb2gray(I);
% Set 99th percentile intencity as the threshold
th = prctile(Igray(:),99);
% Extract droplet
BW = Igray > th;
BW2 = bwconvhull(BW);
% Mask the image
I2 = immultiply(Igray,BW2);
% Calculate the bounding box
s = regionprops(BW2,'BoundingBox');
% Visualize the result
figure
imshow(I)
hold on
rectangle('Position',s.BoundingBox,'EdgeColor','c')
balu p
balu p on 9 Nov 2018
Thank you Akira for your time! The code by Image analyst is more robust and user-friendly for all my images

Sign in to comment.

Categories

Find more on Image Processing Toolbox in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!