def detect_vessels(self, additional_mask=None): im = self._image mask = self._mask # green channel & remove light reflex im_gray = remove_light_reflex(im) # CLAHE clahe = cv2.createCLAHE(3, (7, 7)) im_clahe = clahe.apply(im_gray) # Haar transform wp = pywt.WaveletPacket2D(im_clahe, wavelet='haar', maxlevel=1, mode='sym') wp.decompose() im_haar = wp['a'].data im_haar = remove_light_reflex(im_haar) mask = ImageReader.rescale_mask(im_haar, self.mask) try: hasAdditionalMask = additional_mask.size > 0 additional_mask = ImageReader.rescale_mask(im_haar, additional_mask) except AttributeError: hasAdditionalMask = False # compute the image mean to "invert" the image # for the gausssian matched filter mean_thresh, _, _, _ = cv2.mean(im_haar, mask) if hasAdditionalMask: im_haar[additional_mask != 0] = mean_thresh im_haar = mean_thresh - im_haar # Gaussian Matched and FDOG filter responses K_MF = gaussian_matched_filter_kernel(31, 5) K_FDOG = fdog_filter_kernel(31, 5) kernels_mf = createMatchedFilterBank(K_MF, 12) kernels_fdog = createMatchedFilterBank(K_FDOG, 12) im_matched_mf = applyFilters(im_haar, kernels_mf) im_matched_fdog = applyFilters(im_haar, kernels_fdog) # normalize local mean of FDOG response local_mean_fdog = cv2.blur(im_matched_fdog, (11, 11)) local_mean_fdog = cv2.normalize(local_mean_fdog, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX) # set the threshold matrix mean_thresh, _, _, _ = cv2.mean(im_matched_mf, mask) ref_thresh = mean_thresh * self._norm_const ref_thresh = ref_thresh * (1 + local_mean_fdog) # show the results if self._is_debug: show_images([self._reader.image]) show_images([im_gray, im_haar], titles=["gray", "haar"]) show_images([im_matched_mf, im_matched_fdog], titles=["mf", "fdog"]) im_vessels = im_matched_mf.copy() im_vessels[im_vessels < ref_thresh] = 0 im_vessels[mask == 0] = 0 im_vessels[im_vessels != 0] = 1 im_vessels = im_vessels.astype('uint8') if self._is_debug: show_images([im_vessels], titles=["vessels"]) self._im_norm = mh.stretch(im_matched_mf) return ImageReader.rescale_mask(self.image, im_vessels)