more work related to graffy/lipase#3
- the user can now use radial profile image processing through a new plugin (Radial Profile) - improved the computation of the radial profile : the profile is now normalised (no longer bigger weights for big circles)
This commit is contained in:
		
							parent
							
								
									4daf2bfe91
								
							
						
					
					
						commit
						f0a624fc2b
					
				|  | @ -0,0 +1,41 @@ | |||
| #@ ImagePlus (label="the input image") INPUT_IMAGE | ||||
| #@ Float (label="maximal radius", value=10.0, min=0.0, max=100.0, style="slider") MAX_RADIUS | ||||
| 
 | ||||
| #@output ImagePlus RADIAL_PROFILE | ||||
| """This script is supposed to be launched from fiji's jython interpreter | ||||
| 
 | ||||
| This imagej plugin computes the radial profile of each pixel of the input image. The resulting profiles are stored in a single hyperstack, where the profile data are stored along the channel axis | ||||
| """ | ||||
| 
 | ||||
| # # note: fiji's jython doesn't support encoding keyword | ||||
| 
 | ||||
| import sys | ||||
| print('python version %s' % sys.version)  # prints python version | ||||
| 
 | ||||
| from lipase.settings import UserSettings | ||||
| 
 | ||||
| from lipase.imageengine import IImageEngine, PixelType | ||||
| from lipase.imagej.ijimageengine import IJImageEngine | ||||
| from lipase.circsymdetector import CircularSymmetryDetector | ||||
| 
 | ||||
| import ij.gui  # pylint: disable=import-error | ||||
| from jarray import zeros, array  # pylint: disable=import-error | ||||
| 
 | ||||
| def run_script(): | ||||
|     global INPUT_IMAGE  # pylint:disable=global-variable-not-assigned | ||||
|     global MAX_RADIUS  # pylint:disable=global-variable-not-assigned | ||||
|     global RADIAL_PROFILE  # pylint:disable=global-variable-not-assigned | ||||
| 
 | ||||
|     IImageEngine.set_instance(IJImageEngine()) | ||||
| 
 | ||||
|     src_image = IImageEngine.get_instance().create_image(width=1, height=1, pixel_type=PixelType.U8) | ||||
|     src_image.ij_image = INPUT_IMAGE  # pylint: disable=undefined-variable | ||||
| 
 | ||||
|     detector = CircularSymmetryDetector(max_radius=MAX_RADIUS)  # pylint: disable=undefined-variable | ||||
|     radial_profiles = detector.compute_radial_profiles(src_image) | ||||
| 
 | ||||
|     RADIAL_PROFILE = radial_profiles.hyperstack | ||||
| 
 | ||||
| 
 | ||||
| # note : when launched from fiji, __name__ doesn't have the value "__main__", as when launched from python | ||||
| run_script() | ||||
|  | @ -41,7 +41,7 @@ def create_circle_image(image_size, circle_radius, circle_pos, circle_thickness, | |||
|             dx = x - circle_pos_x | ||||
|             dy = y - circle_pos_y | ||||
|             r_square = (dx * dx + dy * dy) | ||||
|             if r_min_square < r_square < r_max_square: | ||||
|             if r_min_square - 0.001 <= r_square < r_max_square: | ||||
|                 pixel_value = circle_value | ||||
|             else: | ||||
|                 pixel_value = background_value | ||||
|  | @ -86,11 +86,15 @@ class CircularSymmetryProjectorBase(IProjectorBase): | |||
|         else: | ||||
|             if oversampling_is_handled: | ||||
|                 circle_image = oversampled_circle.resample(width=image_size, height=image_size) | ||||
|         # mean_value = circle_image.get_mean_value() | ||||
|         # num_pixels = image_size * image_size | ||||
|         # sum_of_pixel_values = mean_value * num_pixels | ||||
|         mean_value = circle_image.get_mean_value() | ||||
|         assert mean_value > 0.0, "unexpected mean value of this circle image : this circle might be empty, or worse, have negative values, which doesn't make sense" | ||||
|         print(type(mean_value)) | ||||
|         num_pixels = image_size * image_size | ||||
|         sum_of_pixel_values = mean_value * num_pixels | ||||
|         # we want each circle to have a total weight of 1.0, regardless their radius | ||||
|         # circle_image.scale_values(1.0/sum_of_pixel_values) | ||||
|         circle_image.scale_values(1.0/sum_of_pixel_values) | ||||
|          | ||||
| 
 | ||||
|          | ||||
|         anchor_point = {'x': int(circle_pos['x']), 'y': int(circle_pos['y'])} | ||||
|         return circle_image, anchor_point | ||||
|  | @ -119,5 +123,5 @@ class CircularSymmetryDetector: | |||
|             print(type(center_of_filter)) | ||||
|             projection = ie.filter2D(src_image, dst_type=PixelType.F32, kernel=projector, anchor=(center_of_filter['x'], center_of_filter['y'])) | ||||
|             ie.debugger.on_image(projection, 'projection_%d' % (projector_index)) | ||||
|             radial_profile_image.set_image(self, projection, frame_index=0, slice_index=0, channel_index=projector_index) | ||||
|             radial_profile_image.set_image(projection, frame_index=0, slice_index=0, channel_index=projector_index) | ||||
|         return radial_profile_image | ||||
|  |  | |||
|  | @ -108,7 +108,8 @@ class IJImage(IImage): | |||
|         return image_stats.mean | ||||
| 
 | ||||
|     def scale_values(self, scale): | ||||
|         raise NotImplementedError() | ||||
|         processor = self.ij_image.getProcessor() | ||||
|         processor.multiply(scale) | ||||
| 
 | ||||
| 
 | ||||
| class IJHyperStack(IHyperStack): | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue