MATLAB Answers

Determine the percentage of black pixels within a circle

15 views (last 30 days)
Vance Blake
Vance Blake on 18 May 2020
Edited: Vance Blake on 18 May 2020
Hello, I am trying to determine the total number of pixels within the blue circle (radius = 80 dimensionless units) and the percentage of them that are black. I have multiple files that I would like to analyze, and I wanted to code a way to read in each picture in the folder one by one and then store each image name with its coresponding percentage of black pixels in a matrix. The image sizes are not standardized since they were created using the snipping tool
I have tried to implement the methods in shown in the solution links but each one is more piece of what I need and Im struggling to put them all together. Any help would be greatly appreciated.
pathname = uigetdir;
allfiles = dir(fullfile(pathname,'*.png'));
image_percent = [];
for i=1:size(allfiles,1)
x=imread([pathname '\\' allfiles(i).name]);
image_percent=[image_percent; x]; % storage


Show 3 older comments
Vance Blake
Vance Blake on 18 May 2020
So this shows me a black and white image by giving all the pixels a value of 0 or 1 but I still can't calculate the number of black and white pixels within the circle itself. Im Iookng into trying to first crop each image im reading in to a standard size around the circle. Then I could binarize the image and calculate the total number of pixels and find the percentage of them that are black. I would like to use a loop and store this information in an array since there are about 70 images I would to analyze in this process.
darova on 18 May 2020
Do you know where the center circle is?
A = imread('image.png');
I = im2bw(A,0.1);
[m,n] = size(I);
[x,y] = ndgrid(1:m,1:n);
I1 = hypot(x-mean(x(:)),y-mean(y(:))) < 150;
Vance Blake
Vance Blake on 18 May 2020
Hi darova the center of the blue circle is the coordinates [0,0] on the plot. I don't know how that translates to the pixels of the png file itself though

Sign in to comment.

Answers (1)

Image Analyst
Image Analyst on 18 May 2020
Please post the original image, not a screenshot. Is the actual image a real gray scale image, or is it that RGB computer graphics diagram? Then, how are you getting the black and white (binary, logical) image from the original image?
Anyway, once you have the image segmented so that you have a mask with only black pixels and white pixels, then you can use sum() and nnz() to do the count. Assume circleMask is the mask of the overall, outer circle, and mask is your segmented, binary image of stuff inside you're interested in, then
numPixelsInCircleMask = sum(circleMask(:))
numWhitePixelsInMask = nnz(mask)
numBlackPixelsInMask = nnz(~mask) % or (numPixelsInCircleMask - numWhitePixelsInMask)
whiteAreaFraction = numWhitePixelsInMask / numWhitePixelsInMask
blackAreaFraction = 1 - whiteAreaFraction


Vance Blake
Vance Blake on 18 May 2020
Hi Image Analyst, I attached the images when I was rying to post last night but my computer froze and forced me to restart the question and now I get a warning saying that I cant attach them since Ive reached my daily upload limit. The images are png files that i stored after snipping them from the matlab plot window.
To get the black and white image I was gonna use imbinazie which i found using darvoa's suggestion of im2bw
Is there a way to do what you shown this using a for loop (I have 67 total images) and then storing all the information in an array or is it a manual process?
Also how do I segment the image, Ive looked at your demo function on the file exchange but Im unclear on what steps and lines of code apply to my situation?

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!

Translated by