/
splitchannels.R
executable file
·137 lines (121 loc) · 3.67 KB
/
splitchannels.R
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#' Split channels into files and extracts size in microns
#'
#' @param file file name
#' @param channels e.g. c("red","green","blue")
#' @param rgb.folder folder with file
#' @param normalize boolean. Should we try to do normalization?
#'
#' @return files in "./red/", "./green", "./blue" and "./XYZmic"
#' @export
#' @import bioimagetools
splitchannels.file<-function(file, channels, rgb.folder, normalize=FALSE)
{
test<-try({
img<-readTIF(paste(rgb.folder,file,sep="/"))
rr<-which(channels=="red")
gg<-which(channels=="green")
bb<-which(channels=="blue")
red=green=blue=0
D<-length(dim(img))
if (D==4)
{
if(length(rr)>0)red<-img[,,rr,]
if(length(gg)>0)green<-img[,,gg,]
if(length(bb)>0)blue<-img[,,bb,]
}
if (D==3)
{
Z<-dim(img)[3]
byby=length(channels)
if(length(rr)>0)red<-img[,,seq(rr,Z,by=byby)]
if(length(gg)>0)green<-img[,,seq(gg,Z,by=byby)]
if(length(bb)>0)blue<-img[,,seq(bb,Z,by=byby)]
}
if(length(rr)>0)
{
if(normalize)
{
red<-red-find.mode(red)
red[red<0]<-0
red<-red-min(red)
red<-red/max(red)
}
writeTIF(red,paste("red/",file,sep=""),bps=16L)
}
if(length(gg)>0)
{
if(normalize){
green<-green-find.mode(green)
green[green<0]<-0
green<-green-min(green)
green<-green/max(green)
}
writeTIF(green,paste("green/",file,sep=""),bps=16L)
}
if(length(bb)>0)
{
if (normalize){
bluecut<-blue-find.mode(blue)
bluecut[bluecut<0]<-0
bluecut<-bluecut-min(bluecut)
#blue<-blue-min(blue)
#blue<-blue/max(blue)
blue<-bluecut/max(bluecut)
}
writeTIF(blue,paste("blue/",file,sep=""),bps=16L)
}
Xmic<-attr(img,"x.resolution")
Ymic<-attr(img,"y.resolution")
Zmic<-as.numeric(attr(img,"slices"))*as.numeric(attr(img,"spacing"))
write(c(Xmic,Ymic,Zmic),file=paste("XYZmic/",file,".txt",sep=""))
remove(img,red,green,blue)
gc(verbose=FALSE)
},silent=TRUE)
if(inherits(test,"try-error"))cat(paste0(file,": ",attr(test,"condition"),"\n"))
else(cat(paste0(file," OK\n")))
}
#' Split RGB images into channels and pixel size information
#'
#' @param path Path to root folder
#' @param channels Vector of channels in images
#' @param rgb.folder Folder with RGB images
#' @param normalize boolean. Should we try to do normalization
#' @param cores Number of cores used in parallel, cores=1 implies no parallelization
#' @return Nothing, folders red, green, blue and XYZmic include separate channels and pixel size information
#' @export
#' @import bioimagetools
#' @examples splitchannels.folder("./")
#'
splitchannels.folder<-function(path,channels=c("red","green","blue"),rgb.folder="rgb",normalize=FALSE, cores=1)
{
orig<-getwd()
setwd(path)
if(cores>1)
{
options("mc.cores"=cores)
}
files<-list.files(rgb.folder)
cat(paste(length(files),"files.\n"))
if (length(files)==0){cat("Nothing to do.\n");return()}
if(length(list.files("red"))==0)dir.create("red")
if(length(list.files("blue"))==0)dir.create("blue")
# if(length(list.files("blueorig"))==0)dir.create("blueorig")
if(length(list.files("green"))==0)dir.create("green")
if(length(list.files("XYZmic"))==0)dir.create("XYZmic")
if(cores>1)jobs <- parallel::mclapply(files,splitchannels.file,channels,rgb.folder,normalize)
if(cores==1)jobs <- lapply(files,splitchannels.file,channels,rgb.folder,normalize)
setwd(orig)
}
#' Split RGB images into channels and pixel size information
#'
#' These functions are provided for compatibility with older version of
#' the nucim package. They may eventually be completely
#' removed.
#' @param ... parameters for splitchannels.folder
#' @return Nothing, folders red, green, blue and XYZmic include separate channels and pixel size information
#' @export
#'
splitchannels<-function(...){
.Deprecated("splitchannels.folder",package="nucim")
splitchannels.folder(...)
}