[Insight-users] Problems with ImageMaskSpatialObject

Markus Mehrwald mehrwald at ira.uka.de
Wed Mar 7 09:54:59 EST 2007


Hi Julien,

The ExtractImageFilter only changes the requestet region but the origin 
is the same as it was in the input image.
I do not realy understand why I cannot set ObjectToWorldTransform 
directly but with ObjectToParentTransform it works like it was in my mind.
Thank you for your help.

Regards,
Markus

Julien Jomier schrieb:
> Markus,
>
>> I use the ExtractImageFilter but saving the resulting image will 
>> remove me all information about the position of this ROI. So thats 
>> the reasion why I tried to use the ImageMaskSpatialObject because it 
>> stores also an offset.
>
> You can always set the origin of the output image of the 
> ExtractImageFilter to be the origin of your requested region (at some 
> point I thought that's what the ExtractImageFilter was doing...)
>
>> I set an offset for the object to world transform, compute it and 
>> write out the resulting object and there the offsets (both, object to 
>> world and index to object) are still 0. That was what I ment with the 
>> cite you copied. Is this just a problem of the output or is it realy 
>> ignored?
>
> I see. You should set the ObjectToParentTransform (instead of the 
> ObjectToWorldTransform) and call the ComputeObjectToWorldTransform(). 
> Basically the ComputeObjectToWorldTransform() recompute the 
> ObjectToWorldTransform with the current information stored in the 
> SpatialObject (IndexToObject and ObjectToParent transforms).
>
> Let me know if you are still having some issues,
>
> Julien
>
>> Regards,
>> Markus
>>
>> Julien Jomier schrieb:
>>> Hi Markus,
>>>
>>> The index of the RequestedRegion cannot be used to set the initial 
>>> offset of the image because the requested region can change but 
>>> should not affect how the image is represented in the scene.
>>> Moreover, ImageSpatialObject does not support the concept of 
>>> streaming and regions. This should be handled at the Image level.
>>>
>>> That's in part why the ImageMaskSpatialObject is used, i.e. to 
>>> define a region of interest.
>>>
>>> You can use the ExtractImageFilter beforehand to extract your region 
>>> of interest or you can "paint" the appropriate region of your 
>>> ImageMaskSpatialObject.
>>>
>>> What do you mean by "the offset to compute ObjectToWorldTransform is
>>> completely ignored"? When requested if the value at a physical point 
>>> or if a point IsInside() the image, the full ObjectToWorldTransform 
>>> is used.
>>>
>>> Hope that helps,
>>>
>>> Julien
>>>
>>> Markus Mehrwald wrote:
>>>> In addition to that the offset to compute ObjectToWorldTransform is 
>>>> completely ignored. Maybe I am wrong with the origin and the offset 
>>>> but I thing ignoring the offset for world transform should not 
>>>> happen, should it?
>>>>
>>>> Markus Mehrwald schrieb:
>>>>> Hi,
>>>>>
>>>>> I just had a look at the code of the ImageSpatialObject. In the 
>>>>> method SetImage there is code to compute the offset of the spatial 
>>>>> object. In my mind it should be better to use the index of the 
>>>>> RequestedRegion instead of the origin because in my case this is 
>>>>> the image I want the spatial object from. In case of having the 
>>>>> whole image origin and the index of the RequestedRegion are the 
>>>>> same anyway.
>>>>>
>>>>> Regards,
>>>>> Markus Mehrwald
>>>>>
>>>>> Markus Mehrwald schrieb:
>>>>>> Hi Julien,
>>>>>>
>>>>>> I do not really need ValueAt() at the moment. I used this code 
>>>>>> just for debug reasons. As I wrote before I have created my 
>>>>>> binary image first and than want it as spatial object to save it 
>>>>>> because if I only save the image the translation information is 
>>>>>> gone. At the moment I need ValueAt() I do not have the 
>>>>>> translation information anymore (after a restart of the 
>>>>>> application and without calculating everything again).
>>>>>> I have tried some other things with transform and offsets but the 
>>>>>> only case in which I get the correct result (but without 
>>>>>> translation) is if the image passed to the ImageMaskSpatialObject 
>>>>>> has its origin at 0,0.
>>>>>>
>>>>>> Greetings,
>>>>>> Markus
>>>>>>
>>>>>> Julien Jomier schrieb:
>>>>>>> Hi Markus,
>>>>>>>
>>>>>>> Can you take into account the origin of your image when you 
>>>>>>> request the ValueAt()?
>>>>>>> If you are using the SpatialObjectToImageFilter to create your 
>>>>>>> binary image you can set the origin of the output image, if you 
>>>>>>> set it to the same origin as the input image then it should work.
>>>>>>>
>>>>>>> One other option is to reset the IndexToObjectTransform of your 
>>>>>>> ImageMaskSpatialObject with an offset of zero:
>>>>>>>
>>>>>>>   myImageSO->GetIndexToObjectTransform()->SetOffset( offset );
>>>>>>>   myImageSO->ComputeObjectToParentTransform();
>>>>>>>
>>>>>>> This will not modify the origin of the image passed using the 
>>>>>>> SetImage() function so you can use it later.
>>>>>>>
>>>>>>> Hope that helps,
>>>>>>>
>>>>>>> Julien
>>>>>>>
>>>>>>> Markus Mehrwald wrote:
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I found the problem. The image starts at 180, 130 and that is 
>>>>>>>> the problem. If I translate the image to 0, 0 the code from my 
>>>>>>>> last mail works correct. The problem now: I need the 
>>>>>>>> information of the translation for further calculations.
>>>>>>>> Any suggestions how to keep the translation? I tried
>>>>>>>>
>>>>>>>> ImageMaskSpatialObjectType::TransformType::OffsetType offset;
>>>>>>>> offset[0] = 
>>>>>>>> thresholder->GetOutput()->GetRequestedRegion().GetIndex()[0];
>>>>>>>> offset[1] = 
>>>>>>>> thresholder->GetOutput()->GetRequestedRegion().GetIndex()[1];
>>>>>>>> imageMaskSpatialObject->GetObjectToParentTransform()->SetOffset(offset); 
>>>>>>>>
>>>>>>>> imageMaskSpatialObject->ComputeObjectToParentTransform();
>>>>>>>>
>>>>>>>> but this leads to the same problem I had before. Also with 
>>>>>>>> WorldTransform.
>>>>>>>>
>>>>>>>> Greetings,
>>>>>>>> Markus
>>>>>>>>
>>>>>>>> Markus Mehrwald schrieb:
>>>>>>>>> Hi,
>>>>>>>>> I just implemented some code which uses a 
>>>>>>>>> ImageMaskSpatialObject. I created a binary image in my filter 
>>>>>>>>> chain and want this now to be a spatial object so I use the 
>>>>>>>>> SetImage method of the spatial object but nothing happens. The 
>>>>>>>>> output of the object looks good. Coordinates (, ...) are 
>>>>>>>>> correct but at every point of the so created object ValueAt 
>>>>>>>>> gives me 0. The code looks like the following:
>>>>>>>>>
>>>>>>>>> thresholder->Update();
>>>>>>>>> ImageMaskSpatialObjectType::PointType point;
>>>>>>>>> imageMaskSpatialObject = ImageMaskSpatialObjectType::New();
>>>>>>>>> imageMaskSpatialObject->SetImage(thresholder->GetOutput());
>>>>>>>>> imageMaskSpatialObject->SetRequestedRegion(thresholder->GetOutput()->GetRequestedRegion()); 
>>>>>>>>>
>>>>>>>>> imageMaskSpatialObject->Update();
>>>>>>>>> imageMaskSpatialObject->UpdateOutputInformation();
>>>>>>>>> imageMaskSpatialObject->ComputeObjectToWorldTransform();
>>>>>>>>> double ret;
>>>>>>>>> for (int i = 0; i < 640; i++)
>>>>>>>>> {
>>>>>>>>>    for (int j = 0; j < 512; j++)
>>>>>>>>>    {
>>>>>>>>>        point[0] = i;
>>>>>>>>>        point[1] = j;
>>>>>>>>>        imageMaskSpatialObject->ValueAt(point, ret);
>>>>>>>>>        if (ret != 0)
>>>>>>>>>            std::cout << "ret: " << ret << std::endl;
>>>>>>>>>    }
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> The image coming from the thresholder has indeed a size of 
>>>>>>>>> 300x280 but changing the for-loops has no consequence on the 
>>>>>>>>> outcome.
>>>>>>>>> I took a look at the image coming from the thresholder and it 
>>>>>>>>> is what it should be, a binary image with white areas too. The 
>>>>>>>>> code above never writes anything to the standard output 
>>>>>>>>> because it does not find any values differing to 0.
>>>>>>>>> Did I anything wrong or is it a problem of the 
>>>>>>>>> ImageMaskSpatialObject?
>>>>>>>>>
>>>>>>>>> Thanks in advance,
>>>>>>>>> Markus
>>>>>>>>> _______________________________________________
>>>>>>>>> Insight-users mailing list
>>>>>>>>> Insight-users at itk.org
>>>>>>>>> http://www.itk.org/mailman/listinfo/insight-users
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
>


-- 
---------------------------------------------------------
Cand. Dipl.-Inf. Med. Markus Mehrwald
Institut für Prozessrechentechnik, Automation und Robotik

Universität Karlsruhe (TH)
Gebäude 40.28
Engler-Bunte-Ring 8
76131 Karlsruhe

E-Mail: mehrwald at ira.uka.de
---------------------------------------------------------



More information about the Insight-users mailing list