Visit the wiki pages to find some additional documentation and instructions on how view an interactive verson of these notebooks using binder.

In [1]:
%matplotlib inline
In [2]:
import math
import numpy as np
import matplotlib.pyplot as plt


from skimage import measure
from skimage.color import rgb2gray
from skimage import io
from skimage import filters
from skimage.filters import median, sato, meijering, frangi, hessian
from skimage.morphology import disk
from skimage import feature
from skimage import exposure
from skimage.util import crop 
from skimage.filters import threshold_otsu
from skimage.morphology import medial_axis, skeletonize
In [3]:
image = io.imread("../images/retina-image.jpg")
grayscale = rgb2gray(image)
In [4]:
fig, ax = plt.subplots(figsize=(8, 8))
plt.imshow(grayscale, cmap=plt.cm.gray)
Out[4]:
<matplotlib.image.AxesImage at 0x7ffb7e9dda50>

Apply a median filter for denoising

In [5]:
image_med = median(grayscale, disk(13))
In [6]:
ig, ax = plt.subplots(figsize=(8, 8))
plt.imshow(grayscale, cmap=plt.cm.gray)
Out[6]:
<matplotlib.image.AxesImage at 0x7ffb7ec4f7d0>

Application of the Frangi detector

In [7]:
vessels_frangi = frangi(grayscale)

The scaling of the frangi detector is very weak. We use the histogram equalization to scale the image appropriately

In [8]:
vessels_frangi = crop(vessels_frangi, 10)
vessels_frangi = exposure.equalize_hist(vessels_frangi)
thresh = threshold_otsu(vessels_frangi)
binary = vessels_frangi > thresh
In [9]:
fig, ax = plt.subplots(figsize=(12, 12))
ax = plt.subplot(1,1,1)
plt.imshow(binary, cmap='gray')
ax.set_title('Frangi Filter', y=1.05, fontsize=18)
Out[9]:
Text(0.5, 1.05, 'Frangi Filter')

Skeletonization via thinning

In [10]:
skeleton = skeletonize(binary)
In [11]:
fig, ax = plt.subplots(figsize=(12, 12))
ax.imshow(skeleton, cmap='magma')
ax.set_title('thinning', y=1.05, fontsize=18)
ax.axis('off')
Out[11]:
(-0.5, 579.5, 428.5, -0.5)
In [12]:
## Skeletonizaton via Medial Axis 
In [13]:
skel, distance = medial_axis(binary, return_distance=True)
dist_on_skel = distance * skel
In [14]:
fig, ax = plt.subplots(figsize=(12, 12))
ax.imshow(dist_on_skel, cmap='magma')
ax.contour(binary, [0.5], colors='w')
ax.set_title('medial_axis')
ax.axis('off')
Out[14]:
(-0.5, 579.5, 428.5, -0.5)
In [ ]: