use of ij.ImagePlus in project GDSC-SMLM by aherbert.
the class PSFDrift method createImageList.
public static List<String> createImageList() {
List<String> titles = new LinkedList<String>();
int[] ids = WindowManager.getIDList();
if (ids != null) {
for (int id : ids) {
ImagePlus imp = WindowManager.getImage(id);
if (imp != null) {
// Image must be greyscale
if (imp.getType() == ImagePlus.GRAY8 || imp.getType() == ImagePlus.GRAY16 || imp.getType() == ImagePlus.GRAY32) {
// Image must be square and a stack of a single channel
if (imp.getWidth() == imp.getHeight() && imp.getNChannels() == 1) {
// Check if these are PSF images created by the SMLM plugins
PSFSettings psfSettings = getPSFSettings(imp);
if (psfSettings != null) {
if (psfSettings.zCentre <= 0) {
Utils.log(TITLE + ": Unknown PSF z-centre setting for image: " + imp.getTitle());
continue;
}
if (psfSettings.nmPerPixel <= 0) {
Utils.log(TITLE + ": Unknown PSF nm/pixel setting for image: " + imp.getTitle());
continue;
}
if (psfSettings.nmPerSlice <= 0) {
Utils.log(TITLE + ": Unknown PSF nm/slice setting for image: " + imp.getTitle());
continue;
}
if (psfSettings.fwhm <= 0) {
Utils.log(TITLE + ": Unknown PSF FWHM setting for image: " + imp.getTitle());
continue;
}
titles.add(imp.getTitle());
}
}
}
}
}
}
return titles;
}
use of ij.ImagePlus in project GDSC-SMLM by aherbert.
the class PSFCombiner method createImageList.
public static List<String> createImageList() {
List<String> titles = new LinkedList<String>();
int[] ids = WindowManager.getIDList();
if (ids != null) {
for (int id : ids) {
ImagePlus imp = WindowManager.getImage(id);
if (imp != null) {
// Image must be greyscale
if (imp.getType() == ImagePlus.GRAY8 || imp.getType() == ImagePlus.GRAY16 || imp.getType() == ImagePlus.GRAY32) {
// Image must be square and a stack of a single channel
if (imp.getWidth() == imp.getHeight() && imp.getNChannels() == 1) {
// Check if these are PSF images created by the SMLM plugins
if (containsPSF(imp))
titles.add(imp.getTitle());
}
}
}
}
}
return titles;
}
use of ij.ImagePlus in project GDSC-SMLM by aherbert.
the class ResultsImageSampler method getSample.
/**
* Gets the sample image. The image is a stack of the samples with an overlay of the localisation positions. The
* info property is set with details of the localisations and the image is calibrated.
*
* @param nNo
* the number of samples with no localisations
* @param nLow
* the number of samples with low localisations
* @param nHigh
* the number of samples with high localisations
* @return the sample image (could be null if no samples were made)
*/
public ImagePlus getSample(int nNo, int nLow, int nHigh) {
ImageStack out = new ImageStack(size, size);
if (!isValid())
return null;
list.clearf();
// empty
for (int i : Random.sample(nNo, no.length, r)) list.add(ResultsSample.createEmpty(no[i]));
// low
for (int i : Random.sample(nLow, lower, r)) list.add(data[i]);
// high
for (int i : Random.sample(nHigh, upper, r)) list.add(data[i + lower]);
if (list.isEmpty())
return null;
double nmPerPixel = 1;
if (results.getCalibration() != null) {
Calibration calibration = results.getCalibration();
if (calibration.hasNmPerPixel()) {
nmPerPixel = calibration.getNmPerPixel();
}
}
// Sort descending by number in the frame
ResultsSample[] sample = list.toArray(new ResultsSample[list.size()]);
Arrays.sort(sample, rcc);
int[] xyz = new int[3];
Rectangle stackBounds = new Rectangle(stack.getWidth(), stack.getHeight());
Overlay overlay = new Overlay();
float[] ox = new float[10], oy = new float[10];
StringBuilder sb = new StringBuilder();
if (nmPerPixel == 1)
sb.append("Sample X Y Z Signal\n");
else
sb.append("Sample X(nm) Y(nm) Z(nm) Signal\n");
for (ResultsSample s : sample) {
getXYZ(s.index, xyz);
// Construct the region to extract
Rectangle target = new Rectangle(xyz[0], xyz[1], size, size);
target = target.intersection(stackBounds);
if (target.width == 0 || target.height == 0)
continue;
// Extract the frame
int slice = xyz[2];
ImageProcessor ip = stack.getProcessor(slice);
// Cut out the desired pixels (some may be blank if the block overruns the source image)
ImageProcessor ip2 = ip.createProcessor(size, size);
for (int y = 0; y < target.height; y++) for (int x = 0, i = y * size, index = (y + target.y) * ip.getWidth() + target.x; x < target.width; x++, i++, index++) {
ip2.setf(i, ip.getf(index));
}
int size = s.size();
if (size > 0) {
int position = out.getSize() + 1;
// Create an ROI with the localisations
for (int i = 0; i < size; i++) {
PeakResult p = s.list.get(i);
ox[i] = p.getXPosition() - xyz[0];
oy[i] = p.getYPosition() - xyz[1];
sb.append(position).append(' ');
sb.append(Utils.rounded(ox[i] * nmPerPixel)).append(' ');
sb.append(Utils.rounded(oy[i] * nmPerPixel)).append(' ');
// Z can be stored in the error field
sb.append(Utils.rounded(p.error * nmPerPixel)).append(' ');
sb.append(Utils.rounded(p.getSignal())).append('\n');
}
PointRoi roi = new PointRoi(ox, oy, size);
roi.setPosition(position);
overlay.add(roi);
}
out.addSlice(String.format("Frame=%d @ %d,%d px (n=%d)", slice, xyz[0], xyz[1], size), ip2.getPixels());
}
if (out.getSize() == 0)
return null;
ImagePlus imp = new ImagePlus("Sample", out);
imp.setOverlay(overlay);
// Note: Only the info property can be saved to a TIFF file
imp.setProperty("Info", sb.toString());
if (nmPerPixel != 1) {
ij.measure.Calibration cal = new ij.measure.Calibration();
cal.setUnit("nm");
cal.pixelHeight = cal.pixelWidth = nmPerPixel;
imp.setCalibration(cal);
}
return imp;
}
use of ij.ImagePlus in project GDSC-SMLM by aherbert.
the class PCPALMMolecules method getRunMode.
private boolean getRunMode(boolean resultsAvailable) {
ExtendedGenericDialog gd = new ExtendedGenericDialog(TITLE);
gd.addHelp(About.HELP_URL);
// Build a list of all images with a region ROI
List<String> titles = new LinkedList<String>();
if (WindowManager.getWindowCount() > 0) {
for (int imageID : WindowManager.getIDList()) {
ImagePlus imp = WindowManager.getImage(imageID);
if (imp != null && imp.getRoi() != null && imp.getRoi().isArea())
titles.add(imp.getTitle());
}
}
if (!resultsAvailable) {
runMode = 3;
gd.addMessage("Simulate molecules for cluster analysis.\nComputes a binary image from localisation data");
gd.addNumericField("Molecules", nMolecules, 0);
gd.addNumericField("Simulation_size (um)", simulationSize, 2);
gd.addNumericField("Blinking_rate", blinkingRate, 2);
gd.addChoice("Blinking_distribution", BLINKING_DISTRIBUTION, BLINKING_DISTRIBUTION[blinkingDistribution]);
gd.addNumericField("Average_precision (nm)", sigmaS, 2);
gd.addCheckbox("Show_histograms", showHistograms);
gd.addCheckbox("Distance_analysis", distanceAnalysis);
gd.addChoice("Cluster_simulation", CLUSTER_SIMULATION, CLUSTER_SIMULATION[clusterSimulation]);
gd.addNumericField("Cluster_number", clusterNumber, 2);
gd.addNumericField("Cluster_variation (SD)", clusterNumberSD, 2);
gd.addNumericField("Cluster_radius", clusterRadius, 2);
gd.addCheckbox("Show_cluster_mask", showClusterMask);
Recorder.recordOption("Run_mode", RUN_MODE[runMode]);
} else {
gd.addMessage("Prepare molecules for cluster analysis.\nComputes a binary image from raw localisation data");
ResultsManager.addInput(gd, inputOption, InputSource.MEMORY);
if (!titles.isEmpty())
gd.addCheckbox((titles.size() == 1) ? "Use_ROI" : "Choose_ROI", chooseRoi);
gd.addChoice("Run_mode", RUN_MODE, RUN_MODE[runMode]);
}
gd.addMessage("Select options for low resolution image:");
gd.addSlider("Image_size (px)", 512, 2048, lowResolutionImageSize);
gd.addSlider("ROI_size (um)", 1.5, 4, roiSizeInUm);
gd.addMessage("Select options for high resolution image:");
gd.addCheckbox("Show_high_res_image", showHighResolutionImage);
gd.addSlider("nm_per_pixel_limit", 0, 20, nmPerPixelLimit);
gd.addMessage("Optionally remove all analysis results from memory");
gd.addCheckbox("Clear_results", clearResults);
gd.showDialog();
if (gd.wasCanceled())
return false;
if (!resultsAvailable) {
nMolecules = (int) Math.abs(gd.getNextNumber());
simulationSize = Math.abs(gd.getNextNumber());
blinkingRate = Math.abs(gd.getNextNumber());
blinkingDistribution = gd.getNextChoiceIndex();
sigmaS = Math.abs(gd.getNextNumber());
showHistograms = gd.getNextBoolean();
distanceAnalysis = gd.getNextBoolean();
clusterSimulation = gd.getNextChoiceIndex();
clusterNumber = Math.abs(gd.getNextNumber());
clusterNumberSD = Math.abs(gd.getNextNumber());
clusterRadius = Math.abs(gd.getNextNumber());
showClusterMask = gd.getNextBoolean();
} else {
inputOption = ResultsManager.getInputSource(gd);
if (!titles.isEmpty())
chooseRoi = gd.getNextBoolean();
runMode = gd.getNextChoiceIndex();
}
lowResolutionImageSize = (int) gd.getNextNumber();
roiSizeInUm = gd.getNextNumber();
showHighResolutionImage = gd.getNextBoolean();
nmPerPixelLimit = Math.abs(gd.getNextNumber());
clearResults = gd.getNextBoolean();
// Check arguments
try {
if (!resultsAvailable) {
Parameters.isAboveZero("Molecules", nMolecules);
Parameters.isAboveZero("Simulation size", simulationSize);
Parameters.isEqualOrAbove("Blinking rate", blinkingRate, 1);
Parameters.isEqualOrAbove("Cluster number", clusterNumber, 1);
}
Parameters.isAbove("Image scale", lowResolutionImageSize, 1);
Parameters.isAboveZero("ROI size", roiSizeInUm);
} catch (IllegalArgumentException ex) {
IJ.error(TITLE, ex.getMessage());
return false;
}
if (!titles.isEmpty() && chooseRoi && resultsAvailable) {
if (titles.size() == 1) {
roiImage = titles.get(0);
Recorder.recordOption("Image", roiImage);
} else {
String[] items = titles.toArray(new String[titles.size()]);
gd = new ExtendedGenericDialog(TITLE);
gd.addMessage("Select the source image for the ROI");
gd.addChoice("Image", items, roiImage);
gd.showDialog();
if (gd.wasCanceled())
return false;
roiImage = gd.getNextChoice();
}
ImagePlus imp = WindowManager.getImage(roiImage);
roiBounds = imp.getRoi().getBounds();
roiImageWidth = imp.getWidth();
roiImageHeight = imp.getHeight();
} else {
roiBounds = null;
}
if (!resultsAvailable) {
if (!getPValue())
return false;
}
if (clearResults) {
PCPALMAnalysis.results.clear();
PCPALMFitting.previous_gr = null;
}
return true;
}
use of ij.ImagePlus in project GDSC-SMLM by aherbert.
the class PCPALMMolecules method displayImage.
static ImagePlus displayImage(String title, ImageProcessor ip, double nmPerPixel) {
ImagePlus imp = Utils.display(title, ip);
Calibration cal = new Calibration();
cal.setUnit("um");
cal.pixelWidth = cal.pixelHeight = nmPerPixel / 1000;
imp.setCalibration(cal);
return imp;
}
Aggregations