How to count pixels/measure area in binary image?
4 views (last 30 days)
Show older comments
I have an image (attached) where I want to count the number of pixels/measure the area of pixels that are in the space between the circles. I also want to individually count each sapce between the circles as its own element (as opposed to counting all the total spaces as one element). I have looked thorough the documentation on regionprops and am thinking perhaps I could attempt to get this using maybe ConvexHull in regionprops, but I am not really sure. I was thinking also maybe I could use bwconvhull, but when I tried to apply it I just got a blank image. I apologize as I am new to iamge processing in MATLAB, but could anyone provide guidance on how I could best achieve my goal? My current code is attached below, which is really just converting the image to binary and trying to use bwconvhull.
% Clear variables, figures, screen
clear all
close all
clc
% Read in image, display image
image = imread('image.png');
imshow(image)
% Convert image to grayscale
image_gray = rgb2gray(image);
figure
imshow(image_gray)
% Convert image to binary
threshold = 0.65;
image_binary = imbinarize(image_gray,threshold);
figure
imshow(image_binary)
% Calculate specific properties of image
stats = regionprops('table',image_binary,'Centroid','MajorAxisLength','MinorAxisLength','ConvexArea','ConvexHull','ConvexImage');
% Create subplot of original & binary image
figure
subplot(1,2,1);
imshow(image)
subplot(1,2,2);
imshow(image_binary)
% Create convex hull around objects
CH_objects = bwconvhull(image_binary,'objects');
figure
imshow(CH_objects);
title('Objects Convex Hull');
2 Comments
Accepted Answer
Kevin Holly
on 6 Jan 2023
img = imread("sample.png");
img = im2bw(img);
imshow(img)
se = strel('sphere',15);;
circles=imopen(~img,se);
imshow(circles)
se = strel('sphere',2);
spacebetween = imopen(~img-circles,se);
figure
imshow(spacebetween)
rp = regionprops('table',spacebetween>0,"Centroid", "Area")
rp.Area
0 Comments
More Answers (1)
Matt J
on 6 Jan 2023
Edited: Matt J
on 6 Jan 2023
Let's consider 3 regions B (the background, which you have as a binary image), C (the circles), and D (the connective arms between the circles that you are trying to obtain). You can use bwlalphaclose in this FEX download,
to seal the gaps between the circles, giving you B|D. The complement of B|D gives you the circles C. Once you have C, you obtain the region of interst D according to ~(B|C).
I could demonstrate this for you if you would attach image_binary as suggested above.
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!