improved trap binarizer : it now uses a manual threshold value to allow the user to adjust it.

As a result, both sides of the trap are now detected
This commit is contained in:
Guillaume Raffy 2020-02-05 12:45:16 +01:00
parent b4458c0697
commit 9ce4823e7a
3 changed files with 35 additions and 1 deletions

View File

@ -73,6 +73,12 @@ class IImage(ABC):
"""
pass
@abc.abstractmethod
def get_value_range(self):
"""
:rtype (float, float): the min and the max value
"""
pass
class IHyperStack(ABC):
@ -372,6 +378,13 @@ class IImageEngine(ABC):
:return list(Match): maxima
"""
@abc.abstractmethod
def threshold(self, src_image, threshold_value):
"""
:param float threshold_value:
:rtype IImage:
"""
@abc.abstractmethod
def auto_threshold(self, src_image):
"""

View File

@ -74,6 +74,16 @@ class IJImage(IImage):
dst_processor = self.ij_image.getProcessor()
dst_processor.copyBits(src_processor, x, y, Blitter.COPY)
def get_value_range(self):
processor = self.ij_image.getProcessor()
# processor.getMin() and processor.getMax() give a higher min and a lower max, probably because they only consider a subpart of the image (this is badly documented)
# so we use processor.getStats instead
image_stats = processor.getStats() # :type ImageStatistics is:
min_value = image_stats.min
max_value = image_stats.max
return (min_value, max_value)
class IJHyperStack(IHyperStack):
def __init__(self, image_engine, width, height, num_channels, num_slices, num_frames, pixel_type):
@ -367,6 +377,12 @@ class IJImageEngine(IImageEngine):
matches.append(match)
return matches
def threshold(self, src_image, threshold_value):
binary_image = src_image.clone()
IJ.setThreshold(binary_image.ij_image, threshold_value, 1.e30) # TODO:remove hardcoded value (1.0e30 is the value imagej chooses when the user moves the threshold slider to the right)
IJ.run(binary_image.ij_image, "Convert to Mask", "")
return binary_image
def auto_threshold(self, src_image):
# Image/Adjust/Threshold, choose auto, then click apply
# IJ.setAutoThreshold(imp, "Default dark");

View File

@ -27,7 +27,12 @@ class TrapBinarizer(object):
# after find edges, the walls are dark lines surrounded by 2 lines of clear pixels.
# Image/Adjust/Threshold, choose auto, then click apply
# IJ.setAutoThreshold(imp, "Default dark");
is_edge = ie.auto_threshold( edge_image )
(min_value, max_value) = edge_image.get_value_range()
print('min_value = %f' % min_value)
print('max_value = %f' % max_value)
threshold_value = 0.20 # TODO: remove hardcoded value
is_edge = ie.threshold( edge_image, max_value * threshold_value)
# is_edge = ie.auto_threshold( edge_image)
ie.save_as_tiff(is_edge, './is_trap_edge.tiff')
# convert image to mask
# at this point, the walls are black lines surrounded by 2 thick lines of white pixels