How do I calculate number of white pixels inside ROI?

30 visualizaciones (últimos 30 días)
Alexander Hsu
Alexander Hsu el 9 de Jul. de 2020
Respondida: Madhav Thakker el 21 de Ag. de 2020
I'm trying to calculate the number of white pixels in my roi of the last image which has already been segmented and converted to binary. I need the number of white pixels within the roi and not the entire image. I've copied my code below. The area im having issues with is commented ROI. My image is in the answers section.
clc;
close all;
clear;
% Get dimensions of image
grayImage = imread('viralplaque.jpg');
[rows, columns, numberOfColorChannels] = size(grayImage);
if numberOfColorChannels > 1
grayImage = rgb2gray(grayImage);
end
subplot(2, 3, 1);
imshow(grayImage,[]);
title('grayscale');
% Binarize image by thresholding
mask = grayImage > 90;
subplot(2, 3, 2);
imshow(mask);
title('binary')
% Get rid of small blobs
mask = bwareaopen(mask, 50);
labeledImage = bwlabel(mask,4);
% Find areas and perimeters
stats = regionprops(labeledImage,'Area', 'Perimeter');
allAreas = [stats.Area];
sortedAreas = sort(allAreas,'descend');
allPerimeters = [stats.Perimeter];
% Compute circularities
circularities = allPerimeters .^ 2 ./ (4 * pi * allAreas)
sortedC = sort(circularities, 'descend');
% Keep only blobs that are nowhere close to circular or compact.
minAllowableCircularity = .5;
keeperIndexes = find(circularities >= minAllowableCircularity);
mask = ismember(labeledImage, keeperIndexes);
% Display the mask image.
subplot(2, 3, 3);
imshow(mask);
title('removeWhite')
% Get rid of black islands
subplot(2, 3, 4);
maskFinal = ~bwareaopen(~mask, 1000);
imshow(maskFinal);
title('removeBlack')
% Plaque count
Rmin = 7;
Rmax = 11;
[centers,radii] = imfindcircles(maskFinal,[Rmin Rmax],'objectpolarity','bright','sensitivity',0.96,'edgethreshold',0.1);
subplot(2, 3, 5)
imshow(maskFinal);
title('plaqueCount');
plaques = viscircles(centers,radii,'color','r');
length(centers)
% ROI
Rmin2 = 150;
Rmax2 = 300;
[center,radius] = imfindcircles(maskFinal,[Rmin2 Rmax2],'ObjectPolarity','dark','sensitivity',0.95);
subplot (2, 3, 6);
imshow(maskFinal);
title('roi');
roi = images.roi.Circle(gca,'Center',center, 'Radius',0.99*radius)

Respuestas (1)

Madhav Thakker
Madhav Thakker el 21 de Ag. de 2020
Hi
You can use the inpolygon function to check whether a query point lies inside the polygon. You can make a polygon from your ROI and count the number of white pixels that lie inside the polygon.
I am attaching the code for better understanding.
xc = roi.Center(1);
yc = roi.Center(2);
n = 200;
theta = (0:n-1)*(2*pi/n);
x = xc + r*cos(theta);
y = yc + r*sin(theta);
P = polyshape(x,y);
xpoly = P.Vertices(:,1);
ypoly = P.Vertices(:,2);
[xquery, yquery] = find(maskFinal);
inpolygon(xquery, yquery, xpoly, ypoly);
inpolygon(xquery, yquery, xpoly, ypoly);
disp(nnz(inpolygon(xquery, yquery, xpoly, ypoly)))
Hope this helps.
inpolygon documentation for better understanding –

Community Treasure Hunt

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

Start Hunting!

Translated by