<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.E-MailFormatvorlage17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=DE link=blue vlink=purple>

<div class=WordSection1>

<p class=MsoNormal><span lang=EN-US>Hi,<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>i had a problem concerning the usage of
SpatialObjects (e.g. GroupSpatialObjects, ContourSpatialObjects,
SpatialObjectTreeContainer, PolygonGroupSpatialObjects,
PolygonSpatialObjects...) to mask a specific image for the registration.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>I think there are probably other people
doing similar stuff, and there could be interest in discussing a few
implementation decisions concerning SpatialObject child classes and the way the
MeanSquaresImageToImageMetric is processing them.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>I use PolygonGroupSpatialObjects and
PolygonSpatialObjects to create my own Volumes of Interest and Contours out of
a set of points.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>I use these two SpatialObject types,
because a)i import proprietary structure data, which is not pixel based (Thats
the reason why I don't use ImageMaskSpatialObject for instance).<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> b)the MeanSquaresImageToImageMetric is not
working with any other combination of SpatialObject I tried so far (at least
for the way i nest SpatialObjects).<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>I store the Contours in PolygonSpatialObjects
and store all contours of a VOI in PolygonGroupSpatialObjects.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>The Tree SpatialObject for all VOIs is also
a PolygonGroupSpatialObject.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>As mentioned they are actually the only
classes I can use, that&#8217;s why I wanted to discuss the implementation of a
few other SpatialObject classes.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>For better understanding, here a part of my
test program in pseudocode :<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>create StructureLoader<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>create RegistrationAlgorithm<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>RegistrationAlgorithm-&gt;SetFixedImg()<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>RegistrationAlgorithm-&gt;SetMovingImg()<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>RegistrationAlgorithm-&gt;SetTargetMask(StrucureLoader-&gt;getStructure())
// returns the generated tree node object<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>RegistrationAlgorithm-&gt;GetRegistration()
<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>The program delivers correct values(when
trying to determine which image regios are inside/outside the mask) only,<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>if I use the PolygonGroupSpatialObjects for
nodes(voi and voi groups) and the PolygonSpatialObjects for leaves(contours).<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>While trying to understand, why my
implementation was not working as planned with other SpacialObject classes
(e.g. GroupSpatialObjects, ContourSpatialObjects), I noticed several
implementation decisions,<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>which are responsible for the unexpected
behavior.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>I have a few questions concerning the
implementation of
A)MeanSquaresImageToImageMetric::GetValueAndDerivative(...)/GroupSpatialObject::IsInside(...)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> B)PolygonSpatialObject::IsInside(...)/PolygonGroupSpatialObject::IsInside(...)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>and hope that someone is able to explain
them to me.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> A)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> The
MeanSquaresImageToImageMetric::GetValueAndDerivative() calls the IsInside()
method without a parameter for the depth<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> Line 178: if( this-&gt;m_FixedImageMask
&amp;&amp; !this-&gt;m_FixedImageMask-&gt;IsInside( inputPoint ) )<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> which has the effect that for all SpatialObject
classes(at least as far as i know) the default depth=0 is used.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> --&gt; Was this implementation done with
respect to the usage of SpatialObjects?<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>  I would assume if someone who is using
SpatialObject would probably like to use the feature of creating tree like
structures by nesting objects,<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> but actually there are not many
SpatialObjects which really check for existing childern, and rather use a depth
= 0 as default?<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>  e.g. GroupSpatialObjects (i think this
class is a good example, because you would expect a different behavior)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> GroupSpatialObject has no own
implementation of IsInside()<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> So the IsInside() Method checks as follows<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> if( depth &gt; 0 )<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> {<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> do something<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> }<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> else <o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> return false<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> --&gt; reasonable you always get false,
when MeanSquaresImageToImageMetric::GetValueAndDerivative(...) checks the
points of the image!<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> Wouldn't it make more sense not to use the
default IsInside implementation, because assuming a default depth=0 for
GroupSpatialObjects seems to make no real sense.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> I can't really imagine, why someone should
use a GroupSpatialObject with a depth of zero (for instance there could be a
check of the childrenList if depth = 0 is passed).<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> This is actually one reason why I use
PolygonGroupSpatialObjects, because it was the only class I could find, which
assumes it has children.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> I didn't check other metrics so far, so i
don't know if they behave the same way.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> B)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> For testing purposes I wanted to use only
one contour of a VOI, for faster processing<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> pseudocode:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> RegistrationAlgorithm-&gt;setTargetMask(structureLoader.getContourSpatialObject()-&gt;GetFirstVOI()-&gt;GetFirstContour());<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> I noticed, that if you use a
PolygonSpecialObject without a PolygonGroupSpatialObjects, you get wrong return
values for IsInside(),<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> because there is no z-dimension check in
the PolygonSpecialObject::IsInside(...) method.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> So if s.o. directly calls the
PolygonSpecialObject::IsInside() method, he gets true for the points even if
they are in an other plane than the polygon.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> this behavour forces you to use a
PolygonGroupSpatialObject even if you would just have 1 PolygonSpecialObject
inside.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US> Can someone explain me, why
PolygonSpecialObject was implemented that way? I think it is quite cofusing for
someone, who works with theses classes the first time, because IsInside just
doesn't behave as you would expect.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US> compare itkPolygonSpatialObject.txx Line
403-485<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span lang=EN-US>If I take a look at how
MeanSquaresImageToImageMetric is using the IsInside() method, and the way
method is implemented in the different classes, I somehow miss the
&quot;thread&quot; in the way the parts are designed.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US>But perhaps I just don't get the concept, I
would appreciate it if someone could elucidate it for me ;). If someone thinks
the way I build my Structures is a unfavorable solution, hints and tips are
always welcome!<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal>Best regards<o:p></o:p></p>

<p class=MsoNormal>Andreas<o:p></o:p></p>

</div>

</body>

</html>