def optic_disk_detect_3(img): ''' Method that seems to work well with DIARETDB1 database. ''' hsi = rgb_to_hsi(img) intensity = hsi[:, :, 2].copy() #plt.axis('off'); show_image(intensity) #i_sp = add_salt_and_pepper(intensity, 0.005) i_med = mh.median_filter(intensity) # use Wiener filter instead? i_clahe = skimage.exposure.equalize_adapthist(i_med) #plt.axis('off'); show_image(i_clahe) seeds = (i_clahe > 0.85) seeds = skimage.morphology.remove_small_objects(seeds, min_size=300, connectivity=2) #plt.axis('off'); show_image(seeds) optic_disk_map = region_growing_1(i_clahe, radius=3, tol1=0.1, tol2=0.2, tol3=0.2, seeds=seeds) optic_disk_map += 1 #plt.axis('off'); show_image(optic_disk_map) _cl_areas = cl_areas(optic_disk_map) print _cl_areas optic_disk_map = leave_segments_by_mask(optic_disk_map, (8000 < _cl_areas) & (_cl_areas < 30000)) #optic_disk_map = skimage.morphology.remove_small_objects(optic_disk_map, min_size=500, connectivity=2) optic_disk_map = mh.close_holes(mh.close(optic_disk_map, Bc=np.ones((10, 10)))) #optic_disk_map = skimage.morphology.remove_small_objects(optic_disk_map, min_size=5000, connectivity=2) if np.all(optic_disk_map == 0): print 'Disk not found' return optic_disk_map
def exudate_detect_2(img): # Partially following H. Li et al. img_luv = skimage.color.rgb2luv(img) img_luv = normalize_image(img_luv) img_luv2 = skimage.exposure.equalize_adapthist(img_luv) img_luv2 = normalize_image(img_luv2) img_luv3 = sp.signal.wiener(img_luv2, noise=10.0) img_luv3 = normalize_image(img_luv3) edges = skimage.feature.canny(img_luv3[:, :, 1], sigma=2.0) tol1, tol2, tol3 = 100, 40, 100 img_obj_map = region_growing_1(img_luv3[:, :, 1] * 255, radius=3, edges=edges, tol1=tol1, tol2=tol2, tol3=tol3) segm_to_leave = list(np.where((cl_circularity(img_obj_map) > 0.05) & \ (cl_areas(img_obj_map) > 10) & \ (cl_areas(img_obj_map) < 1000) & \ (cl_eccentricity(img_obj_map) > 0.1))[0]) #(cl_mean_intensity(img_obj_map, img_luv3[:, :, 1]) < 20))[0]) exud1 = leave_segments(img_obj_map, segm_to_leave, \ replace_value=-1) return exud1
def hemorrhages_detect_2(img): moat = moat_operator(img, sigma=5.0) #show_image(moat); plt.axis('off'); plt.savefig('../presentation/pics/hemorrhages/1.png') m_clahe = skimage.exposure.equalize_adapthist(moat) m_med = mh.median_filter(m_clahe, Bc=np.ones((5, 5))) #show_image(m_med); plt.axis('off'); plt.savefig('../presentation/pics/hemorrhages/2.png') threshold_global_otsu = skimage.filters.threshold_otsu(m_med) print 'Otsu threshold:', threshold_global_otsu segmented = m_med <= 0.9 * threshold_global_otsu #show_image(segmented); plt.axis('off'); plt.savefig('../presentation/pics/hemorrhages/3.png') segm_label = skimage.measure.label(segmented) segm_eccen = np.array(map(attrgetter('eccentricity'), skimage.measure.regionprops(segm_label + 1))) segm_area = cl_areas(segm_label) #segm_circ = cf.cl_circularity(segm_label) segm_filtered = leave_segments_by_mask(segm_label, (segm_eccen < 0.85) & (10 < segm_area) & (segm_area < 30000), replace_value=0) != 0 return segm_filtered
def hemorrhages_get_features_5(img, moat, fundus_mask): m_clahe = skimage.exposure.equalize_adapthist(moat) m_med = mh.median_filter(m_clahe, Bc=np.ones((5, 5))) #seeds_1 = m_med < threshold #minima = pf.local_minima(m_med, stride_width=5, neighbd_rad=20, mask=fundus_mask) #minima &= fundus_mask & (m_med < threshold) #show_image(seeds_2, fig_size=(7, 7)) #label = region_growing_1(m_med, radius=1, tol1=0.01, tol2=0.01, tol3=0.01, seeds=minima) + 1 threshold_global_otsu = skimage.filters.threshold_otsu(m_med) cand = m_med <= 0.95 * threshold_global_otsu # erase vessels label = skimage.measure.label(cand) n_clusters = label.max() + 1 features_df = pd.DataFrame(columns=['circularity', 'eccentricity', 'std intensity', 'mean red', 'mean green'], index=np.arange(n_clusters)) areas = cl_areas(label) features_df['area'] = areas.astype(np.float64) features_df['circularity'] = cl_circularity(label) #features_df['eccentricity'] = cl_eccentricity(label) features_df['eccentricity'] = map(attrgetter('eccentricity'), skimage.measure.regionprops(label + 1)) intensity = img.sum(axis=2) / 3.0 i_clahe = skimage.exposure.equalize_adapthist(intensity) r_clahe = skimage.exposure.equalize_adapthist(img[:, :, 0]) g_clahe = skimage.exposure.equalize_adapthist(img[:, :, 1]) # perform median filtering on i_clahe and r_clahe? for i in xrange(n_clusters): cl_map = (label == i) if cl_map.sum() == 0: features_df.ix[i, 'std intensity'] = 0 features_df.ix[i, 'mean red'] = 0 features_df.ix[i, 'mean green'] = 0 else: features_df.ix[i, 'std intensity'] = i_clahe[cl_map].std() features_df.ix[i, 'mean red'] = r_clahe[cl_map].mean() features_df.ix[i, 'mean green'] = g_clahe[cl_map].mean() features_df = features_df.loc[(areas != 0) & \ (areas < 80000), :] return label, features_df
def hemorrhages_detect(img): moat = moat_operator(img, sigma=5.0) show_image(moat); plt.axis('off'); plt.savefig('../presentation/pics/hemorrhages/1.png') m_clahe = skimage.exposure.equalize_adapthist(moat) m_med = mh.median_filter(m_clahe, Bc=np.ones((5, 5))) show_image(m_med); plt.axis('off'); plt.savefig('../presentation/pics/hemorrhages/2.png') threshold_global_otsu = skimage.filters.threshold_otsu(m_med) print 'Otsu threshold:', threshold_global_otsu segmented = m_med <= 0.9 * threshold_global_otsu show_image(segmented); plt.axis('off'); plt.savefig('../presentation/pics/hemorrhages/3.png') #vessels = od.detect_vessels_3(img) vessels = detect_vessels_3(m_med, one_channel_img=True, gabor_perc=88.0) vessels = skimage.morphology.remove_small_objects(vessels, min_size=150) segmented[mh.dilate(vessels, Bc=np.ones((10, 10)))] = False show_image(segmented); plt.axis('off'); plt.savefig('../presentation/pics/hemorrhages/4.png') segm_label = skimage.measure.label(segmented) segm_eccen = np.array(map(attrgetter('eccentricity'), skimage.measure.regionprops(segm_label + 1))) segm_area = cl_areas(segm_label) #segm_circ = cf.cl_circularity(segm_label) segm_filtered = leave_segments_by_mask(segm_label, (segm_eccen < 0.85) & (segm_area < 30000), replace_value=0) != 0 return segm_filtered
def hemorrhages_get_features_4(img, fundus_mask, threshold=0.25): green = img[:, :, 1] g_clahe = skimage.exposure.equalize_adapthist(green) g_med = mh.median_filter(g_clahe, Bc=np.ones((5, 5))) #cand = g_med < threshold #label = skimage.measure.label(cand) seeds_1 = g_med < threshold #seeds_2 = pf.local_minima(g_med, stride_width=5, neighbd_rad=4, mask=seeds_1 & fundus_mask) #show_image(seeds_2, fig_size=(7, 7)) #label = region_growing_1(g_med, radius=1, tol1=0.05, tol2=0.05, tol3=0.05, seeds=seeds_2) + 1 label = skimage.measure.label(seeds_1) n_clusters = label.max() + 1 features_df = pd.DataFrame(columns=['area', 'circularity', 'eccentricity', 'std intensity', 'mean red', 'mean green'], index=np.arange(n_clusters)) features_df['area'] = cl_areas(label) features_df['circularity'] = cl_circularity(label) features_df['eccentricity'] = cl_eccentricity(label) intensity = img.sum(axis=2) / 3.0 i_clahe = skimage.exposure.equalize_adapthist(intensity) r_clahe = skimage.exposure.equalize_adapthist(img[:, :, 0]) # perform median filtering on i_clahe and r_clahe? for i in xrange(n_clusters): cl_map = (label == i) if cl_map.sum() == 0: features_df.ix[i, 'std intensity'] = 0 features_df.ix[i, 'mean red'] = 0 features_df.ix[i, 'mean green'] = 0 else: features_df.ix[i, 'std intensity'] = i_clahe[cl_map].std() features_df.ix[i, 'mean red'] = r_clahe[cl_map].mean() features_df.ix[i, 'mean green'] = g_clahe[cl_map].mean() features_df = features_df.loc[(features_df.area != 0) & \ (features_df.area < 80000), :] return label, features_df
def hemorrhages_ground_truth(label, true): covering_level = cl_mean_intensity(label, true.astype(np.float64)) areas = cl_areas(label) covering_level = covering_level[(areas != 0) & (areas < 80000)] return covering_level