%matplotlib inline
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
image = io.imread("../images/retina-image.jpg")
grayscale = rgb2gray(image)
fig, ax = plt.subplots(figsize=(8, 8))
plt.imshow(grayscale, cmap=plt.cm.gray)
image_med = median(grayscale, disk(13))
ig, ax = plt.subplots(figsize=(8, 8))
plt.imshow(grayscale, cmap=plt.cm.gray)
vessels_frangi = frangi(grayscale)
The scaling of the frangi detector is very weak. We use the histogram equalization to scale the image appropriately
vessels_frangi = crop(vessels_frangi, 10)
vessels_frangi = exposure.equalize_hist(vessels_frangi)
thresh = threshold_otsu(vessels_frangi)
binary = vessels_frangi > thresh
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)
skeleton = skeletonize(binary)
fig, ax = plt.subplots(figsize=(12, 12))
ax.imshow(skeleton, cmap='magma')
ax.set_title('thinning', y=1.05, fontsize=18)
ax.axis('off')
## Skeletonizaton via Medial Axis
skel, distance = medial_axis(binary, return_distance=True)
dist_on_skel = distance * skel
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')