Revision a07533c9ea81777f61634566429ee801da8231da authored by hf on 12 May 2020, 13:56:04 UTC, committed by hf on 12 May 2020, 13:56:04 UTC
1 parent 7981563
Raw File
splitcell.jl
using FileIO
using Images
using ImageSegmentation
using Statistics
#using HDF5

"""
Version Comment
0.1		initial 
0.2		only LoG
"""

"""
Generate border form watershed result
"""
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

"""
Use LoG fiter raw image to extract cell
"""
function split_cell_LoG(stack::Array{Gray{Normed{UInt16,16}},3}, time::Integer)
	println("Applying LoG(40) at Maximum Z Projection")
    #img_edge = zeros(N0f16, 1900, 1300, time);
    #mask_edge = zeros(Int16, 1900, 1300, time);
    local mask_markers = zeros(Bool, 1900, 1300, time);
	GC.gc() # garbage clean imediately to avoid double free insize threads.@threads
    @inbounds Threads.@threads for i in 1:time  #use 40 threads slow down speed. may due to gc time
    #@inbounds for i in 1:time  #use 40 threads slow down speed. may due to gc time
		# remove possion noise with median filter
		#imgx = maximum(stack[:, :, 20*(i-1)+1:20*i], dims=3)[:,:,1];
		local imgx = mapwindow(median!, maximum(view(stack, :, :, 20*(i-1)+1:20*i),dims=3)[:,:,1], (5,5));
		# using maximum z projection
		# extract intensity info with LoG
        mask_markers[:,:,i] = imfilter(imgx, Kernel.LoG(40)) .< -1e-7 ;
        #imgx_dist = distance_transform(feature_transform(imgx_log));
		# filter markers for watershed
        #imgx_markers = label_components( imgx_dist .> 50);
		#mask_markers[:,:,i] = imgx_markers
        #imgx_segments = watershed( imfilter(1 .- imgx, Kernel.gaussian(9)), imgx_markers);
        #img_edge[:,:,i] = .~watershedborder(imgx_segments).*imgx;
        #mask_clear[:,:,i] = extract_nucleus( imgx, imgx_segments) .> 0;
		#mask_edge[:,:,i] = imgx_segments.image_indexmap;
        #print("*");
    end
	println("Done")
    mask_markers;
end

# TODO: A simple version just use LoG then, only export only longlived and no branches cell.

#data_dir = "/datahub/rawdata/tandeng/mRNA_imaging/mRNA_confocal_hamamatsu-60X-TIRF";
#img_16_2 = load(File(format"TIFF", "$data_dir/20200316/HE7-11-1-80uw-PWM_1_s2.ome.tiff"));

#@time edge, clear = split_cell_LoG(img_16_2, 137);
#res_dir = "/datahub/rawdata/tandeng/mRNA_imaging/CoutingmRNA.jl"
#save("output/img_16_2_edge_all.tiff", edge);
#save("output/img_16_2_clear_all.tiff", clear);
#h5write("output/img_16_2_clear_all.h5", "img", rawview(clear));
back to top