Completed
Push — master ( 97b43f...ffcb6f )
by
unknown
07:28 queued 10s
created

BF_analysis.binary_BF()   B

Complexity

Conditions 8

Size

Total Lines 46
Code Lines 39

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 39
nop 7
dl 0
loc 46
rs 7.0773
c 0
b 0
f 0
1
import sys
2
import matplotlib
3
matplotlib.use('Agg')
4
import skimage.io as sio
5
import matplotlib.pyplot as plt
6
import numpy as np
7
import pandas as pd
8
import diff_classifier.aws as aws
9
from skimage.filters import roberts, sobel, scharr, prewitt, median, rank
10
from skimage import img_as_ubyte
11
from skimage.morphology import erosion, dilation, opening, closing, white_tophat, disk, reconstruction
12
from scipy.ndimage.morphology import distance_transform_edt as EuclideanTransform
13
from operator import itemgetter
14
15
to_track = []
16
result_futures = {}
17
18
remote_folder = 'Cell_Studies/10_16_18_cell_study' #Folder in AWS S3 containing files to be analyzed
19
bucket = 'ccurtis.data'
20
vids = 5
21
types = ['PS', 'PEG']
22
slices = [1, 2]
23
24
for typ in types:
25
    for slic in slices:
26
        for num in range(1, vids+1):
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable range does not seem to be defined.
Loading history...
27
            #to_track.append('100x_0_4_1_2_gel_{}_bulk_vid_{}'.format(vis, num))
28
            to_track.append('{}_{}_XY{}'.format(typ, slic, num))
29
30
31
def binary_BF(image, meanse=disk(10), edgefilt='prewitt', opense=disk(10),
32
          fill_first=False, bi_thresh=0.000025, tophatse=disk(20)):
33
    
34
    #convertim = img_as_ubyte(image)
35
    meanim = rank.mean(image, meanse)
36
    if edgefilt is 'prewitt':
37
        edgeim = prewitt(meanim)
38
    elif edgefilt is 'sobel':
39
        edgeim = sobel(meanim)
40
    elif edgefilt is 'scharr':
41
        edgeim = scharr(meanim)
42
    elif edgefilt is 'roberts':
43
        edgeim = roberts(meanim)
44
    
45
    closeim = closing(edgeim, opense)
0 ignored issues
show
introduced by
The variable edgeim does not seem to be defined for all execution paths.
Loading history...
46
    openim = opening(closeim, opense)
47
    if fill_first:
48
        seed = np.copy(openim)
49
        seed[1:-1, 1:-1] = openim.max()
50
        mask = openim
51
        filledim = reconstruction(seed, mask, method='erosion')
52
        binarim = filledim > bi_thresh
53
    else:
54
        binarim = openim > bi_thresh*np.mean(openim)
55
        seed = np.copy(binarim)
56
        seed[1:-1, 1:-1] = binarim.max()
57
        mask = binarim
58
        filledim = reconstruction(seed, mask, method='erosion')
59
60
    tophim = filledim - closing(white_tophat(filledim, tophatse), opense)>0.01
61
62
    fig, ax = plt.subplots(nrows=2, ncols=4, figsize=(16, 8))
63
    ax[0][0].imshow(image, cmap='gray')
64
    ax[0][1].imshow(meanim, cmap='gray')
65
    ax[0][2].imshow(edgeim, cmap='gray', vmax=4*np.mean(edgeim))
66
    ax[0][3].imshow(closeim, cmap='gray', vmax=4*np.mean(closeim))
67
    ax[1][0].imshow(openim, cmap='gray', vmax=4*np.mean(openim))
68
    ax[1][1].imshow(binarim, cmap='gray')
69
    ax[1][2].imshow(filledim, cmap='gray')
70
    ax[1][3].imshow(tophim, cmap='gray')
71
    for axes in ax:
72
        for axe in axes:
73
            axe.axis('off')
74
    fig.tight_layout()
75
    
76
    return tophim
77
78
79
def BF_cell_features(prefix, folder, bucket='ccurtis.data'):
80
    
81
    ffilename = 'features_{}.csv'.format(prefix)
82
    mfilename = 'msd_{}.csv'.format(prefix)
83
    bffilename = 'BF_cells_{}.tif'.format(prefix)
84
    biim = 'bi_BF_cells_{}.tif'.format(prefix)
85
    bimages = 'biproc_BF_cells_{}.png'.format(prefix)
86
    
87
    aws.download_s3('{}/{}'.format(folder, ffilename), ffilename, bucket_name=bucket)
88
    aws.download_s3('{}/{}'.format(folder, mfilename), mfilename, bucket_name=bucket)
89
    aws.download_s3('{}/{}'.format(folder, bffilename), bffilename, bucket_name=bucket)
90
    print('Successfully downloaded files')
91
    
92
    fstats = pd.read_csv(ffilename, encoding = "ISO-8859-1")
93
    msds = pd.read_csv(mfilename, encoding = "ISO-8859-1")
94
    bfimage = plt.imread(bffilename)
95
    tophimage = binary_BF(bfimage, opense=disk(12), bi_thresh=1.2, tophatse=disk(20))
96
    plt.savefig(bimages)
97
    euimage = EuclideanTransform(tophimage)+EuclideanTransform(~tophimage)
98
    print('Successfully performed image processing')
99
    
100
    xa = -np.reshape(np.clip((fstats.Y.values-1).astype(int), a_min=0, a_max=2043), newshape=(fstats.Y.shape[0], 1))
101
    ya = np.reshape(np.clip((fstats.X.values-1).astype(int), a_min=0, a_max=2043), newshape=(fstats.X.shape[0], 1))
102
    xya = [tuple(l) for l in np.concatenate((xa, ya), axis=1).tolist()]
103
    fstats['Cell Status'] = itemgetter(*xya)(tophimage)
104
    fstats['Cell Distance'] = itemgetter(*xya)(euimage)
105
106
    print('Successfully calculated Cell Status Params')
107
    
108
    frames = 651
109
    xb = -np.reshape(np.clip((msds.Y.values-1).astype(int), a_min=0, a_max=2043), newshape=(int(msds.Y.shape[0]), 1))
110
    yb = np.reshape(np.clip((msds.X.values-1).astype(int), a_min=0, a_max=2043), newshape=(int(msds.X.shape[0]), 1))
111
    xyb = [tuple(l) for l in np.concatenate((xb, yb), axis=1).tolist()]
112
    msds['Cell Status'] = itemgetter(*xyb)(tophimage)
113
    msds['Cell Distance'] = itemgetter(*xyb)(euimage)
114
    
115
    msds_cell_status = np.reshape(msds['Cell Status'].values, newshape=(int(msds.X.shape[0]/frames), frames))
116
    msds_cell_distance = np.reshape(msds['Cell Distance'].values, newshape=(int(msds.X.shape[0]/frames), frames))
117
    fstats['Membrane Xing'] = np.sum(np.diff(msds_cell_status, axis=1) == True, axis=1)
118
    fstats['Distance Towards Cell'] = np.sum(np.diff(msds_cell_distance, axis=1), axis=1)
119
    fstats['Percent Towards Cell'] = np.mean(np.diff(msds_cell_distance, axis=1) > 0, axis=1)
120
    print('Successfully calculated Membrane Xing Params')
121
    
122
    fstats.to_csv(ffilename, sep=',', encoding = "ISO-8859-1")
123
    msds.to_csv(mfilename, sep=',', encoding = "ISO-8859-1")
124
    plt.imsave(biim, tophimage, cmap='gray')
125
    
126
    aws.upload_s3(ffilename, '{}/{}'.format(folder, ffilename), bucket_name=bucket)
127
    aws.upload_s3(mfilename, '{}/{}'.format(folder, mfilename), bucket_name=bucket)
128
    aws.upload_s3(biim, '{}/{}'.format(folder, biim), bucket_name=bucket)
129
    aws.upload_s3(bimages, '{}/{}'.format(folder, bimages, bucket_name=bucket))
130
    print('Successfully uploaded files')
131
    
132
    return fstats
133
134
135
for prefix in to_track[int(sys.argv[1]):int(sys.argv[2])]:
136
    fstats = BF_cell_features(prefix, remote_folder, bucket=bucket)
137
    print('Successfully output cell features for {}'.format(prefix))
138
    
139