MATLAB Answers

Counting Total Number of Pixels by Color in a Segmented Image

12 views (last 30 days)
Hello I have mutiple segmented images that I would like to count the number of white, red, and blue pixels in each image using a for loop. I would like to store the number of red, white, and blue pixels associated with each image in an array along with the filename of each image. I can do each image manually, but I would like to make the process faster. I count the black pixels to make sure that the sum total of pixels assigned is close to 90,000, since each image is 300x300 and some pixels might be hard to distguinsh. Any help would be greatly appreicated. Thanks
rgbImage = imread('BioM Edge 576 Gen 5 Infl Rnge Start Segmented.png');
%rgbImage = imread('BioM Edge 576 Gen 10 Infl Rnge Start Segmented.png');
%rgbImage = imread('BioM Edge 576 Gen 15 Infl Rnge Start Segmented.png');
%rgbImage = imread('BioM Edge 576 Gen 20 Infl Rnge Start Segmented.png');
%rgbImage = imread('BioM Edge 576 Gen 25 Infl Rnge Start Segmented.png');
%rgbImage = imread('BioM Edge 576 Gen 30 Infl Rnge Start Segmented.png');
%%
BluePixels = rgbImage(:,:,1) == 0 & rgbImage(:,:,2) == 0 & rgbImage(:,:,3) == 255;
numBluePixels = sum(BluePixels(:));
%%
RedPixels = rgbImage(:,:,1) == 255 & rgbImage(:,:,2) == 0 & rgbImage(:,:,3) == 0;
numRedPixels = sum(RedPixels(:));
%%
WhitePixels = rgbImage(:,:,1) == 255 & rgbImage(:,:,2) == 255 & rgbImage(:,:,3) == 255;
numWhitePixels = sum(WhitePixels(:));
%%
BlackPixels = rgbImage(:,:,1) == 0 & rgbImage(:,:,2) == 0 & rgbImage(:,:,3) == 0;
numBlackPixels = sum(BlackPixels(:));

  0 Comments

Sign in to comment.

Accepted Answer

Image Analyst
Image Analyst on 1 Jun 2020
Edited: Image Analyst on 1 Jun 2020
In the for loop over all image files, just index the variables:
numBluePixels(k) = sum(BluePixels(:));
etc.
To check that the sum of blue, red, white, and black pixels is to within some tolerance of the total number of pixels, just sum them up at the bottom of the loop
tolerance = 0.05 * numel(BluePixels); % 5% of the total number of pixels.
if numBluePixels(k) + numWhitePixels(k) + numRedPixels(k) + numBlackPixels(k) > numel(BluePixels) - tolerance
% The sum is close enough to 90,000
else
% The sum is not close enough to 90,000 because some pixels were not classified as one of those colors.
end

  5 Comments

Show 2 older comments
Vance Blake
Vance Blake on 2 Jun 2020
So I made the changes you suggested, but now it give the error message that the matrix dimensions dont agree when trying to send the second images values to the (newly renamed) matrix Pixel_Totals. So instead of making a 2-by-4 matrix it is trying to make a 1-by-8.
Unable to perform assignment because the size of the left side is 1-by-4 and the size of the right
side is 1-by-8.
Error in Untitled7 (line 17)
Pixel_Totals(i, :) = [numRedPixels, numWhitePixels, numBluePixels, numBlackPixels];
fileList = dir('*.png');
N = size(fileList,1);
% Make array Pixel_Totals to hold all the sums
Pixel_Totals = zeros(N,4);
for i = 1:N
thisFileName = fullfile(fileList(i).folder, fileList(i).name)
rgbImage = imread(thisFileName);
BluePixels = rgbImage(:,:,1) == 0 & rgbImage(:,:,2) == 0 & rgbImage(:,:,3) == 255;
numBluePixels(i) = sum(BluePixels(:));
RedPixels = rgbImage(:,:,1) == 255 & rgbImage(:,:,2) == 0 & rgbImage(:,:,3) == 0;
numRedPixels(i) = sum(RedPixels(:));
WhitePixels = rgbImage(:,:,1) == 255 & rgbImage(:,:,2) == 255 & rgbImage(:,:,3) == 255;
numWhitePixels(i) = sum(WhitePixels(:));
BlackPixels = rgbImage(:,:,1) == 0 & rgbImage(:,:,2) == 0 & rgbImage(:,:,3) == 0;
numBlackPixels(i) = sum(BlackPixels(:));
Pixel_Totals(i,:) = [numRedPixels, numWhitePixels, numBluePixels, numBlackPixels];
end
%%
Image Analyst
Image Analyst on 2 Jun 2020
Vance, try this more robust, expanded version:
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 15;
fprintf('Beginning to run %s.m ...\n', mfilename);
folder = pwd; % or c:\wherever you want
filePattern = fullfile(folder, '*.png');
fileList = dir('*.png');
numberOfImageFiles = size(fileList,1);
numberAnalyzed = 0;
% Make array Pixel_Totals to hold all the sums
Pixel_Totals = zeros(numberOfImageFiles,4);
for k = 1:numberOfImageFiles
thisFileName = fullfile(fileList(k).folder, fileList(k).name);
fprintf('Processing %s\n', thisFileName);
rgbImage = imread(thisFileName);
if size(rgbImage, 3) ~= 3
% Skip gray scale or binary images.
fprintf('Skipping %s\n because it is not a true color RGB image.\n', thisFileName);
continue;
end
subplot(1, 2, 1);
imshow(rgbImage);
axis('on', 'image');
title(fileList(k).name, 'FontSize', fontSize, 'Interpreter', 'none');
BluePixels = rgbImage(:,:,1) == 0 & rgbImage(:,:,2) == 0 & rgbImage(:,:,3) == 255;
numBluePixels(k) = sum(BluePixels(:));
RedPixels = rgbImage(:,:,1) == 255 & rgbImage(:,:,2) == 0 & rgbImage(:,:,3) == 0;
numRedPixels(k) = sum(RedPixels(:));
WhitePixels = rgbImage(:,:,1) == 255 & rgbImage(:,:,2) == 255 & rgbImage(:,:,3) == 255;
numWhitePixels(k) = sum(WhitePixels(:));
BlackPixels = rgbImage(:,:,1) == 0 & rgbImage(:,:,2) == 0 & rgbImage(:,:,3) == 0;
numBlackPixels(k) = sum(BlackPixels(:));
Pixel_Totals(k,:) = [numRedPixels(k), numWhitePixels(k), numBluePixels(k), numBlackPixels(k)];
fprintf(' Class Counts: %d %d %d %d\n', numRedPixels(k), numWhitePixels(k), numBluePixels(k), numBlackPixels(k));
numberAnalyzed = numberAnalyzed + 1;
% Display as a bar chart.
subplot(1, 2, 2);
bar(Pixel_Totals(k,:));
grid on;
drawnow;
end
Pixel_Totals
fprintf('Done analyzing %d RGB images out of %d total image files (RGB & gray scale).\n', numberAnalyzed, numberOfImageFiles);
% Plot the mean counts
subplot(1, 2, 2);
meanClassCounts = mean(Pixel_Totals, 1)
bar(meanClassCounts);
grid on;
caption = sprintf('Mean Class Counts\n(Averaged over %d RGB Images)', numberAnalyzed);
title(caption, 'FontSize', fontSize);
xlabel('Color Class', 'FontSize', fontSize);
ylabel('Count', 'FontSize', fontSize);
Vance Blake
Vance Blake on 2 Jun 2020
Wow enhanced is a bit of an understatement this^ is why you're an MVP on here. I finished up manually counting them a couple of hours ago, but I am really glad to have this version for the next batch. Thank you so much for your help! A lot of your other codes have been instructive for me.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!

Translated by