[vtkusers] method to extract regions

Imre Goretzki goretzki.imre at gmail.com
Sat Jan 2 15:06:08 EST 2016


Great! This is correct.

Yes they can be partially outside the mask because I neither know the 
sizes and locations of the regions I want to keep nor the sizes and 
locations of the regions I want to discard for both input image and mask 
image (the mask changes dynamically)

Ok so in later progress I could use the mask as the second input (the 
stencil) and this removes the regions?



My current code lets me get the regions I want to discard by storing the 
polydata output of vtkPolyDataConnectivityFilter and then iterate over 
the cells and their points

for (int i = 0; i < filter->GetNumberOfExtractedRegions(); i++)
{
     vtkSmartPointer<vtkPolyData> extractRegionData = 
vtkSmartPointer<vtkPolyData>::New(); //fast
     extractFilter->InitializeSpecifiedRegionList(); //fast
     extractFilter->AddSpecifiedRegion(i); //fast
     extractFilter->Modified(); //fast
     extractFilter->Update(); //very long
     extractRegionData->DeepCopy(extractFilter->GetOutput()); //fast
     regionList.push_back(extractRegionData); //fast
}
for (int i = 0; i < filter->GetNumberOfExtractedRegions(); i++)
{
     // some other operations
}

The update() process takes a very long time. As an example, if I have 
about 200 regions, this would take about 10 minutes. All other following 
operations on the data and/or a vtkPolyDataConnectivityFilter do not 
take so long.

- Imre

Am 02.01.2016 um 20:48 schrieb David Gobbi:
> Thanks, that helps.  Here is my understanding so far:
>
> 1) The mask is, originally, a polydata contour.
> 2) The mask indicates the regions you do not want.
> 3) The mask will be converted into a binary image before use.
>
> What I still need to know is:
>
> 3) Will some regions be partially within and partially outside the 
> mask?  Or will they always be entirely within or entirely outside?
>
> The vtkImageConnectivityFilter takes two inputs: the first input is 
> just an image (of course) and the second input (which is optional) is 
> an image stencil (essentially a binary image).  There is a filter 
> called vtkPolyDataToImageStencil which can be used create this second 
> input from a vtkPolyData object.
>
>  - David
>
>
> On Sat, Jan 2, 2016 at 12:32 PM, Imre Goretzki 
> <goretzki.imre at gmail.com <mailto:goretzki.imre at gmail.com>> wrote:
>
>     I've drawn another image you could look at. The left image is the
>     input data from which I would like to extract the regions. Here
>     every region I would like to keep is painted green. The other two
>     regions, that are painted red, have points that are located inside
>     a region in the binary mask.
>
>
>     For all points /P/ in all regions /R/ of image 1 with binary mask /B/
>
>     If B_P == 255
>         color region /R/ red
>     else
>         color region /R/ green
>
>     - Imre
>
>
>     Am 02.01.2016 um 20:16 schrieb David Gobbi:
>>     Sorry, but I still don't follow your explanation.  I have some
>>     vague idea of what you are trying to do, but I don't understand
>>     well enough to give you any concrete advice.  Can you try
>>     focussing on just one specific aspect of the problem, and then
>>     once I've understood that one aspect, we can move forward from
>>     there?
>>
>>      - David
>>
>>     On Sat, Jan 2, 2016 at 11:46 AM, Imre Goretzki
>>     <goretzki.imre at gmail.com <mailto:goretzki.imre at gmail.com>> wrote:
>>
>>         Mh ok, I guess I did not explained my problem well enough.
>>
>>         The vtkPolyDataConnectivityFilter returns regions, either the
>>         largest, specified, seeded or all regions (your filter
>>         returns largest, seeded or all). I'm interessted in the
>>         following:
>>
>>         - all regions
>>         - specified regions.
>>
>>         The problem is not the filter, the performance or possible
>>         memory leaks, I need the region's polydata representation
>>         because I have a second object (vtkImageData or vtkPolyData,
>>         binary mask) that has some additional information, that are
>>         not represented by the data (the input for the
>>         vtkImageConnectivityFilter).
>>
>>         Imagine the input for the filter as image 1 and the mask as
>>         image 2. Both images have the same dimensions in all 3
>>         directions (x, y, z) but contain different information.
>>
>>         image 2 will be transformed to a binary image mask
>>
>>         from image 1 i need to extract regions, but if some (unknown)
>>         regions have points that are located in the binary image
>>         mask, I do not want these regions to be contained in the
>>         extracted region list.
>>
>>         So it's not about your filter or the performance, but I have
>>         some problems using this filter for my issue, because I
>>         cannot reach the region's polydata.
>>
>>         I hope this helps.
>>
>>         - Imre
>>
>>
>>         Am 02.01.2016 um 18:54 schrieb David Gobbi:
>>>         Hi Imre, Happy New Year!
>>>
>>>         I've read your email few times, and I feel that I must be
>>>         missing some important because there are several things that
>>>         I don't understand about it.
>>>
>>>         The vtkImageConnectivityFilter is essentially just a
>>>         connected component filter.  In the output of this filter,
>>>         all pixels outside the mask will be colored black (they will
>>>         have a value of zero). So what I don't understand about your
>>>         email is why you say that non-rectangular regions are a
>>>         problem.  Are you just worried about the wasted memory?
>>>
>>>          - David
>>>
>>>
>>>         On Sat, Jan 2, 2016 at 9:00 AM, Imre Goretzki
>>>         <goretzki.imre at gmail.com <mailto:goretzki.imre at gmail.com>>
>>>         wrote:
>>>
>>>             Hey David,
>>>
>>>             first of all: Happy new year :)
>>>
>>>             I have some questions about your filter. First of all in
>>>             part A of the attached image, is my understanding of
>>>             extents, so if you have a region, you will get the
>>>             x_min/x_max, y_min/y_max (and z_min/z_max for 3D). If
>>>             you do not have rectangular regions than you could have
>>>             some problems (see part A and B). In part B you see my
>>>             mask. The red rectangle shows the case that the 4
>>>             corners of a 2D region cannot be directly checked,
>>>             because the region that lies within this rectangle has
>>>             little matches with the mask (none of the 4 corners are
>>>             within the mask). The green rectangle has 3 out of 4
>>>             edges that lie within the mask.
>>>
>>>             Part C shows one of the worst cases of this approach
>>>             (using extents) because there is so much space that does
>>>             not belong to the actual region.
>>>
>>>             My question: Is it possible to extend your filter to
>>>             directly store the region data (for each region, for
>>>             example as vtkImageData) if the extraction mode is set
>>>             to "All"?
>>>
>>>             - Imre
>>>
>>>
>>>             Am 29.12.2015 um 13:27 schrieb Imre Goretzki:
>>>>             Hi David,
>>>>
>>>>             thank you. I'll take a look at your class.
>>>>
>>>>             Regards
>>>>             Imre
>>>>
>>>>             Am 29.12.2015 um 13:07 schrieb David Gobbi:
>>>>>             Hi Imre,
>>>>>
>>>>>             I have a connectivity filter that works directly on
>>>>>             images, it can label connected regions according to
>>>>>             size and it should be much faster (probably 1000x)
>>>>>             than doing voxel checks via polydata:
>>>>>             https://github.com/dgobbi/AIRS/blob/master/ImageSegmentation/vtkImageConnectivityFilter.h
>>>>>             I'll probably be contributing this filter to VTK
>>>>>             sometime in the near future.
>>>>>
>>>>>              - David
>>>>>
>>>>>
>>>>>             On Tue, Dec 29, 2015 at 4:02 AM, Imre Goretzki
>>>>>             <goretzki.imre at gmail.com
>>>>>             <mailto:goretzki.imre at gmail.com>> wrote:
>>>>>
>>>>>                 Is there an easier way in ITK?
>>>>>
>>>>>                 Thanks
>>>>>                 Imre
>>>>>
>>>>>
>>>>>                 Am 28.12.2015 um 23:38 schrieb Imre Goretzki:
>>>>>>                 Hey guys,
>>>>>>
>>>>>>                 I use the vtkPolyDataConnectivityFilter from
>>>>>>                 polydata to extract several different and more or
>>>>>>                 less unknown regions.
>>>>>>                 My problem is that I want to extract regions from
>>>>>>                 this filter, but if I do this, the update process
>>>>>>                 for all regions takes up to 10minutes:
>>>>>>
>>>>>>                 filter->SetExtractionModeToAllRegions();
>>>>>>                 filter->Update();
>>>>>>                 ...
>>>>>>
>>>>>>                 for (int i = 0; i <
>>>>>>                 filter->GetNumberOfExtractedRegions(); i++)
>>>>>>                 {
>>>>>>                 extractFilter->InitializeSpecifiedRegionList();
>>>>>>                 extractFilter->AddSpecifiedRegion(i);
>>>>>>                 extractFilter->Modified();
>>>>>>                 extractFilter->Update();
>>>>>>                 extractRegionData->DeepCopy(extractFilter->GetOutput());
>>>>>>                 }
>>>>>>                 extractFilter->InitializeSpecifiedRegionList();
>>>>>>
>>>>>>                 Background for this: I want to use the points of
>>>>>>                 each region to check whether they lie within an
>>>>>>                 object in my binary
>>>>>>                 mask image. So the pipeline would be like this:
>>>>>>
>>>>>>                 1) Get all Regions
>>>>>>                     2) get region /i/
>>>>>>                          3) get points of region /i/
>>>>>>                 4) check if point /j/ lies within the binary mask
>>>>>>                 /B/ (/B/_/j/ == 255)
>>>>>>                 4a) if true then add region to the extractFilter
>>>>>>                 and break (-> next region /i/)
>>>>>>                 4b) if false then continue with next point /j/
>>>>>>                 5) Mark all regions red (done easily)
>>>>>>                 6) Mark some regions green that are above a
>>>>>>                 specific size (can be accessed with
>>>>>>                 filter->GetRegionSizes() )
>>>>>>                 7) Mark some regions yellow (the regions that are
>>>>>>                 extracted during step 1-4a)
>>>>>>
>>>>>>                 I do not know if the PolyDataConnectivityFilter
>>>>>>                 is the right class for this, I think it is.
>>>>>>                 If I store the extractRegionData in a vector, all
>>>>>>                 regions have the same number of points (which is
>>>>>>                 kind of strange) but different number of cells
>>>>>>                 (region size == number of cells is correct).
>>>>>>
>>>>>>                 I would now try to get the points from the cells
>>>>>>                 and check the binary mask, because the
>>>>>>
>>>>>>                 vtkPolyData->GetNumberOfPoints()
>>>>>>
>>>>>>                 and
>>>>>>
>>>>>>                 vtkPolyData->GetPoint(pointCounter, point);
>>>>>>
>>>>>>                 are not working correctly in this scenario (all
>>>>>>                 regions are extracted because every single region
>>>>>>                 has every point?
>>>>>>                 i did not verify my guess but I think there would
>>>>>>                 be the problem)
>>>>>>
>>>>>>                 The binary mask is a vtkImageData, that could be
>>>>>>                 transformed to vtkPolyData.
>>>>>>                 The input image (already filtered with
>>>>>>                 vtkMarchingCubes) and the binary mask have the
>>>>>>                 same dimensions (x,y,z).
>>>>>>
>>>>>>                 I hope you can imagine what I'm trying to do and
>>>>>>                 have some tips for me, if my approach is correct.
>>>>>>
>>>>>>                 Regards
>>>>>>                 Imre
>>>>>
>>>
>>
>>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160102/4ee2c80a/attachment-0001.html>


More information about the vtkusers mailing list