7
$\begingroup$

From a 3d x-ray scan, I have many similar slices to analyze. Is there a way to determine the position of the three rectangles and the inner circle? X-Ray Image

enter image description here

enter image description here

$\endgroup$
2
  • $\begingroup$ Could you please post two or three different images? $\endgroup$ Feb 7, 2014 at 21:13
  • $\begingroup$ Related, this and this $\endgroup$ Feb 7, 2014 at 21:13

2 Answers 2

4
$\begingroup$

This is how I did it:

(* These can be compounded into one expression *)
img = Binarize[Import["https://i.stack.imgur.com/EY2EG.png"], 0.2];
img = DeleteSmallComponents[img, 20];
img = DeleteBorderComponents@ImageCrop@img;
m = MorphologicalComponents[img];

(* Identify circles versus rectangles using Eccentricity *)
{rectangles, circles} = GatherBy[ComponentMeasurements[m, "Eccentricity"], #[[2]] > 0.5 &][[All, All, 1]];

(* Visualize result *)
Show[
 m // Colorize,
 Graphics[{
   PointSize[Large],
   White,
   Point /@ (circles /. ComponentMeasurements[m, "Centroid"]),
   Gray,
   Point /@ (rectangles /. ComponentMeasurements[m, "Centroid"])
   }]
 ]

result

White spots are the center of mass of rectangles. Gray spots are the center of mass of circles. There are a few values that might need to be tweaked for some images, like the size of small components, i.e. noise. Eccentricity is a very good measurement to figure out which are circles and which are rectangles. The rectangles have > .99 and circles have a very small eccentricity (in theory zero).

$\endgroup$
2
  • $\begingroup$ Thank you for your support. I was always trying to fit a shape to the individual pieces. $\endgroup$
    – Alex
    Feb 7, 2014 at 21:41
  • $\begingroup$ Oops - circles have small eccentricity and rectangles large :-) $\endgroup$ Feb 7, 2014 at 22:00
2
$\begingroup$

One way to proceed is to binarize the image and find the constituent components:

img = Import["https://i.stack.imgur.com/EY2EG.png"]; 
objects = MorphologicalComponents[Binarize[img, 0.21]];
Colorize[objects]

enter image description here

Examine the various components (that are colored differently)

ComponentMeasurements[objects, "Area"]
{1 -> 133874., 2 -> 3085.75, 3 -> 3063.75, 4 -> 3226.75, 5 -> 505.5, 6 -> 503.5, 
 7 -> 3074.13, 8 -> 2.25, 9 -> 2.25, 10 -> 6., 11 -> 13., 12 -> 4.5, 13 -> 13.}

We can see that the rectangles are the three objects of nearly identical size: objects 2, 3, and 7. The bounding boxes of these rectangles are:

ComponentMeasurements[objects, "BoundingBox"][[{2, 3, 7}]]
{2 -> {{160., 338.}, {279., 449.}}, 3 -> {{355., 271.}, {410., 417.}}, 
 7 -> {{183., 194.}, {326., 259.}}}

To locate the circles, use the eccentricity:

ComponentMeasurements[objects, "Eccentricity"]
{1 -> 0.0694129, 2 -> 0.989404, 3 -> 0.989675, 4 -> 0.0816974, 5 -> 0.116954, 6 -> 0.33685, 
 7 -> 0.989536, 8 -> 0.866025, 9 -> 0.935414, 10 -> 0.924176, 11 -> 0., 12 -> 0., 13 -> 0.}

The largest (greenish) circular object #1 and the inner (greyish) circle is object #4. The center and radius of this inner circle is:

ComponentMeasurements[objects, {"BoundingDiskCenter", "BoundingDiskRadius"}][[4]]
4 -> {{285.875, 320.543}, 53.9322}
$\endgroup$
2
  • $\begingroup$ Oh... for some reason, I always thought that a bounding box was the tightest fitting rectangle, not necessarily upright. I've removed the comment :) $\endgroup$
    – rm -rf
    Feb 7, 2014 at 22:05
  • $\begingroup$ @rm -rf What you are describing is what I always wished they meant by a bounding box! $\endgroup$
    – bill s
    Feb 7, 2014 at 23:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.