Skip to content
Snippets Groups Projects
st2d_examples.py 9.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • vand's avatar
    vand committed
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Thu Aug 29 11:30:17 2019
    
    @author: vand@dtu.dk
    """
    
    import numpy as np
    import skimage.io
    import matplotlib.pyplot as plt
    import st2d
        
    #%% ST AND ORIENTATIONS - VISUALIZATION OPTIONS
    plt.close('all')
    
    
    vand's avatar
    vand committed
    filename = 'example_data_2D/drawn_fibres_B.png';
    
    vand's avatar
    vand committed
    sigma = 0.5
    rho = 2
    
    image = skimage.io.imread(filename)
    S = st2d.structure_tensor(image, sigma, rho)
    val,vec = st2d.eig_special(S)
        
    # visualization
    figsize = (10,5)
    fig, ax = plt.subplots(1, 5, figsize=figsize, sharex=True, sharey=True)
    ax[0].imshow(image,cmap=plt.cm.gray)
    st2d.plot_orientations(ax[0], image.shape, vec)
    ax[0].set_title('Orientation as arrows')
    orientation_st_rgba = plt.cm.hsv((np.arctan2(vec[1], vec[0])/np.pi).reshape(image.shape))
    ax[1].imshow(plt.cm.gray(image)*orientation_st_rgba)
    ax[1].set_title('Orientation as color on image')
    ax[2].imshow(orientation_st_rgba)
    ax[2].set_title('Orientation as color')
    anisotropy = (1-val[0]/val[1]).reshape(image.shape)
    ax[3].imshow(anisotropy)
    ax[3].set_title('Degree of anisotropy')
    ax[4].imshow(plt.cm.gray(anisotropy)*orientation_st_rgba)
    ax[4].set_title('Orientation and anisotropy')
    plt.show()    
    
     #%% ST AND ORIENTATIONS - HISTOGRAMS OPTIONS
    
    
    vand's avatar
    vand committed
    filename = 'example_data_2D/10X.png';
    
    vand's avatar
    vand committed
    sigma = 0.5
    rho = 15
    N = 180 # number of angle bins for orientation histogram
    
    # computation
    image = skimage.io.imread(filename)
    image = np.mean(image[:,:,0:3],axis=2).astype(np.uint8)
    S = st2d.structure_tensor(image, sigma, rho)
    val,vec = st2d.eig_special(S)
    angles = np.arctan2(vec[1], vec[0]) # angles from 0 to pi
    distribution = np.histogram(angles, bins=N, range=(0.0, np.pi))[0]
        
    # visualization
    figsize = (10,5)
    fig, ax = plt.subplots(1, 2, figsize=figsize, sharex=True, sharey=True)
    ax[0].imshow(image,cmap=plt.cm.gray)
    ax[0].set_title('Input image')
    orientation_st_rgba = plt.cm.hsv((angles/np.pi).reshape(image.shape))
    ax[1].imshow(plt.cm.gray(image)*orientation_st_rgba)
    ax[1].set_title('Orientation as color on image')
    
    fig, ax = plt.subplots(1,2, figsize=figsize)
    bin_centers = (np.arange(N)+0.5)*np.pi/N # halp circle (180 deg)
    colors = plt.cm.hsv(bin_centers/np.pi)
    ax[0].bar(bin_centers, distribution, width = np.pi/N, color = colors)
    ax[0].set_xlabel('angle')
    ax[0].set_xlim([0,np.pi])
    ax[0].set_aspect(np.pi/ax[0].get_ylim()[1])
    ax[0].set_xticks([0,np.pi/2,np.pi])
    ax[0].set_xticklabels(['0','pi/2','pi'])
    ax[0].set_ylabel('count')
    ax[0].set_title('Histogram over angles')
    st2d.polar_histogram(ax[1], distribution)
    ax[1].set_title('Polar histogram')
    plt.show()
    
     #%% ST AND ORIENTATIONS - HISTOGRAMS OPTIONS
    
    
    vand's avatar
    vand committed
    filename = 'example_data_2D/drawn_field.png';
    
    vand's avatar
    vand committed
    sigma = 0.5
    rho = 15
    N = 90 # number of angle bins for orientation histogram
    
    # computation
    image = skimage.io.imread(filename)
    image = np.mean(image[:,:,0:3],axis=2).astype(np.uint8)
    S = st2d.structure_tensor(image, sigma, rho)
    val,vec = st2d.eig_special(S)
    angles = np.arctan2(vec[1], vec[0]) # angles from 0 to pi
    distribution = np.histogram(angles, bins=N, range=(0.0, np.pi))[0]
    distribution_weighted = np.histogram(angles, bins=N, range=(0.0, np.pi), weights = (image>175).ravel().astype(np.float))[0]
        
    # visualization
    figsize = (10,5)
    fig, ax = plt.subplots(1, 2, figsize=figsize, sharex=True, sharey=True)
    ax[0].imshow(image,cmap=plt.cm.gray)
    ax[0].set_title('Input image')
    orientation_st_rgba = plt.cm.hsv((angles/np.pi).reshape(image.shape))
    ax[1].imshow(plt.cm.gray(image)*orientation_st_rgba)
    ax[1].set_title('Orientation as color on image')
    
    fig, ax = plt.subplots(2, 2, figsize=figsize)
    bin_centers = (np.arange(N)+0.5)*np.pi/N # halp circle (180 deg)
    colors = plt.cm.hsv(bin_centers/np.pi)
    ax[0][0].bar(bin_centers, distribution, width = np.pi/N, color = colors)
    ax[0][0].set_xlabel('angle')
    ax[0][0].set_xlim([0,np.pi])
    ax[0][0].set_aspect(np.pi/ax[0][0].get_ylim()[1])
    ax[0][0].set_xticks([0,np.pi/2,np.pi])
    ax[0][0].set_xticklabels(['0','pi/2','pi'])
    ax[0][0].set_ylabel('count')
    ax[0][0].set_title('Histogram over angles - all orientations')
    st2d.polar_histogram(ax[0][1], distribution)
    ax[0][1].set_title('Polar histogram - all orientations')
    ax[1][0].bar(bin_centers, distribution_weighted, width = np.pi/N, color = colors)
    ax[1][0].set_xlabel('angle')
    ax[1][0].set_xlim([0,np.pi])
    ax[1][0].set_aspect(np.pi/ax[1][0].get_ylim()[1])
    ax[1][0].set_xticks([0,np.pi/2,np.pi])
    ax[1][0].set_xticklabels(['0','pi/2','pi'])
    ax[1][0].set_ylabel('count')
    ax[1][0].set_title('Histogram over angles - orientations at fibres')
    st2d.polar_histogram(ax[1][1], distribution_weighted)
    ax[1][1].set_title('Polar histogram - orientations at fibres')
    plt.show()
    
       #%% YET ANOTHER EXAMPLE 
    
    
    vand's avatar
    vand committed
    filename = 'example_data_2D/OCT_im_org.png';
    
    vand's avatar
    vand committed
    sigma = 0.5
    rho = 5
    N = 180 # number of angle bins for orientation histogram
    
    # computation
    image = skimage.io.imread(filename)
    S = st2d.structure_tensor(image, sigma, rho)
    val,vec = st2d.eig_special(S)
    angles = np.arctan2(vec[1], vec[0]) # angles from 0 to pi
    distribution = np.histogram(angles, bins=N, range=(0.0, np.pi))[0]
        
    # visualization
    figsize = (10,5)
    fig, ax = plt.subplots(1, 2, figsize=figsize, sharex=True, sharey=True)
    ax[0].imshow(image,cmap=plt.cm.gray)
    ax[0].set_title('Input image')
    orientation_st_rgba = plt.cm.hsv((angles/np.pi).reshape(image.shape))
    ax[1].imshow(plt.cm.gray(image)*orientation_st_rgba)
    ax[1].set_title('Orientation as color on image')
    
    fig, ax = plt.subplots(1,2, figsize=figsize)
    bin_centers = (np.arange(N)+0.5)*np.pi/N # halp circle (180 deg)
    colors = plt.cm.hsv(bin_centers/np.pi)
    ax[0].bar(bin_centers, distribution, width = np.pi/N, color = colors)
    ax[0].set_xlabel('angle')
    ax[0].set_xlim([0,np.pi])
    ax[0].set_aspect(np.pi/ax[0].get_ylim()[1])
    ax[0].set_xticks([0,np.pi/2,np.pi])
    ax[0].set_xticklabels(['0','pi/2','pi'])
    ax[0].set_ylabel('count')
    ax[0].set_title('Histogram over angles')
    st2d.polar_histogram(ax[1], distribution)
    ax[1].set_title('Polar histogram')
    plt.show()
        
    #%% INVESTIGATING THE EFFECT OF RHO
    
    
    vand's avatar
    vand committed
    filename = 'example_data_2D/short_fibres.png'
    
    vand's avatar
    vand committed
    image = skimage.io.imread(filename)
    image = np.mean(image[:,:,0:3],axis=2)
    image -= np.min(image)
    image /= np.max(image)
    s = 128 # quiver arrow spacing
    sigma = 0.5
    figsize = (10,5)
    
    rhos = [2,10,20,50]
    
    for k in range(4):
        
        # computation
        rho = rhos[k] # changing integration radius
        S = st2d.structure_tensor(image,sigma,rho)
        val,vec = st2d.eig_special(S)
            
        # visualization
        fig, ax = plt.subplots(1, 2, figsize=figsize, sharex=True, sharey=True)
        ax[0].imshow(image,cmap=plt.cm.gray)
        st2d.plot_orientations(ax[0], image.shape, vec, s = s)
        ax[0].set_title(f'Rho = {rho}, arrows')
        intensity_rgba = plt.cm.gray(image)
        orientation_st_rgba = plt.cm.hsv((np.arctan2(vec[1], vec[0])/np.pi).reshape(image.shape))
        ax[1].imshow((0.5+0.5*intensity_rgba)*orientation_st_rgba)
        ax[1].set_title(f'Rho = {rho}, color')
    
        #basis_filename = filename.split('/')[-1].split('.')[0]
        #fig.savefig(basis_filename + '_rho_' + str(rho) + '.png')
        plt.show()
    
    
    
    #%% INVESTIGATING THE EFFECT OF SCALING + RHO 
    
    
    vand's avatar
    vand committed
    filename = 'example_data_2D/short_fibres.png'
    
    vand's avatar
    vand committed
    downsampling_range = 4
    figsize = (10,5)    
    
    for k in range(downsampling_range):
    
        # downsampling and computation
        scale = 2**k
        f = 1/scale # image scale factor
        s = 128//scale # quiver arrow spacing
        sigma = 0.5 # would it make sense to scale this too?
        rho = 50/scale # scaling the integration radius
        image = skimage.io.imread(filename)
        image = np.mean(image[:,:,0:3],axis=2)
        image = skimage.transform.rescale(image,f,multichannel=False)
        image -= np.min(image)
        image /= np.max(image)
        S = st2d.structure_tensor(image,sigma,rho)
        val,vec = st2d.eig_special(S)
            
        # visualization
        fig, ax = plt.subplots(1, 2, figsize=figsize, sharex=True, sharey=True)
        ax[0].imshow(image,cmap=plt.cm.gray)
        st2d.plot_orientations(ax[0], image.shape, vec, s = s)
        ax[0].set_title(f'Downsample = {scale}, arrows')
        intensity_rgba = plt.cm.gray(image)
        orientation_st_rgba = plt.cm.hsv((np.arctan2(vec[1], vec[0])/np.pi).reshape(image.shape))
        ax[1].imshow((0.5+0.5*intensity_rgba)*orientation_st_rgba)       
        ax[1].set_title(f'Downsample = {scale}, color')
     
        #basis_filename = filename.split('/')[-1].split('.')[0]
        #fig.savefig(basis_filename + '_scale_' + str(scale) + '.png')
        plt.show()
        
    #%% COMPARING DOMINANT ORIENTATION AND OPTICAL FLOW
    
    vand's avatar
    vand committed
    image = skimage.io.imread('example_data_2D/drawn_fibres_B.png');
    
    vand's avatar
    vand committed
    
    # computing structure tensor, orientation and optical flow
    sigma = 0.5
    rho = 5
    S = st2d.structure_tensor(image,sigma,rho)
    val,vec = st2d.eig_special(S) # dominant orientation
    fx = st2d.solve_flow(S) # optical flow
    
    # visualization
    figsize = (10,10)
    fy = np.ones(image.shape)
    fig, ax = plt.subplots(2,2,figsize=figsize)
    
    ax[0][0].imshow(image,cmap=plt.cm.gray)
    st2d.plot_orientations(ax[0][0], image.shape, vec)
    ax[0][0].set_title('Orientation from structure tensor, arrows')
    ax[0][1].imshow(image,cmap=plt.cm.gray)
    st2d.plot_orientations(ax[0][1], image.shape, np.r_[fx,np.ones((1,image.size))])
    ax[0][1].set_title('Orientation from optical flow, arrows')
    intensity_rgba = plt.cm.gray(image)
    orientation_st_rgba = plt.cm.hsv((np.arctan2(vec[1],vec[0])/np.pi).reshape(image.shape))
    orientation_of_rgba = plt.cm.hsv((np.arctan2(1,fx)/np.pi).reshape(image.shape))
    ax[1][0].imshow(intensity_rgba*orientation_st_rgba)
    ax[1][0].set_title('Dominant orientation from structure tensor, color')
    ax[1][1].imshow(intensity_rgba*orientation_of_rgba)
    ax[1][1].set_title('Orientation from optical flow, color')
    plt.show()