filter objects below a certain size in a binary image ?

clear
clc
A5=imread('C:\Users\AMIT\Desktop\CB\sulphur\4-5.jpg');
imshow(A5);
BW = im2bw(A5,0.5);
imshow(BW,0.5)
C = imcrop(BW);
bw2 = bwareaopen(C,5);
figure, imshow(bw2)
ComplementImage=imcomplement(bw2);
imshow(ComplementImage);
[labeledimage,numberofobject]=bwlabel(ComplementImage);
numberofobject
% bwareaopen is not working even if I increase 5 to another higher value

 Accepted Answer

Well of course not. You inverted the image so you have only one object - the background. Don't do that! Try this code:
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;
originalImage=imread('D:\Temporary stuff/1234.jpg');
subplot(2,2,1);
imshow(originalImage);
axis on;
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')
BW = im2bw(originalImage,0.5);
subplot(2,2,2);
imshow(BW, []);
axis on;
promptMessage = sprintf('Do you want to crop the image,\nor Cancel to abort processing?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
message = sprintf('Drag out a box in the upper right image\nthen double-click inside to finish');
uiwait(helpdlg(message));
croppedImage = imcrop(BW);
bw2 = bwareaopen(croppedImage, 9);
bw2 = imclearborder(bw2); % Get rid of huge white surround.
subplot(2,2,3);
imshow(bw2)
axis on;
[labeledimage, numberofobjects] = bwlabel(bw2);
numberofobjects
message = sprintf('The number of objects = %d', numberofobjects);
uiwait(helpdlg(message));
measurements = regionprops(labeledimage, 'Area');
allAreas = sort([measurements.Area], 'Descend')

5 Comments

thanks for helping me out but still it shows numberofobjects as 1 only and it'll be more than that, i'll attach a sample file here so that you could know what I am trying to count in that image, I have to reject only a few small black spots, rest all I will take the count of numberofobjects will be around 50-60 max not more than that
thanks in advance
Well this is a totally different image! Your first image was a binary image and this one is a beige RGB image. Totally different. You need to binarize it first. What is your code for doing that?
well the code I posted initially converts this image to a binary image , even in your program I was getting a binary image
This one needs to be inverted since it's not a binary image to start with like the original image you posted. The code is below and does give different numbers of objects if you vary the parameter to bwareaopen().
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;
originalImage=imread('D:\Temporary stuff/4-1.jpg');
subplot(2,2,1);
imshow(originalImage);
axis on;
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')
BW = ~im2bw(originalImage,0.5);
subplot(2,2,2);
imshow(BW, []);
axis on;
promptMessage = sprintf('Do you want to crop the image,\nor Cancel to abort processing?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
message = sprintf('Drag out a box in the upper right image\nthen double-click inside to finish');
uiwait(helpdlg(message));
croppedImage = imcrop(BW);
bw2 = bwareaopen(croppedImage, 9);
bw2 = imclearborder(bw2); % Get rid of huge white surround.
subplot(2,2,3);
imshow(bw2)
axis on;
[labeledimage, numberofobjects] = bwlabel(bw2);
numberofobjects
message = sprintf('The number of objects = %d', numberofobjects);
uiwait(helpdlg(message));
measurements = regionprops(labeledimage, 'Area');
allAreas = sort([measurements.Area], 'Descend')
It worked ,You're the best thanks a ton

Sign in to comment.

More Answers (0)

Categories

Find more on Creating, Deleting, and Querying Graphics Objects 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!