[vtkusers] method to extract regions

Imre Goretzki goretzki.imre at gmail.com
Sat Jan 2 14:32:49 EST 2016


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/12da0196/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: example.png
Type: image/png
Size: 17806 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160102/12da0196/attachment.png>


More information about the vtkusers mailing list