<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Jan 2, 2016 at 1:06 PM, Imre Goretzki <span dir="ltr"><<a href="mailto:goretzki.imre@gmail.com" target="_blank">goretzki.imre@gmail.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000">
    <br>
    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)<br>
    <br>
    Ok so in later progress I could use the mask as the second input
    (the stencil) and this removes the regions?<br></div></blockquote><div><br></div><div>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).</div><div><br></div><div>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?</div><div><br></div><div>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?</div><div><br></div><div>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.</div><div><br></div><div> - David</div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000">
    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<span><br>
    <br>
    for (int i = 0; i < filter->GetNumberOfExtractedRegions();
    i++)<br>
    {<br></span>
        vtkSmartPointer<vtkPolyData> extractRegionData =
    vtkSmartPointer<vtkPolyData>::New(); //fast<br>
        extractFilter->InitializeSpecifiedRegionList(); //fast<br>
        extractFilter->AddSpecifiedRegion(i); //fast<br>
        extractFilter->Modified(); //fast<br>
        extractFilter->Update(); //very long<br>
        extractRegionData->DeepCopy(extractFilter->GetOutput());
    //fast<br>
        regionList.push_back(extractRegionData); //fast<span><br>
    }<br>
    for (int i = 0; i < filter->GetNumberOfExtractedRegions();
    i++)<br>
    {<br></span>
        // some other operations<br>
    }<br>
    <br>
    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.<span><font color="#888888"><br>
    <br>
    - Imre</font></span><div><div><br>
    <br>
    <div>Am 02.01.2016 um 20:48 schrieb David
      Gobbi:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">Thanks, that helps.  Here is my understanding so
        far:
        <div><br>
        </div>
        <div>1) The mask is, originally, a polydata contour.</div>
        <div>2) The mask indicates the regions you do not want.</div>
        <div>3) The mask will be converted into a binary image before
          use.</div>
        <div><br>
        </div>
        <div>What I still need to know is:</div>
        <div><br>
        </div>
        <div>3) Will some regions be partially within and partially
          outside the mask?  Or will they always be entirely within or
          entirely outside?</div>
        <div><br>
        </div>
        <div>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.</div>
        <div><br>
        </div>
        <div> - David</div>
        <div><br>
        </div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Sat, Jan 2, 2016 at 12:32 PM, Imre
          Goretzki <span dir="ltr"><<a href="mailto:goretzki.imre@gmail.com" target="_blank">goretzki.imre@gmail.com</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div bgcolor="#FFFFFF" text="#000000"> 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.<br>
              <br>
              <br>
              For all points <i>P</i> in all regions <i>R</i> of image
              1 with binary mask <i>B</i><br>
              <br>
              If B_P == 255<br>
                  color region <i>R</i> red<br>
              else<br>
                  color region <i>R</i> green<span><font color="#888888"><br>
                  <br>
                  - Imre</font></span>
              <div>
                <div><br>
                  <br>
                  <div>Am 02.01.2016 um 20:16 schrieb David Gobbi:<br>
                  </div>
                  <blockquote type="cite">
                    <div dir="ltr">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?
                      <div><br>
                      </div>
                      <div> - David</div>
                    </div>
                    <div class="gmail_extra"><br>
                      <div class="gmail_quote">On Sat, Jan 2, 2016 at
                        11:46 AM, Imre Goretzki <span dir="ltr"><<a href="mailto:goretzki.imre@gmail.com" target="_blank"></a><a href="mailto:goretzki.imre@gmail.com" target="_blank">goretzki.imre@gmail.com</a>></span>
                        wrote:<br>
                        <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                          <div bgcolor="#FFFFFF" text="#000000"> Mh ok,
                            I guess I did not explained my problem well
                            enough.<br>
                            <br>
                            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:<br>
                            <br>
                            - all regions<br>
                            - specified regions.<br>
                            <br>
                            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).<br>
                            <br>
                            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.<br>
                            <br>
                            image 2 will be transformed to a binary
                            image mask<br>
                            <br>
                            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.<br>
                            <br>
                            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.<br>
                            <br>
                            I hope this helps.<span><font color="#888888"><br>
                                <br>
                                - Imre</font></span>
                            <div>
                              <div><br>
                                <br>
                                <div>Am 02.01.2016 um 18:54 schrieb
                                  David Gobbi:<br>
                                </div>
                                <blockquote type="cite">
                                  <div dir="ltr">Hi Imre, Happy New
                                    Year!
                                    <div><br>
                                    </div>
                                    <div>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.</div>
                                    <div><br>
                                    </div>
                                    <div>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?</div>
                                    <div><br>
                                    </div>
                                    <div> - David</div>
                                    <div><br>
                                      <div class="gmail_extra"><br>
                                        <div class="gmail_quote">On Sat,
                                          Jan 2, 2016 at 9:00 AM, Imre
                                          Goretzki <span dir="ltr"><<a href="mailto:goretzki.imre@gmail.com" target="_blank"></a><a href="mailto:goretzki.imre@gmail.com" target="_blank">goretzki.imre@gmail.com</a>></span>
                                          wrote:<br>
                                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                                            <div bgcolor="#FFFFFF" text="#000000"> Hey David,<br>
                                              <br>
                                              first of all: Happy new
                                              year :)<br>
                                              <br>
                                              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.<br>
                                              <br>
                                              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.<br>
                                              <br>
                                              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"?<span><font color="#888888"><br>
                                                  <br>
                                                  - Imre</font></span>
                                              <div>
                                                <div><br>
                                                  <br>
                                                  <div>Am 29.12.2015 um
                                                    13:27 schrieb Imre
                                                    Goretzki:<br>
                                                  </div>
                                                  <blockquote type="cite"> Hi
                                                    David,<br>
                                                    <br>
                                                    thank you. I'll take
                                                    a look at your
                                                    class.<br>
                                                    <br>
                                                    Regards<br>
                                                    Imre<br>
                                                    <br>
                                                    <div>Am 29.12.2015
                                                      um 13:07 schrieb
                                                      David Gobbi:<br>
                                                    </div>
                                                    <blockquote type="cite">
                                                      <div dir="ltr">Hi
                                                        Imre,
                                                        <div><br>
                                                        </div>
                                                        <div>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:</div>
                                                        <div><a href="https://github.com/dgobbi/AIRS/blob/master/ImageSegmentation/vtkImageConnectivityFilter.h" target="_blank"></a><a href="https://github.com/dgobbi/AIRS/blob/master/ImageSegmentation/vtkImageConnectivityFilter.h" target="_blank">https://github.com/dgobbi/AIRS/blob/master/ImageSegmentation/vtkImageConnectivityFilter.h</a></div>
                                                        <div>I'll
                                                          probably be
                                                          contributing
                                                          this filter to
                                                          VTK sometime
                                                          in the near
                                                          future.</div>
                                                        <div><br>
                                                        </div>
                                                        <div> - David</div>
                                                        <div><br>
                                                          <div class="gmail_extra"><br>
                                                          <div class="gmail_quote">On

                                                          Tue, Dec 29,
                                                          2015 at 4:02
                                                          AM, Imre
                                                          Goretzki <span dir="ltr"><<a href="mailto:goretzki.imre@gmail.com" target="_blank"></a><a href="mailto:goretzki.imre@gmail.com" target="_blank">goretzki.imre@gmail.com</a>></span>
                                                          wrote:<br>
                                                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                                                          <div bgcolor="#FFFFFF" text="#000000">
                                                          Is there an
                                                          easier way in
                                                          ITK?<br>
                                                          <br>
                                                          Thanks<span><font color="#888888"><br>
                                                          Imre</font></span>
                                                          <div>
                                                          <div><br>
                                                          <br>
                                                          <div>Am
                                                          28.12.2015 um
                                                          23:38 schrieb
                                                          Imre Goretzki:<br>
                                                          </div>
                                                          <blockquote type="cite">
                                                          Hey guys,<br>
                                                          <br>
                                                          I use the
                                                          vtkPolyDataConnectivityFilter
                                                          from polydata
                                                          to extract
                                                          several
                                                          different and
                                                          more or less
                                                          unknown
                                                          regions. <br>
                                                          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:<br>
                                                          <br>
filter->SetExtractionModeToAllRegions();<br>
filter->Update();<br>
                                                          ...<br>
                                                          <br>
                                                          for (int i =
                                                          0; i <
                                                          filter->GetNumberOfExtractedRegions();
                                                          i++)<br>
                                                          {<br>
                                                             
                                                          extractFilter->InitializeSpecifiedRegionList();<br>
                                                             
                                                          extractFilter->AddSpecifiedRegion(i);<br>
                                                             
                                                          extractFilter->Modified();<br>
                                                             
                                                          extractFilter->Update();<br>
                                                             
                                                          extractRegionData->DeepCopy(extractFilter->GetOutput());<br>
                                                          }<br>
extractFilter->InitializeSpecifiedRegionList();<br>
                                                          <br>
                                                          Background for
                                                          this: I want
                                                          to use the
                                                          points of each
                                                          region to
                                                          check whether
                                                          they lie
                                                          within an
                                                          object in my
                                                          binary<br>
                                                          mask image. So
                                                          the pipeline
                                                          would be like
                                                          this:<br>
                                                          <br>
                                                          1) Get all
                                                          Regions <br>
                                                              2) get
                                                          region <i>i</i><br>
                                                                   3)
                                                          get points of
                                                          region <i>i</i><br>
                                                                      
                                                          4) check if
                                                          point <i>j</i>
                                                          lies within
                                                          the binary
                                                          mask <i>B</i>    


                                                          (<i>B</i>_<i>j</i>
                                                          == 255)<br>
                                                                          

                                                          4a) if true
                                                          then add
                                                          region to the
                                                          extractFilter
                                                          and break
                                                          (-> next
                                                          region <i>i</i>)<br>
                                                                          

                                                          4b) if false
                                                          then continue
                                                          with next
                                                          point <i>j</i><br>
                                                          5) Mark all
                                                          regions red
                                                          (done easily)<br>
                                                          6) Mark some
                                                          regions green
                                                          that are above
                                                          a specific
                                                          size (can be
                                                          accessed with
                                                          filter->GetRegionSizes()


                                                          )<br>
                                                          7) Mark some
                                                          regions yellow
                                                          (the regions
                                                          that are
                                                          extracted
                                                          during step
                                                          1-4a) <br>
                                                          <br>
                                                          I do not know
                                                          if the
                                                          PolyDataConnectivityFilter
                                                          is the right
                                                          class for
                                                          this, I think
                                                          it is. <br>
                                                          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).<br>
                                                          <br>
                                                          I would now
                                                          try to get the
                                                          points from
                                                          the cells and
                                                          check the
                                                          binary mask,
                                                          because the <br>
                                                          <br>
vtkPolyData->GetNumberOfPoints()<br>
                                                          <br>
                                                          and<br>
                                                          <br>
                                                          vtkPolyData->GetPoint(pointCounter,


                                                          point); <br>
                                                          <br>
                                                          are not
                                                          working
                                                          correctly in
                                                          this scenario
                                                          (all regions
                                                          are extracted
                                                          because every
                                                          single region
                                                          has every
                                                          point?<br>
                                                          i did not
                                                          verify my
                                                          guess but I
                                                          think there
                                                          would be the
                                                          problem)<br>
                                                          <br>
                                                          The binary
                                                          mask is a
                                                          vtkImageData,
                                                          that could be
                                                          transformed to
                                                          vtkPolyData.<br>
                                                          The input
                                                          image (already
                                                          filtered with
                                                          vtkMarchingCubes)

                                                          and the binary
                                                          mask have the
                                                          same
                                                          dimensions
                                                          (x,y,z).<br>
                                                          <br>
                                                          I hope you can
                                                          imagine what
                                                          I'm trying to
                                                          do and have
                                                          some tips for
                                                          me, if my
                                                          approach is
                                                          correct.<br>
                                                          <br>
                                                          Regards<br>
                                                          Imre</blockquote>
                                                          </div>
                                                          </div>
                                                          </div>
                                                          </blockquote>
                                                          </div>
                                                          </div>
                                                        </div>
                                                      </div>
                                                    </blockquote>
                                                  </blockquote>
                                                </div>
                                              </div>
                                            </div>
                                          </blockquote>
                                        </div>
                                        <br>
                                      </div>
                                    </div>
                                  </div>
                                </blockquote>
                                <br>
                              </div>
                            </div>
                          </div>
                        </blockquote>
                      </div>
                      <br>
                    </div>
                  </blockquote>
                  <br>
                </div>
              </div>
            </div>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <br>
  </div></div></div>

</blockquote></div><br></div></div>