How to use regionprops to find areas of specific size, and draw an ellipse around them of different colors?
26 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Kristin Aldridge
am 10 Nov. 2021
Beantwortet: Harikrishnan Balachandran Nair
am 29 Nov. 2021
I have a script that finds all the "nuclei" of an image, but I want to exclude pixels less than three or greater than 200 and draw a green ellipse around them, while for everything within that range I want to create a yellow ellipse.
I think I have to use s.area but I'm not sure how to use that.
uiopen('location_drosophila_embryo_wild_type.tif');
pic=drosophila_embryo_wild_type;
graypic=rgb2gray(pic);
imshow(graypic)
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(graypic), hy, 'replicate');
Ix = imfilter(double(graypic), hx, 'replicate');
img = sqrt(Ix.^2 + Iy.^2);
figure(2), imshow(img,[]), title('Sobel')
img = img./max(max(img));
sobelpic=img;
%chosen threshold
threshs = [0.34]
for i =1:length(threshs)
BW = im2bw(sobelpic,threshs(i));
imagesc(BW);
title(['threshs=0.34 ',num2str(i)]);
end
BW = im2bw(sobelpic,threshs(1));
BW = imcomplement(BW);
imshow(BW)
s = regionprops(BW,'Orientation', 'MajorAxisLength', ...
'MinorAxisLength', 'Eccentricity', 'Centroid');
hold on
phi = linspace(0,2*pi,50);
cosphi = cos(phi);
sinphi = sin(phi);
for k = 1:length(s)
xbar = s(k).Centroid(1);
ybar = s(k).Centroid(2);
a = s(k).MajorAxisLength/2; % I believe I need to work in this area? But I'm not sure.
b = s(k).MinorAxisLength/2;
theta = pi*s(k).Orientation/180;
R = [ cos(theta) sin(theta)
-sin(theta) cos(theta)];
xy = [a*cosphi; b*sinphi];
xy = R*xy;
x = xy(1,:) + xbar;
y = xy(2,:) + ybar;
plot(x,y,'r','LineWidth',2);
hold on;
end
%s=regionprops (number of nuclei) = 803
%I've tried
for k=1:length(s)
UB=200
LB=3
area=s.Area(LB> 3, UB<200);
end
%and
upperareas = (s.Area.<200)
lowerareas= (s.Area.>3)
diameters = mean([s.MajorAxisLength<200 s.MinorAxisLength>3],2);
radii = diameters/2;
viscircles(areas,radii);
%but I'm not exactly sure what I'm doing.
0 Kommentare
Antworten (1)
Harikrishnan Balachandran Nair
am 29 Nov. 2021
Hi Kristin,
I understand that you are trying to find connected Components in your binary image having areas within a specified limit , using the 'regionprops' function.
In the given code, since you have not mentioned the 'Area' property inside the 'regionprops' function, the resulting struct 's' will not have a field named 'Area'. You can add the 'Area' field to the output using the following code
s = regionprops(BW,'Orientation', 'MajorAxisLength', ...
'MinorAxisLength', 'Eccentricity', 'Centroid','Area');
You can further extract the 'Area' field of all components as an array, and find the indices where the value of area is in the desired range.
idx = ([s.Area]<UB & [s.Area]>LB);
Now , with the help of these indices, you can draw the circles of desired colour at the required centroids using the 'viscircles' function.
0 Kommentare
Siehe auch
Kategorien
Mehr zu Stress and Strain finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!