Algo:
- create / clear image mask
- binarize the image (black and white with a certain intensity threshold)
- handle all pixels
count the number of pixels of the same color in the x,y directions
name it wx,wy
detection of a circle, shot and middle part
circles are thin, so wx or wy should be less than a thin threshold, and the other should be larger. The shots are large, so the stand wx and wy should be in the range of shot diameters. The middle section is black and the stand wx,wy above all threshold values (here you can calculate avg). Save this information in a mask
re-color image with mask information
computer center and circle radii from found points
center - the midpoint of the middle area, now process all green points and calculate the radius for it. Make a histogram for all the radii found and sort it in descending order. The counter must correspond to 2*PI*r , if you do not ignore such points.
group shots together
therefore, segmentation or pouring of the fill repeats each hit to avoid multiple accounting for a single shot
I encoded # 1 .. # 6 for fun in C ++, here is the code:
picture pic0,pic1,pic2;
I use my own image class for images, so some members:
xs,ys image size in pixels
p[y][x].dd - pixel at position (x,y) as a 32-bit integer type
clear(color) - clears the entire image
resize(xs,ys) - resize the image in a new resolution
This is a repainted result.

- green - thin circles
- blue middle part
- red cross (center of circles)
- red - pictures
since you can see that he needs further processing with bullets # 7, # 8, and also your image does not have any picture outside the middle part, so some adjustment may be required to detect a shot outside the middle part.
[edit1] radiuses

circles found in Magenta ... pretty good, I think. The middle part is screwed in a little. You can calculate the average radius step and interpolate the missing circles ...
source share