[vtkusers] method to extract regions
Imre Goretzki
goretzki.imre at gmail.com
Sun Jan 3 06:28:54 EST 2016
Hi David,
is it possible to connect the vtkImageConnectivityFilter to other
filters of VTK that do not have vtkImageData as output?
I have a pipleline that creates vtkPolyData as output, so I cannot use
your filter directly. Using this example:
http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/PolyDataToImageData
creates one single region. I printed the number of regions and the size by
s = c->GetExtractedRegionSizes();
for (int i = 0; i < c->GetNumberOfExtractedRegions(); i++)
{
cout << "num: " << c->GetNumberOfExtractedRegions() << endl; //1
cout << "size: " << s->GetTuple1(i); //1.27008e+07
}
- Imre
Am 02.01.2016 um 21:45 schrieb David Gobbi:
> On Sat, Jan 2, 2016 at 1:06 PM, Imre Goretzki <goretzki.imre at gmail.com
> <mailto:goretzki.imre at gmail.com>> wrote:
>
>
> 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?
>
>
> The vtkImageConnectivityFilter ignores any pixels that are outside the
> stencil (so that might be the reverse of what you want, since you want
> to ignore the regions that are inside your mask).
>
> If a region is partly outside the stencil, then only the part that is
> outside will be ignored. The rest would be counted. As far as I
> understand, that is not what you want. You would want the entire
> region to be ignored, right?
>
> Is there any reason that you even need a "mask"? Would it be just as
> good if you could specify the unwanted regions by giving just one
> point in each unwanted region, i.e. the user would use the mouse to
> click on the unwanted regions?
>
> Actually, instead of using an input mask, it seems that it would be
> best to allow vtkImageConnectivityFilter to assign a different label
> value to each region. Then, once you know which labels correspond to
> which regions, you could pass this label image through a lookup table
> that colors all of the unwanted regions black.
>
> - David
>
>
> 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/20160103/55510f63/attachment-0001.html>
More information about the vtkusers
mailing list