santosh patil
santosh patil

Reputation: 85

how do i mask labeled object based on some specified threshold value for each objects area,majoraxis and minoraxis?

i am currently using bwconnomp to label each connected object and regionpropsto find area, majoraxis, minoraxis of each labeled object respectively. i am also displaying each labeled object its area,majoraxis and minoraxis. now i want to set some threshold for area,majoraxis and minoraxis and if the value of area,majoraxis and minoraxis is above specified threshold then that object has to be masked.how this can be done??

here is my code

clc
clear all
close all
Index = 1;
scrsz = get(0,'ScreenSize');
%read an image
while Index ~= 0
    % Open a dialog and select an image file
    [FileName,FilePath,Index] = uigetfile('*.png', 'Open Imagefile ');
    if Index == 0
        disp('Procedure Done')
        break;
    end
inimage = imread([num2str(FilePath) FileName]);
D=inimage;
A=inimage;
subplot(2,3,1);
imshow(inimage);
title('original image');


%labeling algorithm
 B=im2bw(inimage);
 C=imfill(B,'holes');
 label=bwlabel(C);
 max(max(label))
 CC = bwconncomp(B);
data = regionprops(CC,'all');


for j=1:max(max(label))
[row, col] = find(label==j);
len=max(row)-min(row)+2;
breadth=max(col)-min(col)+2;
target=uint8(zeros([len breadth] ));
sy=min(col)-1;
sx=min(row)-1;

for i=1:size(row,1)
x=row(i,1)-sx;
y=col(i,1)-sy;
target(x,y)=A(row(i,1),col(i,1));
end
mytitle=strcat('Object Number:' ,num2str(j),'area:', num2str(data(j).Area),'MajorAxis: ',num2str(data(j).MajorAxisLength),'MinorAxis: ',num2str(data(j).MinorAxisLength));
figure,imshow(target);title(mytitle);
a=size(target);
ax=a(1);
ay=a(2);
pos=[1,1,ay,ax];
rectangle('Position',pos,'EdgeColo','r')
end

next = input('next image? press Enter: ');
if next == 0
    channelactivity = 0;
    break
else
    close all
    disp('==================================')
    pause(0.2)
    continue
end

end

Upvotes: 0

Views: 194

Answers (1)

Benoit_11
Benoit_11

Reputation: 13945

Here is a way to do it. The code is commented so easy to follow; the important line is the following:

AboveAreaIndices = find(vertcat(data.Area) > SomeValue)

In which you store the indices of the objects whose area is larger than SomeValue. In the example I color them red but you can do whatever you want with them or remove them altogether from the data structure.

You can also use logical operators to combine multiple conditions for example using the MinorAxis and MajorAxis properties. Note that I used AllArea as anew variable to store the concatenated areas to make things clearer, but you can keep them as vertcat(data.Area).

AboveIndices = find(vertcat(data.Area) > SomeValue & vertcat(data. MinorAxis) > SomeValue & Bla bla bla...);

Whole code:

clear
clc
close all

%// Read and clean up sample image
A = imread('rice.png');

A = im2bw(A,.5);

A = bwareaopen(A,50);
CC = bwconncomp(A);

%// Same as you.
data = regionprops(CC,'all');

%// Concatenate all the areas into an array. 
AllArea = vertcat(data.Area);

%//========================================
%//==== Apply threshold on area here \\====

AboveAreaIndices = find(AllArea > 150);

%// If you wish to remove the entries from the data structure
% data(AllArea>150) = [];
%//========================================

%// Same for centroids...for display purposes
AllCentroids = vertcat(data.Centroid);


%// Display original and thresholded objects. Use the indices calculated
%// above to "mask" large areas if you want
imshow(A);

hold on

scatter(AllCentroids(:,1),AllCentroids(:,2),40,'b','filled')
scatter(AllCentroids(AboveAreaIndices,1),AllCentroids(AboveAreaIndices,2),40,'r','filled')

And sample output:

enter image description here

Upvotes: 2

Related Questions