Erode the image using a structuring element which is the size/shape of the maximum allowable "bad region". Then dilate using the same structuring element. This will remove the bad-but-good-enough regions. From there you can work on characterizing/measuring what's left. Example given below using Matlab.
% Create a blank image.
Mimg = 1000;
Nimg = 1000;
img = zeros( Mimg, Nimg );
% Make up some coordinates.
m = 0 : Mimg - 1;
n = 0 : Nimg - 1;
[ MM, NN ] = ndgrid( m(:), n(:).' );
% Populate the bad pixel mask.
Ncirc = 50;
dmax = 40; % Max possible radius
r = randi( dmax, [ Ncirc, 1 ] ); % Radius of circles
x0 = randi( Mimg, [ Ncirc, 1 ] ) - 1; % x-coorindate of center
y0 = randi( Mimg, [ Ncirc, 1 ] ) - 1; % y-coordinate of center
for ii = 1 : Ncirc
t = sqrt( ( x0(ii) - MM ).^2 + ( y0(ii) - NN ).^2 );
img( t <= r(ii) ) = 1;
end
% The threshold radius for unignorable bad regions.
d = 20;
% Create the structuring element.
s = sqrt( bsxfun( @plus, ( (1:d*2)' - d ).^2, ( (1:d*2) - d ).^2 ) ) <= d;
% Remove the bad pixel regions that are too small to care about.
img_bad = imdilate( imerode( img, s ), s );
figure();
set( gcf(), 'color', 'w' );
subplot( 1, 2, 1 );
imagesc( img );
colormap( gray );
title( 'Bad Pixel Mask' );
subplot( 1, 2, 2 );
imagesc( img_bad );
title( 'Too Big To Ignore Mask' );
colormap( gray );