I was looking at LabelImageToShapeLabelMapFilter as a way to calculate the area and perimeter of labeled objects for computing compactness/circularity*. I am confused about the perimeter calculation though. It seems to be missing a factor of 2. My test was to create an image (1x1 spacing) containing a 50x50 square resulting in a size (area) of 2500 as expected and a perimeter of 100 instead of 200 (results identical with FullyConnected set to On/Off). <div>
<br></div><div>Can anyone closer to the perimeter calculator code comment on whether this is expected behavior?</div><div><br></div><div>* The roundness calculation is new to me. Can someone describe the value range? From the Insight Journal paper, it seems the range is 0 to something greater than 1 with 1 indicating a perfect circle. Is that correct?</div>
<div><br></div><div>Thanks!</div><div><br></div><div>// Relevant code</div><div><div><div><div>  typedef itk::ShapeLabelObject&lt;unsigned char, 2&gt; LabelObjectType;</div><div>  typedef itk::LabelMap&lt;LabelObjectType&gt; LabelMapType;</div>
<div>  typedef itk::LabelImageToShapeLabelMapFilter&lt;CharImageType, LabelMapType&gt; ShapeLabelFilterType;</div><div>  ShapeLabelFilterType::Pointer shapeFilter = ShapeLabelFilterType::New();</div><div>  shapeFilter-&gt;SetInput(tempImage);</div>
<div>  shapeFilter-&gt;SetBackgroundValue(0);</div><div>  shapeFilter-&gt;SetComputePerimeter(1);</div><div>  shapeFilter-&gt;Update();</div><div>  </div><div>  LabelMapType::Pointer labelMap = shapeFilter-&gt;GetOutput();</div>
<div>  for(unsigned int label = 1; label &lt;= labelMap-&gt;GetNumberOfLabelObjects(); label++)</div><div>    {</div><div>    const LabelObjectType * labelObject = labelMap-&gt;GetLabelObject(label);</div><div>    std::cerr &lt;&lt; &quot;    label: &quot; &lt;&lt; label &lt;&lt; std::endl;</div>
<div>    std::cerr &lt;&lt; &quot;    physical size: &quot; &lt;&lt; labelObject-&gt;GetPhysicalSize() &lt;&lt; &quot;   centroid: &quot; &lt;&lt; labelObject-&gt;GetCentroid() &lt;&lt; std::endl;</div><div>    std::cerr &lt;&lt; &quot;    perimeter: &quot; &lt;&lt; labelObject-&gt;GetPerimeter() &lt;&lt; &quot;   eq perimeter: &quot; &lt;&lt; labelObject-&gt;GetEquivalentPerimeter() &lt;&lt; std::endl;</div>
<div>    std::cerr &lt;&lt; &quot;    eq radius: &quot; &lt;&lt; labelObject-&gt;GetEquivalentRadius() &lt;&lt; std::endl;</div><div>    std::cerr &lt;&lt; &quot;    size: &quot; &lt;&lt; labelObject-&gt;GetSize() &lt;&lt; std::endl;</div>
<div>    std::cerr &lt;&lt; &quot;    roundness: &quot; &lt;&lt; labelObject-&gt;GetRoundness() &lt;&lt; std::endl;</div><div>    std::cerr &lt;&lt; &quot;    P^2/A: &quot; &lt;&lt; (labelObject-&gt;GetPerimeter() * labelObject-&gt;GetPerimeter()) / labelObject-&gt;GetSize() &lt;&lt; &quot; should be: &quot; &lt;&lt; (50*4)*(50*4)/(50*50) &lt;&lt; std::endl;</div>
<div>    std::cerr &lt;&lt; &quot;    P^2/4*PI*A: &quot; &lt;&lt; (labelObject-&gt;GetPerimeter() * labelObject-&gt;GetPerimeter()) / (4 * 3.14 * labelObject-&gt;GetSize()) &lt;&lt; &quot; should be: &quot; &lt;&lt; (50*4)*(50*4)/(4*3.14*50*50) &lt;&lt; std::endl;</div>
<div>    }</div></div></div><div><div><br></div><div>// Output</div><div><div>    label: 1</div><div>    physical size: 2500   centroid: [74.5, 74.5]</div><div>    perimeter: 100   eq perimeter: 177.245</div><div>    eq radius: 28.2095</div>
<div>    size: 2500</div><div>    roundness: 1.77245</div><div>    P^2/A: 4 should be: 16</div><div>    P^2/4*PI*A: 0.318471 should be: 1.27389</div></div><div><br></div><div><br></div></div></div>