How can I delete data from my table if two centroids from regionprops are the same?
1 view (last 30 days)
Show older comments
I am analyzing spheroid formations on images of nerve tissue. My microscope saves multiple images from the same time, visualizing only some part of the tissue. Below is the code that is working for my images to identify the spheroids. However, since some images overlap with others, so does the regionprops. I want to be able to quantify the spheroid formation across all my images without counting some spheroids twice.
In the following code, I want my table "Testing" where I am saving all the information of regionprops to clear the data if two centroids are in the same position or relatively close to each other, and keep the largest spheroid.
%MATLAB CODE TO IMPORT FOR REGIONPROPS MULTIPLE IMAGES
clear;
clc;
n = 20; %assuming number of images is 20
stats = cell(n, 1);
for k = 15:n %Right now I am interested on starting on image #15-20 just for testing purposes
stats{k} = analyse(k);
end
Testing = [stats{15}.large_Stats;stats{16}.large_Stats;stats{17}.large_Stats;stats{18}.large_Stats;stats{19}.large_Stats;stats{20}.large_Stats];
%Here is where I want a code for my table to be take out double data based
%on centroid position
function out = analyse(k)
%MATLAB CODE FOR REGIONPROPS
filename = "45_min" + k + ".png";
A = imread(filename);
figure,imshow(A)
[~,BW,~] = imsplit(A);
%figure,imshow(BW);
BW = imsharpen(BW);
BW = imreducehaze(BW);
BW = im2bw(BW,0.85);
figure,imshow(BW)
stats = regionprops(BW,"all");
n=1;
for i = 1:length(stats)
out.area(i)= stats(i).Area;
out.perimeter(i) = stats(i).Perimeter;
out.circularity(i)= stats(i).Circularity;
out.centroid{i}= stats(i).Centroid;
out.majoraxislength(i) = stats(i).MajorAxisLength;
out.minoraxislength(i) = stats(i).MinorAxisLength;
if out.circularity(i)~=Inf && out.circularity(i)>0.44 && out.area(i)>120
out.large_areas(n) = out.area(i);
out.large_perimeter(n) = out.perimeter(i);
out.large_circularity(n) = out.circularity(i);
out.large_centroid(n) = out.centroid(i);
out.large_majoraxislength(n) = out.majoraxislength(i);
out.large_minoraxislength(n) = out.minoraxislength(i);
n= n+1;
end
end
out.centers = out.large_centroid';
out.centers = cell2mat(out.centers);
out.large_minoraxislength = out.large_minoraxislength';
out.large_majoraxislength = out.large_majoraxislength';
out.large_Stats = table(out.large_areas',out.large_perimeter', out.large_centroid', out.large_circularity', out.large_majoraxislength, out.large_minoraxislength);
out.large_Stats.Properties.VariableNames(1:4) = {'Area' 'Perimeter' 'Centroid' 'Circularity'};
out.diameters = mean([out.large_majoraxislength out.large_minoraxislength],2);
out.radii = out.diameters/2;
hold on
viscircles(out.centers,out.radii);
hold off
end
0 Comments
Answers (2)
Shreeya
on 11 Sep 2023
Hi @Francisco
I understand that you want to delete the spheroid data in the table “stats” which have the same centroid values. Kindly use the “unique” function for this:
[~,idx] = unique(stats.centroid)
stats = stats(idx,:)
Please refer to the documentation to know more about the function: https://www.mathworks.com/help/images/ref/regionprops.html
I hope this resolves your problem!
0 Comments
Image Analyst
on 11 Sep 2023
Chances are low that you will ever have the same centroid location exactly, out to 16 decimal places. I suggest you use ismembertol to find locations that are within one pixel unit of each other.
0 Comments
See Also
Categories
Find more on Image Segmentation and Analysis 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!