Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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