2 deleted 1 characters in body
source | link
imga = Import["http://i.stack.imgur.com/moV5x.png"];
binary = MorphologicalComponents[
  LaplacianGaussianFilter[ColorNegate@imga, 2], 0.003`];  
components = 
 ComponentMeasurements[
  binary, {"Count", "AreaRadiusCoverage", "Centroid", 
   "MeanCentroidDistance", "MaxCentroidDistance", 
   "MinCentroidDistance"}, #1 > 400 && #2 < 0.01 &];
imga = Import["http://i.stack.imgur.com/moV5x.png"];
binary = MorphologicalComponents[
  LaplacianGaussianFilter[ColorNegate@imga, 2], 0.003`]; components = 
 ComponentMeasurements[
  binary, {"Count", "AreaRadiusCoverage", "Centroid", 
   "MeanCentroidDistance", "MaxCentroidDistance", 
   "MinCentroidDistance"}, #1 > 400 && #2 < 0.01 &];
imga = Import["http://i.stack.imgur.com/moV5x.png"];
binary = MorphologicalComponents[
  LaplacianGaussianFilter[ColorNegate@imga, 2], 0.003`];  
components = ComponentMeasurements[
  binary, {"Count", "AreaRadiusCoverage", "Centroid", 
   "MeanCentroidDistance", "MaxCentroidDistance", 
   "MinCentroidDistance"}, #1 > 400 && #2 < 0.01 &];
1
source | link

You're close: You can use ComponentMeasurements to calculate measurements for each component. (The same measurements that you can use in SelectComponents, too). If you can get away with the center of mass of the marked pixels, it'really quite simple:

imga = Import["http://i.stack.imgur.com/moV5x.png"];
binary = MorphologicalComponents[
  LaplacianGaussianFilter[ColorNegate@imga, 2], 0.003`]; components = 
 ComponentMeasurements[
  binary, {"Count", "AreaRadiusCoverage", "Centroid", 
   "MeanCentroidDistance", "MaxCentroidDistance", 
   "MinCentroidDistance"}, #1 > 400 && #2 < 0.01 &];

The "AreaRadiusCoverage" measurement helps to select components where most pixels are near the border. This returns a list of rules, one for each component that matches the filter function:

{193 -> {4516, 0., {222.283, 211.7}, 181.482, 200.342, 167.181}}

Where 193 is the component index, 4516 is the pixel count, 0. is AreaRadiusCoverage and so on.

The found circle looks like this:

Show[HighlightImage[imga, Image[1 - Abs[binary - components[[1, 1]]]]],
 Graphics[
  {
   Yellow, Dashed,
   components /. 
     {(_ -> {count_, areaRadiusCoverage_, center_, radii__}) 
     :> (Circle[center, #] & /@ {radii})}}]]

enter image description here


If the center of mass is not good enough, you can use the "Mask" component measurement to get an image of the marked pixels in each component:

imga = Import["http://i.stack.imgur.com/moV5x.png"];
binary = MorphologicalComponents[
  LaplacianGaussianFilter[ColorNegate@imga, 2], 0.003`]; components = 
 ComponentMeasurements[
  binary, {"Count", "AreaRadiusCoverage", 
   "Mask"}, #1 > 400 && #2 < 0.01 &];

The "mask" value returned looks like this:

Image[components[[1, 2, 3]]]

enter image description here

Getting the coordinates of the white pixels in this image is easy:

whitePixels = PixelValuePositions[Image[components[[1, 2, 3]]], 1];

Now, what we're looking for is a circle with center (cx,cy) and radius r that minimized:

err = Total[
  Map[
      Function[whitePixel, (Norm[{cx, cy} - whitePixel] - r)^2], 
      whitePixels]];

i.e. the squared distance of the white pixels from the circle.

We can simply pass this error function to FindMinimum:

optimalCircle = FindMinimum[err, {cx, cy, r}]

To get a better estimate of the circle:

Show[HighlightImage[imga, Image[components[[1, 2, 3]]]],
 Graphics[
  {
   Yellow, Dashed,
   Circle[{cx, cy}, r] /. optimalCircle[[2]]}]]

enter image description here

(Finding the min/max radius should be straightfoward from here - you have the center and the white pixel coordinates.)