フィルターのクリア

how to find the centroid of cells in an image

6 ビュー (過去 30 日間)
Kate Heinzman
Kate Heinzman 2020 年 3 月 9 日
コメント済み: Kate Heinzman 2020 年 3 月 9 日
clear
% Read in image
image = imread('F:\SPRING 2020\LIVING SYSTEM ANALYSIS-BIOSTATS\CELL SEEDING\A1_TR_02122020_1200.jpg');
% Show image you're working with
imshow(image,[]);
% Convert image to a grayscale image
grayImage = rgb2gray(image);
% Show grayscale image
imshow(grayImage,[]);
% Enhance the contrast of the image using imadjust
image_imadjust = imadjust(grayImage, [0 1], [0 1], 0.4);
imshow(image_imadjust,[]);
imshowpair(grayImage,image_imadjust,'montage');
% Additional step of removing noise by adaptive filtering using a small 5x5
% window
noiseRemoval = wiener2(image_imadjust, [10 10]);
imshow(noiseRemoval,[]);
imshowpair(image_imadjust,noiseRemoval,'montage');
% Creating a binary mask that contains the edge detected cells
binary_mask = edge(noiseRemoval,'sobel');
imshow(binary_mask,[]);
imshowpair(grayImage,binary_mask,'montage');
% Fill in the gaps in the lines surrounding the object in the gradient
% mask by dilating the sobel image using linear structuring elements
% Create two perpindicular linear structuring elements using strel function
se90 = strel('line',3,90);
se0 = strel('line',3,0);
% Dialate the binary gradient mask using the vertical structuring element
% followed by the horizontal structuring element
dilated = imdilate(binary_mask,[se90 se0]);
imshow(dilated,[]);
% Filling any holes within the cells
fill = imfill(dilated,'holes');
imshow(fill,[]);
% Perform another morphological opening of the cells using a disc kernel
fillagain = imopen(fill,strel('disk',4));
imshow(fillagain,[]);
imshowpair(fill,fillagain,'montage');
% Objects on the borders can be caused by noise and other artifacts
% Can eliminate objects on the borders using imclearborders
clearBorder = imclearborder(fillagain,8);
imshow(clearBorder,[]);
imshowpair(fillagain, clearBorder,'montage');
% Remove all connected components (cells) that have fewer than 10 pixels
bware = bwareaopen(clearBorder, 100);
imshow(bware,[]);
% Find the perimeter of cells
bw4_perim = bwperim(bware);
% The [1 .3 .3] is just specifying the color
overlay1 = imoverlay(bware, bw4_perim, [1 .3 .3]);
imshow(overlay1,[]);
I = grayImage .* uint8(bware);
imshow(I,[]);
% Some cells will overlap so apply watershed algorithm on the image which
% will be able to partially divide the groups into distinct cells
% Find cell centroids
maxs = imextendedmax(I, 5);
maxs = imclose(maxs, strel('disk',2));
maxs = imfill(maxs, 'holes');
maxs = bwareaopen(maxs, 1);
overlay2 = imoverlay(I, bw4_perim | maxs, [1 .3 .3]);
imshow(overlay2,[]);
% modify the image so that the background pixels and the extended maxima pixels are forced to be the only local minima in the image.
Jc = imcomplement(I);
I_mod = imimposemin(Jc, ~bware | maxs);
% Apply the watershed algorithm
L = watershed(I_mod);
labeledImage = label2rgb(L);
% Count number of cells
[L, num] = bwlabel(L);
% Overlay the detected cells over the original grayscale image to evaluate
% the performance of the algorithm
mask = im2bw(L, 1);
overlay3 = imoverlay(I, mask, [1 .3 .3]);
imshow(overlay3,[]);
I am trying to find the centroid of the cells in this image so that I can count the number of cells despite if any of them overlap, however the code that I have bolded above is not finding the centroid of every cell. I was wondering if I have my numbers wrong or what could be the solution to my problem, because I still want to overlay the centroids onto my image to see that it has correctly found the centroids. I've included the original image below.

採用された回答

Image Analyst
Image Analyst 2020 年 3 月 9 日
Continue your code with this:
% Find the centroids of the mask.
props = regionprops(mask, grayImage, 'Centroid', 'WeightedCentroid');
allCentroids = vertcat(props.Centroid);
% Plot centroids over image in the overlay
hold on;
for k = 1 : size(allCentroids, 2)
x = allCentroids(k, 1);
y = allCentroids(k, 2);
plot(x, y, 'r.', 'MarkerSize', 25)
% You can plot the Weighted Centroids (weighted by the gray level) instead if you want.
end
  1 件のコメント
Kate Heinzman
Kate Heinzman 2020 年 3 月 9 日
Thank you so much!!

サインインしてコメントする。

その他の回答 (0 件)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by