def test_watershed09(self):
        """Test on an image of reasonable size
        
        This is here both for timing (does it take forever?) and to
        ensure that the memory constraints are reasonable
        """
        image = numpy.zeros((1000, 1000))
        coords = numpy.random.uniform(0, 1000, (100, 2)).astype(int)
        markers = numpy.zeros((1000, 1000), int)
        idx = 1
        for x, y in coords:
            image[x, y] = 1
            markers[x, y] = idx
            idx += 1

        image = scipy.ndimage.gaussian_filter(image, 4)
        before = time.clock()
        out = fast_watershed(image, markers, self.eight)
        elapsed = time.clock() - before
        print(
            ("Fast watershed ran a megapixel image in %f seconds" % (elapsed)))
        before = time.clock()
        out = scipy.ndimage.watershed_ift(image.astype(numpy.uint16), markers,
                                          self.eight)
        elapsed = time.clock() - before
        print(("Scipy watershed ran a megapixel image in %f seconds" %
               (elapsed)))
Example #2
0
    def OnLabelWatershed(self, event):
        import numpy as np
        from PYME.contrib.cpmath import watershed
        from PYME.IO.image import ImageStack
        from PYME.DSView import ViewIm3D

        nChans = self.image.data.shape[3]

        filt_ims = [
            np.atleast_3d(self.image.data[:, :, :, chanNum].squeeze())
            for chanNum in range(nChans)
        ]

        img = (-sum([im / im.max()
                     for im in filt_ims]) * (2**15) / nChans).astype('int16')

        mask = (sum([
            filt_ims[chanNum] > self.do.thresholds[chanNum]
            for chanNum in range(nChans)
        ]) > .5).astype('int16')

        #self.image.labelThresholds = [(self.dsviewer.do.Offs[chanNum] + 0.5/self.dsviewer.do.Gains[chanNum]) for chanNum in range(self.image.data.shape[3])]

        #print sum(filt_ims).shape

        labs = watershed.fast_watershed(img,
                                        self.image.labels.astype('int16'),
                                        mask=mask)

        #store a copy in the image for measurements etc ...
        self.image.labels = labs

        im = ImageStack(labs, titleStub='Labelled Image')
        im.mdh.copyEntriesFrom(self.image.mdh)
        im.mdh['Parent'] = self.image.filename

        im.mdh['Labelling.WatershedThresholds'] = self.do.thresholds

        #im.mdh['Labelling.MinSize'] = rSize
        #im.mdh['Labelling.Thresholds'] = self.image.labelThresholds
        #im.mdh['Processing.CropROI'] = roi

        if self.dsviewer.mode == 'visGUI':
            mode = 'visGUI'
        else:
            mode = 'lite'

        dv = ViewIm3D(im,
                      mode=mode,
                      glCanvas=self.dsviewer.glCanvas,
                      parent=wx.GetTopLevelParent(self.dsviewer))

        #set scaling to (0,1)
        for i in range(im.data.shape[3]):
            dv.do.Gains[i] = 1.0
 def test_watershed06(self):
     "watershed 6"
     data = numpy.array([[0, 1, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 1, 0],
                         [0, 1, 0, 0, 0, 1, 0], [0, 1, 1, 1, 1, 1, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0]], numpy.uint8)
     markers = numpy.array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0],
                            [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                            [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                            [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                            [-1, 0, 0, 0, 0, 0, 0]], numpy.int8)
     out = fast_watershed(data, markers, self.eight)
     error = diff(
         [[-1, 1, 1, 1, 1, 1, -1], [-1, 1, 1, 1, 1, 1, -1],
          [-1, 1, 1, 1, 1, 1, -1], [-1, 1, 1, 1, 1, 1, -1],
          [-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, -1, -1],
          [-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, -1, -1],
          [-1, -1, -1, -1, -1, -1, -1]], out)
     self.failUnless(error < eps)
 def test_watershed03(self):
     "watershed 3"
     data = numpy.array([[0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 0],
                         [0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0],
                         [0, 1, 0, 1, 0, 1, 0], [0, 1, 1, 1, 1, 1, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                         [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]],
                        numpy.uint8)
     markers = numpy.array([[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                            [0, 0, 0, 0, 0, 0, 0], [0, 0, 2, 0, 3, 0, 0],
                            [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                            [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0],
                            [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, -1]],
                           numpy.int8)
     out = fast_watershed(data, markers)
     error = diff(
         [[-1, -1, -1, -1, -1, -1, -1], [-1, 0, 2, 0, 3, 0, -1],
          [-1, 2, 2, 0, 3, 3, -1], [-1, 2, 2, 0, 3, 3, -1],
          [-1, 2, 2, 0, 3, 3, -1], [-1, 0, 2, 0, 3, 0, -1],
          [-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, -1, -1],
          [-1, -1, -1, -1, -1, -1, -1], [-1, -1, -1, -1, -1, -1, -1]], out)
     self.failUnless(error < eps)
 def test_watershed08(self):
     "The border pixels + an edge are all the same value"
     data = numpy.array([[
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255
     ],
                         [
                             255, 255, 255, 255, 255, 255, 255, 255, 255,
                             255, 255, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 204, 204, 204, 204,
                             204, 204, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 204, 204, 183, 153, 153, 153,
                             153, 183, 204, 204, 255, 255, 255
                         ],
                         [
                             255, 255, 204, 183, 153, 141, 111, 103, 103,
                             111, 141, 153, 183, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 153, 111, 94, 72, 52, 52, 72,
                             94, 111, 153, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 153, 111, 72, 39, 1, 1, 39, 72,
                             111, 153, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 183, 141, 111, 72, 39, 39, 72,
                             111, 141, 183, 204, 255, 255
                         ],
                         [
                             255, 255, 255, 204, 183, 141, 111, 72, 72, 111,
                             141, 183, 204, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 204, 183, 141, 94, 94, 141,
                             183, 204, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 204, 153, 141, 141,
                             153, 204, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 204, 183, 141, 94, 94, 141,
                             183, 204, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 204, 183, 141, 111, 72, 72, 111,
                             141, 183, 204, 255, 255, 255
                         ],
                         [
                             255, 255, 204, 183, 141, 111, 72, 39, 39, 72,
                             111, 141, 183, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 153, 111, 72, 39, 1, 1, 39, 72,
                             111, 153, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 153, 111, 94, 72, 52, 52, 72,
                             94, 111, 153, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 183, 153, 141, 111, 103, 103,
                             111, 141, 153, 183, 204, 255, 255
                         ],
                         [
                             255, 255, 255, 204, 204, 183, 153, 153, 153,
                             153, 183, 204, 204, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 204, 204, 204, 204,
                             204, 204, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 255, 255, 255, 255,
                             255, 255, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 255, 255, 255, 255,
                             255, 255, 255, 255, 255, 255, 255
                         ]])
     mask = (data != 255)
     markers = numpy.zeros(data.shape, int)
     markers[6, 7] = 1
     markers[14, 7] = 2
     out = fast_watershed(data, markers, self.eight, mask=mask)
     #
     # The two objects should be the same size, except possibly for the
     # border region
     #
     size1 = numpy.sum(out == 1)
     size2 = numpy.sum(out == 2)
     self.assertTrue(abs(size1 - size2) <= 6)
 def test_watershed07(self):
     "A regression test of a competitive case that failed"
     data = numpy.array([[
         255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
         255, 255, 255
     ],
                         [
                             255, 255, 255, 255, 255, 255, 255, 255, 255,
                             255, 255, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 204, 204, 204, 204,
                             204, 204, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 204, 204, 183, 153, 153, 153,
                             153, 183, 204, 204, 255, 255, 255
                         ],
                         [
                             255, 255, 204, 183, 153, 141, 111, 103, 103,
                             111, 141, 153, 183, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 153, 111, 94, 72, 52, 52, 72,
                             94, 111, 153, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 153, 111, 72, 39, 1, 1, 39, 72,
                             111, 153, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 183, 141, 111, 72, 39, 39, 72,
                             111, 141, 183, 204, 255, 255
                         ],
                         [
                             255, 255, 255, 204, 183, 141, 111, 72, 72, 111,
                             141, 183, 204, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 204, 183, 141, 94, 94, 141,
                             183, 204, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 204, 153, 103, 103,
                             153, 204, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 204, 183, 141, 94, 94, 141,
                             183, 204, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 204, 183, 141, 111, 72, 72, 111,
                             141, 183, 204, 255, 255, 255
                         ],
                         [
                             255, 255, 204, 183, 141, 111, 72, 39, 39, 72,
                             111, 141, 183, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 153, 111, 72, 39, 1, 1, 39, 72,
                             111, 153, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 153, 111, 94, 72, 52, 52, 72,
                             94, 111, 153, 204, 255, 255
                         ],
                         [
                             255, 255, 204, 183, 153, 141, 111, 103, 103,
                             111, 141, 153, 183, 204, 255, 255
                         ],
                         [
                             255, 255, 255, 204, 204, 183, 153, 153, 153,
                             153, 183, 204, 204, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 204, 204, 204, 204,
                             204, 204, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 255, 255, 255, 255,
                             255, 255, 255, 255, 255, 255, 255
                         ],
                         [
                             255, 255, 255, 255, 255, 255, 255, 255, 255,
                             255, 255, 255, 255, 255, 255, 255
                         ]])
     mask = (data != 255)
     markers = numpy.zeros(data.shape, int)
     markers[6, 7] = 1
     markers[14, 7] = 2
     out = fast_watershed(data, markers, self.eight, mask=mask)
     #
     # The two objects should be the same size, except possibly for the
     # border region
     #
     size1 = numpy.sum(out == 1)
     size2 = numpy.sum(out == 2)
     self.assertTrue(abs(size1 - size2) <= 6)