[vtkusers] method to extract regions

Imre Goretzki goretzki.imre at gmail.com
Sat Jan 2 11:00:11 EST 2016


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


More information about the vtkusers mailing list