-
Notifications
You must be signed in to change notification settings - Fork 0
/
Combine_Amira_Tifs.bsh
116 lines (98 loc) · 5 KB
/
Combine_Amira_Tifs.bsh
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
import fiji.util.gui.GenericDialogPlus;
import ij.IJ;
import ij.ImagePlus;
import ij.Prefs;
import ij.io.FileSaver;
import ij.plugin.ImageCalculator;
import ij.process.ImageProcessor;
import java.io.File;
import java.util.regex.Pattern;
import ij.process.StackStatistics;
// Retrieve previous input and output directories from preferences
String prevInputDirectory = Prefs.get("Combine_Amira_Tifs.inputDirectory", IJ.getDirectory("current"));
String prevOutputDirectory = Prefs.get("Combine_Amira_Tifs.outputDirectory", IJ.getDirectory("current"));
String prevFilePattern = Prefs.get("Combine_Amira_Tifs.filePattern", "crop\\d+_labels_\\d+\\_.*\\.tif");
// Create a GenericDialogPlus for user input
GenericDialogPlus gd = new GenericDialogPlus("Input and Output Directories");
gd.addDirectoryField("Input Directory: ", prevInputDirectory, 70);
gd.addDirectoryField("Output Directory: ", prevOutputDirectory, 70);
gd.addStringField("File Pattern: ", prevFilePattern, 35);
gd.showDialog();
if (gd.wasCanceled()) {
IJ.log("User canceled the operation");
} else {
// Get user input for input and output directories
String inputDirectory = gd.getNextString();
String outputDirectory = gd.getNextString();
String filePattern = gd.getNextString();
// Use File.openDialog to allow users to select directories if needed
if (inputDirectory.equals("")) {
inputDirectory = IJ.getDirectory("Select Input Directory: ");
}
if (outputDirectory.equals("")) {
outputDirectory = IJ.getDirectory("Select Output Directory: ");
}
// Save the current input and output directories to preferences
Prefs.set("Combine_Amira_Tifs.inputDirectory", inputDirectory);
Prefs.set("Combine_Amira_Tifs.outputDirectory", outputDirectory);
Prefs.set("Combine_Amira_Tifs.filePattern", filePattern);
// Append a trailing slash if necessary and ensure compatibility with different operating systems
inputDirectory = inputDirectory.endsWith(File.separator) ? inputDirectory : inputDirectory + File.separator;
outputDirectory = outputDirectory.endsWith(File.separator) ? outputDirectory : outputDirectory + File.separator;
// Define the output image
ImagePlus output = null;
// Get the list of files in the input directory
File[] files = new File(inputDirectory).listFiles();
Arrays.sort(files);
if (files != null && files.length > 0) {
// Compile the regex pattern
Pattern pattern = Pattern.compile(filePattern);
// Calculate the total number of valid files
int totalValidFiles = 0;
for (File file : files) {
if (pattern.matcher(file.getName()).matches()) {
totalValidFiles++;
}
}
int processedFiles = 0;
for (File file : files) {
// Check if the file name matches the regex pattern
if (pattern.matcher(file.getName()).matches()) {
// Log the progress
IJ.log("Processing file " + processedFiles + " of " + totalValidFiles + ": " + file.getName());
// Load image
ImagePlus currentImage = IJ.openImage(file.getAbsolutePath());
IJ.run(currentImage, "16-bit", "");
if (output == null) {
// Initialize output with the first image
output = currentImage.duplicate();
} else {
// Duplicate the current image
ImagePlus binarizedImage = currentImage.duplicate();
IJ.setRawThreshold(binarizedImage, 0, 0); //sets background 0, foreground 255
IJ.run(binarizedImage, "Convert to Mask", "background=Light black");
IJ.run(binarizedImage, "Invert", "stack"); //now 255 are labeled regions
IJ.run(binarizedImage, "Divide...", "value=" + 255 + " stack");
IJ.run(binarizedImage, "16-bit", "");
statistics = new ij.process.StackStatistics(output);
IJ.run(currentImage, "Add...", "value=" + statistics.max + " stack");
// Multiply the currentImage by the binarizedImage
ImagePlus multipliedImage = ImageCalculator.run(binarizedImage, currentImage, "Multiply create stack");
// Add the multiplied image to the output
output = ImageCalculator.run(output, multipliedImage, "Add create stack");
}
processedFiles++;
}
}
if (output != null) {
// Write the output image
String outputFile = outputDirectory + "combined_labels.tif";
new FileSaver(output).saveAsTiff(outputFile);
IJ.log("Operation completed. Output saved to: " + outputFile);
} else {
IJ.log("No files matching the pattern found in the input directory.");
}
} else {
IJ.log("No files found in the input directory.");
}
}