-
Notifications
You must be signed in to change notification settings - Fork 0
/
findyourcell.jl
executable file
·91 lines (86 loc) · 3.5 KB
/
findyourcell.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using Images
using ImageSegmentation
"""
TODO: LoG with threshold or Gaussian with minima?
"""
function watershedborder(watershed_segments)
marker_border = BitArray(undef, size(watershed_segments.image_indexmap));
marker_border .= false
for label in watershed_segments.segment_labels
marker_border .|= ((watershed_segments.image_indexmap.==label)
.⊻ erode(watershed_segments.image_indexmap .==label));
end
marker_border;
end
function locate_cell(_img)
_img_gaussian = imfilter( _img, Kernel.gaussian(12))
# Extract local minima as watershed markers
_img_center = Int.(local_minima(opening(closing( .- _img_gaussian ))))
# remove wrong local minima
estimated_th = otsu_threshold(_img_gaussian)
@inbounds for i in eachindex(_img_center)
now = _img_center[i]
if now > 0
# remove point which darker than estimated threshold
if _img_gaussian[i] < estimated_th
_img_center[i] = 0
else
_img_center[i] = 1
end
end
end
_img_center = label_components(_img_center)
# Use watershed to split each cell
_img_region= watershed( 1 .- imfilter(_img, Kernel.gaussian(5)), _img_center)
return _img_center, labels_map(_img_region)
end
function pickup_cell(_img, _img_center, _img_watershed)
width = 100
x_len, y_len = size(_img)
mask = zeros(UInt16, size(_img))
cell_num = maximum(_img_center)
cell_info = zeros(cell_num, 5) # [threshold size intensity]
cell_center = component_centroids(_img_center)
#TODO: relabel mask map & only keep one connected component
@inbounds for cell in 1:cell_num
#print(cell , " ")
if (width < cell_center[cell+1][1] < x_len-width) &&
(width < cell_center[cell+1][2] < y_len-width)
x0 = Int(floor(cell_center[cell + 1][1] - width/2 + 1))
y0 = Int(floor(cell_center[cell + 1][2] - width/2 + 1))
x1 = Int(floor(cell_center[cell + 1][1] + width/2 - 1))
y1 = Int(floor(cell_center[cell + 1][2] + width/2 - 1))
#println(x0, " ", y0, " ",x1, " ", y1)
cell_raw = view(_img, x0:x1, y0:y1)
cell_watershed_mask = view(_img_watershed, x0:x1, y0:y1) .== cell
#TODO: check mask size to avoid single point mask
cell_single = cell_raw[cell_watershed_mask]
if length(cell_single) > 441 # check size > 21*21=441
cell_info[cell, 1] = (x0+x1)/2
cell_info[cell, 2] = (y0+y1)/2
cell_info[cell, 3] = otsu_threshold(cell_single)
cell_mask = view(mask, x0:x1, y0:y1)
cell_size = 0;
cell_intensity = 0;
@inbounds for j in eachindex( cell_raw )
if cell_watershed_mask[j] && cell_raw[j] >
cell_info[cell, 3]
cell_mask[j] = cell # assign label to pixel
cell_size = cell_size + 1
cell_intensity = cell_intensity + cell_raw[j]
end
end
cell_info[cell, 4] = cell_size
cell_info[cell, 5] = cell_intensity#/cell_size
else
#println("Ignore cell which contacte edge")
end
end
end
return mask, cell_info
end
function find_your_cell(img)
img_center, img_region = locate_cell(img)
cell_mask, cell_info = pickup_cell(img, img_center, img_region)
return cell_mask, cell_info
end