# Image processing of a binary image

12 views (last 30 days)
Shubham on 21 Feb 2023
Edited: Shubham on 27 Feb 2023
I made this binary image such that a bigger circle has non overlapping random smaller circles. How can I remove those circles those are not complete.
Shubham on 21 Feb 2023
yes I can give this condition at the begining when it is picking random co-ordinates.
Like, if the chosen co-ordinates are at a distance greater than small circle radius from the big circle pheriphery, then that is a valid co-ordinate but how to compare this using code
Jan on 21 Feb 2023
"how to compare this using code" - You must have some code, which prevent overlapping between the small circles already. The code to include only small circles inside a radius minus the radius of the small circle is trivial.
It would include something like: vecnorm(c - C) < bigR - smallR. As soon as you show your code, it would be very easy to insert this condition. But for posting a working answer, we have to guess, what you code is at first and rewrite it. This is not an efficient way to search for a solution.

Jan on 21 Feb 2023
Edited: Jan on 21 Feb 2023
w = 300; % Image size
bigR = 140;
smallR = 15;
wantN = 40; % Number of small circles
N = 0;
center = zeros(wantN, 2); % List of centers
iter = 0;
while N < wantN
c = rand(1, 2) * w;
collide = any(vecnorm(c - center, 2, 2) < 2 * smallR) | ...
vecnorm(c - w/2, 2, 2) >= bigR - smallR; % <- This is the needed condition
if ~collide
N = N + 1;
center(N, :) = c;
end
iter = iter + 1; % Better crash than run infinitely
if iter > 1e6
error('Cannot find a valid solution');
end
end
img = ones(w, w, 3);
img = drawCircle(img, [w/2, w/2], bigR, [1,0,0]);
img = drawCircle(img, center, smallR, [0,1,0]);
image(img);
function img = drawCircle(img, C, R, Color)
s = size(img);
mask = (((1:s(1)).' - reshape(C(:, 1), 1, 1, [])).^2 + ...
((1:s(2)) - reshape(C(:, 2), 1, 1, [])).^2) <= R^2;
img = reshape(img, [], 3);
img = reshape(img, s);
end
This shutgun technique is fragile: It will run into an infinite loop if wantN is too high.
Jan on 22 Feb 2023
Do you have some example code, which creates random ellipses?
Shubham on 23 Feb 2023
Edited: Shubham on 24 Feb 2023
Reference code is the one given in original post. We can have the overlapping criteria as vecnorm(c - center, 2, 2) < 2*major axis and at the boundary as vecnorm(c - w/2, 2, 2) >= bigR - major_axis.
But I dont know how to plot these ellipses.
In the code they have used a,b and orientation(using rand) to plot random ellipses.

Image Analyst on 22 Feb 2023
What I would have done is to get a mask of the big circle using bwconvhull, then call imclearborder
mask = imread('circles.png') > 128; % Get original binary image from a file.
subplot(1,2,1);
% Remove blobs at border
subplot(1,2,2);
Note: some blobs are touching to form a dumbbell-shaped blob, and are not circular. If those touch the border, the whole irregular shape will get removed.
Matt J on 22 Feb 2023
Edited: Matt J on 22 Feb 2023
Note: some blobs are touching to form a dumbbell-shaped blob, and are not circular. If those touch the border, the whole irregular shape will get removed.
Here's a refinement that can fix some of that.
mask = imread('circles.png') > 128; % Get original binary image from a file.
subplot(1,2,1);
se=strel('disk',4);
circ=imdilate(~circ,se);
% Remove blobs at border
subplot(1,2,2);
[m,n]=deal(sz(1),sz(2));
R=min(sz)/2;
[x,y]=deal((1:m)',1:n);
c=(x-mean(x)).^2+(y-mean(y)).^2<=R^2;
end

Matt J on 21 Feb 2023
Edited: Matt J on 21 Feb 2023
BW0=BW;
BW=imerode(BW, strel('disk',3));
BW=bwpropfilt(BW,'Eccentricity',[0,0.3]);
BW=imdilate(BW, strel('disk',3));
immontage({BW0,BW},'Bord',[5,5],'Back','w')