How to use regionprops to find areas of specific size, and draw an ellipse around them of different colors?
32 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
回答 (1 件)
Harikrishnan Balachandran Nair
2021 年 11 月 29 日
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 件のコメント
参考
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!