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
def test_01_01_ring(self): '''The LoG should have its lowest value in the center of the ring''' i, j = np.mgrid[-20:21, -20:21].astype(float) # A ring of radius 3, more or less image = (np.abs(i**2 + j**2 - 3) < 2).astype(float) result = F.laplacian_of_gaussian(image, None, 9, 3) self.assertTrue((np.argmin(result) % 41, int(np.argmin(result) / 41)) == (20, 20))
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
def test_05_02_log_manual(self): '''Test the laplacian of gaussian with manual sigma''' 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_LOG module.sigma.value = 4 module.wants_automatic_sigma.value = False module.run(workspace) output = workspace.image_set.get_image(OUTPUT_IMAGE_NAME) sigma = 4.0 expected = FIL.laplacian_of_gaussian(image, np.ones(image.shape, bool), int(sigma * 4) + 1, sigma).astype(np.float32) self.assertTrue(np.all(output.pixel_data == expected))
def test_05_02_log_manual(self): '''Test the laplacian of gaussian with manual sigma''' 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_LOG module.sigma.value = 4 module.wants_automatic_sigma.value = False module.run(workspace) output = workspace.image_set.get_image(OUTPUT_IMAGE_NAME) sigma = 4.0 expected = FIL.laplacian_of_gaussian(image, np.ones(image.shape, bool), int(sigma * 4) + 1, sigma).astype(np.float32) self.assertTrue(np.all(output.pixel_data == expected))
def test_00_01_zeros_mask(self): result = F.laplacian_of_gaussian(np.zeros((10, 10)), np.zeros((10, 10), bool), 9, 3) self.assertTrue(np.all(result == 0))
def test_00_00_zeros(self): result = F.laplacian_of_gaussian(np.zeros((10, 10)), None, 9, 3) self.assertTrue(np.all(result == 0))