You already know the smaller circles in the image (which you painted in black).
- Prepare the mask image using these circles so that areas with smaller circles have non-zero pixels. We will call the mask :

- In the original image, fill these areas of the circle with dark color (for example, black). This will result in an image like your pic. 2. We will call it filled
- The threshold value is filled to get dark areas. We will call it binary . You can use the Otsu threshold for this. The result will look something like this:

- Take the distance conversion of this binary image. To do this, use the method of accurate distance estimation. We will call it dist . It will look something like this. Color is just a heatmap for clarity:


- Use mask to get peak areas from dist . The maximum value of each such area should give you the radius of a larger circle. You can also do some processing in these regions to get a more reasonable radius value, and not just increase the maximum speed.
- To select regions, you can find the outline of the mask. and then extract this region from the dist image or, since you already know that smaller circles from applying the hough-circle transformation, prepare a mask from each of these circles and extract this region from the dist image. I am not sure that you can calculate the maximum or other statistics by providing a mask. Max will definitely work because the rest of the pixels are 0. Perhaps you can calculate region statistics if you extract these pixels to another array.
The figures below show such a mask and the extracted area from dist . For this, I get max about 29, which corresponds to the radius of this circle. Please note that images do not scale.
circle mask, extracted from dist


Here's the code (I don't use hough circle conversion):
Mat im = imread(INPUT_FOLDER_PATH + string("ex1.jpg")); Mat gray; cvtColor(im, gray, CV_BGR2GRAY); Mat bw; threshold(gray, bw, 0, 255, CV_THRESH_BINARY|CV_THRESH_OTSU); // filtering smaller circles: not using hough-circles transform here. // you can replace this part with you hough-circles code. vector<int> circles; vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); for(int idx = 0; idx >= 0; idx = hierarchy[idx][0]) { Rect rect = boundingRect(contours[idx]); if (abs(1.0 - ((double)rect.width/rect.height) < .1)) { Mat mask = Mat::zeros(im.rows, im.cols, CV_8U); drawContours(mask, contours, idx, Scalar(255, 255, 255), -1); double area = sum(mask).val[0]/255; double rad = (rect.width + rect.height)/4.0; double circArea = CV_PI*rad*rad; double dif = abs(1.0 - area/circArea); if (dif < .5 && rad < 50 && rad > 30) // restrict the radius { circles.push_back(idx); // store smaller circle contours drawContours(gray, contours, idx, Scalar(0, 0, 0), -1); // fill circles } } } threshold(gray, bw, 0, 255, CV_THRESH_BINARY_INV|CV_THRESH_OTSU); Mat dist, distColor, color; distanceTransform(bw, dist, CV_DIST_L2, 5); double max; Point maxLoc; minMaxLoc(dist, NULL, &max); dist.convertTo(distColor, CV_8U, 255.0/max); applyColorMap(distColor, color, COLORMAP_JET); imshow("", color); waitKey(); // extract dist region corresponding to each smaller circle and find max for(int idx = 0; idx < (int)circles.size(); idx++) { Mat masked; Mat mask = Mat::zeros(im.rows, im.cols, CV_8U); drawContours(mask, contours, circles[idx], Scalar(255, 255, 255), -1); dist.copyTo(masked, mask); minMaxLoc(masked, NULL, &max, NULL, &maxLoc); circle(im, maxLoc, 4, Scalar(0, 255, 0), -1); circle(im, maxLoc, (int)max, Scalar(0, 0, 255), 2); cout << "rad: " << max << endl; } imshow("", im); waitKey();
Results (to scale):


Hope this helps.