Esempio n. 1
0
    def run(self, workspace):
        image = workspace.image_set.get_image(self.image_name.value,
                                              must_be_grayscale=True)
        orig_pixels = image.pixel_data
        if image.has_mask:
            mask = image.mask
        else:
            mask = np.ones(orig_pixels.shape, bool)
        if self.method == M_SOBEL:
            if self.direction == E_ALL:
                output_pixels = sobel(orig_pixels, mask)
            elif self.direction == E_HORIZONTAL:
                output_pixels = hsobel(orig_pixels, mask)
            elif self.direction == E_VERTICAL:
                output_pixels = vsobel(orig_pixels, mask)
            else:
                raise NotImplementedError(
                    "Unimplemented direction for Sobel: %s",
                    self.direction.value)
        elif self.method == M_LOG:
            sigma = self.get_sigma()
            size = int(sigma * 4) + 1
            output_pixels = laplacian_of_gaussian(orig_pixels, mask, size,
                                                  sigma)
        elif self.method == M_PREWITT:
            if self.direction == E_ALL:
                output_pixels = prewitt(orig_pixels)
            elif self.direction == E_HORIZONTAL:
                output_pixels = hprewitt(orig_pixels, mask)
            elif self.direction == E_VERTICAL:
                output_pixels = vprewitt(orig_pixels, mask)
            else:
                raise NotImplementedError(
                    "Unimplemented direction for Prewitt: %s",
                    self.direction.value)
        elif self.method == M_CANNY:
            high_threshold = self.manual_threshold.value
            low_threshold = self.low_threshold.value
            if (self.wants_automatic_low_threshold.value
                    or self.wants_automatic_threshold.value):
                sobel_image = sobel(orig_pixels, mask)
                low, high = otsu3(sobel_image[mask])
                if self.wants_automatic_low_threshold.value:
                    low_threshold = low * self.threshold_adjustment_factor.value
                if self.wants_automatic_threshold.value:
                    high_threshold = high * self.threshold_adjustment_factor.value
            output_pixels = canny(orig_pixels, mask, self.get_sigma(),
                                  low_threshold, high_threshold)
        elif self.method == M_ROBERTS:
            output_pixels = roberts(orig_pixels, mask)
        else:
            raise NotImplementedError(
                "Unimplemented edge detection method: %s" % self.method.value)

        output_image = cpi.Image(output_pixels, parent_image=image)
        workspace.image_set.add(self.output_image_name.value, output_image)

        if self.show_window:
            workspace.display_data.orig_pixels = orig_pixels
            workspace.display_data.output_pixels = output_pixels
Esempio n. 2
0
    def run(self, workspace):
        image = workspace.image_set.get_image(self.image_name.value,
                                              must_be_grayscale=True)
        orig_pixels = image.pixel_data
        if image.has_mask:
            mask = image.mask
        else:
            mask = np.ones(orig_pixels.shape, bool)
        if self.method == M_SOBEL:
            if self.direction == E_ALL:
                output_pixels = sobel(orig_pixels, mask)
            elif self.direction == E_HORIZONTAL:
                output_pixels = hsobel(orig_pixels, mask)
            elif self.direction == E_VERTICAL:
                output_pixels = vsobel(orig_pixels, mask)
            else:
                raise NotImplementedError("Unimplemented direction for Sobel: %s", self.direction.value)
        elif self.method == M_LOG:
            sigma = self.get_sigma()
            size = int(sigma * 4) + 1
            output_pixels = laplacian_of_gaussian(orig_pixels, mask, size, sigma)
        elif self.method == M_PREWITT:
            if self.direction == E_ALL:
                output_pixels = prewitt(orig_pixels)
            elif self.direction == E_HORIZONTAL:
                output_pixels = hprewitt(orig_pixels, mask)
            elif self.direction == E_VERTICAL:
                output_pixels = vprewitt(orig_pixels, mask)
            else:
                raise NotImplementedError("Unimplemented direction for Prewitt: %s", self.direction.value)
        elif self.method == M_CANNY:
            high_threshold = self.manual_threshold.value
            low_threshold = self.low_threshold.value
            if (self.wants_automatic_low_threshold.value or
                    self.wants_automatic_threshold.value):
                sobel_image = sobel(orig_pixels, mask)
                low, high = otsu3(sobel_image[mask])
                if self.wants_automatic_low_threshold.value:
                    low_threshold = low * self.threshold_adjustment_factor.value
                if self.wants_automatic_threshold.value:
                    high_threshold = high * self.threshold_adjustment_factor.value
            output_pixels = canny(orig_pixels, mask, self.get_sigma(),
                                  low_threshold,
                                  high_threshold)
        elif self.method == M_ROBERTS:
            output_pixels = roberts(orig_pixels, mask)
        elif self.method == M_KIRSCH:
            output_pixels = kirsch(orig_pixels)
        else:
            raise NotImplementedError("Unimplemented edge detection method: %s" %
                                      self.method.value)

        output_image = cpi.Image(output_pixels, parent_image=image)
        workspace.image_set.add(self.output_image_name.value, output_image)

        if self.show_window:
            workspace.display_data.orig_pixels = orig_pixels
            workspace.display_data.output_pixels = output_pixels
Esempio n. 3
0
 def test_01_02_vertical(self):
     '''Sobel on a vertical edge should be a vertical line'''
     i, j = np.mgrid[-5:6, -5:6]
     image = (j >= 0).astype(float)
     result = F.sobel(image)
     j[np.abs(i) == 5] = 10000
     self.assertTrue(np.all(result[j == 0] == 1))
     self.assertTrue(np.all(result[np.abs(j) > 1] == 0))
Esempio n. 4
0
 def test_01_01_horizontal(self):
     '''Sobel on an edge should be a horizontal line'''
     i, j = np.mgrid[-5:6, -5:6]
     image = (i >= 0).astype(float)
     result = F.sobel(image)
     # Fudge the eroded points
     i[np.abs(j) == 5] = 10000
     self.assertTrue(np.all(result[i == 0] == 1))
     self.assertTrue(np.all(result[np.abs(i) > 1] == 0))
 def test_02_03_sobel_all(self):
     '''Test the Sobel transform'''
     np.random.seed(0)
     image = np.random.uniform(size=(20, 20)).astype(np.float32)
     workspace, module = self.make_workspace(image)
     module.method.value = F.M_SOBEL
     module.direction.value = F.E_ALL
     module.run(workspace)
     output = workspace.image_set.get_image(OUTPUT_IMAGE_NAME)
     self.assertTrue(np.all(output.pixel_data == FIL.sobel(image)))
 def test_02_03_sobel_all(self):
     '''Test the Sobel transform'''
     np.random.seed(0)
     image = np.random.uniform(size=(20, 20)).astype(np.float32)
     workspace, module = self.make_workspace(image)
     module.method.value = F.M_SOBEL
     module.direction.value = F.E_ALL
     module.run(workspace)
     output = workspace.image_set.get_image(OUTPUT_IMAGE_NAME)
     self.assertTrue(np.all(output.pixel_data == FIL.sobel(image)))
Esempio n. 7
0
 def run(self, workspace):
     image_set = workspace.image_set
     image = image_set.get_image(self.input_image_name.value)
     pixel_data = image.pixel_data
     if self.filter_choice == S_GAUSSIAN:
         pixel_data = gaussian_filter(pixel_data, sigma=1)
     else:
         pixel_data = sobel(pixel_data)
     output = cpi.Image(pixel_data, parent_image = image)
     image_set.add(self.output_image_name.value, output)
     if self.show_window:
         workspace.display_data.input_image = image.pixel_data
         workspace.display_data.output_image = pixel_data
Esempio n. 8
0
 def run(self, workspace):
     image_set = workspace.image_set
     image = image_set.get_image(self.input_image_name.value)
     pixel_data = image.pixel_data
     if self.filter_choice == S_GAUSSIAN:
         pixel_data = gaussian_filter(pixel_data, sigma=self.sigma.value)
     else:
         pixel_data = sobel(pixel_data)
     output = cpi.Image(pixel_data, parent_image=image)
     image_set.add(self.output_image_name.value, output)
     if self.show_window:
         workspace.display_data.input_image = image.pixel_data
         workspace.display_data.output_image = pixel_data
 def test_06_01_canny(self):
     '''Test the canny method'''
     i, j = np.mgrid[-20:20, -20:20]
     image = np.logical_and(i > j, i ** 2 + j ** 2 < 300).astype(np.float32)
     np.random.seed(0)
     image = image * .5 + np.random.uniform(size=image.shape) * .3
     image = np.ascontiguousarray(image, np.float32)
     workspace, module = self.make_workspace(image)
     module.method.value = F.M_CANNY
     module.wants_automatic_threshold.value = True
     module.wants_automatic_low_threshold.value = True
     module.wants_automatic_sigma.value = True
     module.run(workspace)
     output = workspace.image_set.get_image(OUTPUT_IMAGE_NAME)
     t1, t2 = otsu3(FIL.sobel(image))
     result = FIL.canny(image, np.ones(image.shape, bool), 1.0, t1, t2)
     self.assertTrue(np.all(output.pixel_data == result))
 def test_06_01_canny(self):
     '''Test the canny method'''
     i, j = np.mgrid[-20:20, -20:20]
     image = np.logical_and(i > j, i**2 + j**2 < 300).astype(np.float32)
     np.random.seed(0)
     image = image * .5 + np.random.uniform(size=image.shape) * .3
     image = np.ascontiguousarray(image, np.float32)
     workspace, module = self.make_workspace(image)
     module.method.value = F.M_CANNY
     module.wants_automatic_threshold.value = True
     module.wants_automatic_low_threshold.value = True
     module.wants_automatic_sigma.value = True
     module.run(workspace)
     output = workspace.image_set.get_image(OUTPUT_IMAGE_NAME)
     t1, t2 = otsu3(FIL.sobel(image))
     result = FIL.canny(image, np.ones(image.shape, bool), 1.0, t1, t2)
     self.assertTrue(np.all(output.pixel_data == result))
Esempio n. 11
0
 def test_00_01_mask(self):
     '''Sobel on a masked array should be zero'''
     np.random.seed(0)
     result = F.sobel(np.random.uniform(size=(10, 10)),
                      np.zeros((10, 10), bool))
     self.assertTrue(np.all(result == 0))
Esempio n. 12
0
 def test_00_00_zeros(self):
     '''Sobel on an array of all zeros'''
     result = F.sobel(np.zeros((10, 10)), np.ones((10, 10), bool))
     self.assertTrue(np.all(result == 0))