use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.
the class ROIMultiPaintManager method mergeResolvedSelections.
private void mergeResolvedSelections(final RegionInfo[] selectedRegionInfos) throws Exception {
if (selectedRegionInfos == null || selectedRegionInfos.length == 0) {
return;
}
// final String UNUSED_ROI_PIXVAL = "UNUSED_ROI_INDEX";
// final String MULTI_NEIGHBOR_MERGE = "MultiNeighborMerge";
AsynchClientTask mergeTask = new AsynchClientTask("Merging " + selectedRegionInfos.length + " regions...", AsynchClientTask.TASKTYPE_NONSWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
// make new RegionImage with all selections converted to a single temporary ROI
//
// if(isROINameUsed(overlayEditorPanelJAI.getAllCompositeROINamesAndColors(), MULTI_NEIGHBOR_MERGE)){
// throw new Exception(MULTI_NEIGHBOR_MERGE+" exists, they must be reconciled before any new merge");
// }
// sort selected region index for fast lookup
TreeSet<Integer> selectedRegionIndexesTS = new TreeSet<Integer>();
for (int i = 0; i < selectedRegionInfos.length; i++) {
selectedRegionIndexesTS.add(selectedRegionInfos[i].getRegionIndex());
}
// //find unused index we can use for temporary ROI
// BitSet usedROIIndexes = new BitSet();
// for (int i = 0; i < roiComposite.length; i++) {
// byte[] sliceBytes = ((DataBufferByte)roiComposite[i].getRaster().getDataBuffer()).getData();
// for (int j = 0; j < sliceBytes.length; j++) {
// usedROIIndexes.set((int)(sliceBytes[j]&0x000000FF));
// }
// }
int unusedROIPixelValue = getUnusedROIColorIndex(overlayEditorPanelJAI.getAllCompositeROINamesAndColors(), null);
// if(usedROIIndexes.get(unusedROIPixelValue)){
// throw new Exception("Error: Found unused color index but that ROI pixel value exists");
// }
// find image indexes of selected regions and fill new ROIImage with temporary ROI Index
byte[] shortEncodedRegionIndexArr = regionImage.getShortEncodedRegionIndexImage();
BufferedImage[] tempROI = new BufferedImage[roiComposite.length];
int count = 0;
for (int i = 0; i < tempROI.length; i++) {
byte[] roiBytes = ((DataBufferByte) roiComposite[i].getRaster().getDataBuffer()).getData();
tempROI[i] = new BufferedImage(roiComposite[i].getWidth(), roiComposite[i].getHeight(), BufferedImage.TYPE_BYTE_INDEXED, getContrastIndexColorModel());
byte[] sliceBytes = ((DataBufferByte) tempROI[i].getRaster().getDataBuffer()).getData();
System.arraycopy(roiBytes, 0, sliceBytes, 0, roiBytes.length);
for (int j = 0; j < sliceBytes.length; j++) {
int regionIndex = (int) ((0x000000ff & shortEncodedRegionIndexArr[2 * count]) | ((0x000000ff & shortEncodedRegionIndexArr[2 * count + 1]) << 8));
if (selectedRegionIndexesTS.contains(regionIndex)) {
sliceBytes[j] = (byte) unusedROIPixelValue;
}
count++;
}
}
if (getClientTaskStatusSupport() != null) {
getClientTaskStatusSupport().setProgress(10);
}
// release memory
shortEncodedRegionIndexArr = null;
// get new regionImage and new selectedRegionInfos
VCImage tempImage = ROIMultiPaintManager.createVCImageFromBufferedImages(ROIMultiPaintManager.DEFAULT_EXTENT, tempROI);
RegionImage tempRegionImage = new RegionImage(tempImage, 0, /*0 means generate no surfacecollection*/
tempImage.getExtent(), ROIMultiPaintManager.DEFAULT_ORIGIN, RegionImage.NO_SMOOTHING, null);
// release memory
tempImage = null;
RegionInfo[] tempRegionInfos = tempRegionImage.getRegionInfos();
if (tempRegionInfos.length == 1) {
throw new Exception("No unselected neighbors to merge with.");
}
if (getClientTaskStatusSupport() != null) {
getClientTaskStatusSupport().setProgress(20);
}
Vector<RegionImage.RegionInfo> tempSelectedRegionInfos = new Vector<RegionImage.RegionInfo>();
HighlightROIInfo highlightROIInfo = generateHighlightROIInfo((byte) -1, tempROI, tempRegionImage, RegionAction.createCheckNeighborsOnlyRegionAction(tempRegionInfos), null);
boolean bHasSelectionWithMoreThanOneNeighbor = false;
for (int i = 0; i < tempRegionInfos.length; i++) {
if (tempRegionInfos[i].getPixelValue() == unusedROIPixelValue) {
tempSelectedRegionInfos.add(tempRegionInfos[i]);
// if (highlightROIInfo.neighborsForRegionsMap.get(tempRegionInfos[i]).size() > 1) {
// hashTable.put(UNUSED_ROI_PIXVAL, new Integer(unusedROIPixelValue));
// bHasSelectionWithMoreThanOneNeighbor = true;
// } else {
// tempSelectedRegionInfos.add(tempRegionInfos[i]);
// }
}
}
if (getClientTaskStatusSupport() != null) {
getClientTaskStatusSupport().setProgress(50);
}
// final merge
updateUndo(UNDO_INIT.ALLZ);
generateHighlightROIInfo((byte) unusedROIPixelValue, tempROI, tempRegionImage, RegionAction.createMergeSelectedWithNeighborsRegionAction(tempRegionInfos, tempSelectedRegionInfos, highlightROIInfo.neighborsForRegionsMap), null);
// copy merged bytes back to ROI
for (int i = 0; i < tempROI.length; i++) {
byte[] roiBytes = ((DataBufferByte) roiComposite[i].getRaster().getDataBuffer()).getData();
byte[] sliceBytes = ((DataBufferByte) tempROI[i].getRaster().getDataBuffer()).getData();
// for (int j = 0; j < sliceBytes.length; j++) {
// if(sliceBytes[j] == (byte)unusedROIPixelValue){
// System.out.println("Bad");
// }
// }
System.arraycopy(sliceBytes, 0, roiBytes, 0, roiBytes.length);
}
if (getClientTaskStatusSupport() != null) {
getClientTaskStatusSupport().setProgress(90);
}
}
};
AsynchClientTask updateGUITask = new AsynchClientTask("Updating display...", AsynchClientTask.TASKTYPE_SWING_BLOCKING) {
@Override
public void run(Hashtable<String, Object> hashTable) throws Exception {
// Integer unusedROIIndex = (Integer)hashTable.get(UNUSED_ROI_PIXVAL);
// if(unusedROIIndex != null){
// overlayEditorPanelJAI.addROIName(MULTI_NEIGHBOR_MERGE, true, MULTI_NEIGHBOR_MERGE,true,/*true,true,*/OverlayEditorPanelJAI.CONTRAST_COLORS[unusedROIIndex]);
// }
overlayEditorPanelJAI.setHighliteInfo(null, OverlayEditorPanelJAI.FRAP_DATA_RESOLVEDMERGE_PROPERTY);
updateUndoAfterPrivate(true, false);
}
};
Vector<AsynchClientTask> asynchClientTaskV = new Vector<AsynchClientTask>();
asynchClientTaskV.add(mergeTask);
asynchClientTaskV.add(updateGUITask);
asynchClientTaskV.addAll(Arrays.asList(getRefreshObjectsTasks()));
ClientTaskDispatcher.dispatch(overlayEditorPanelJAI, new Hashtable<String, Object>(), asynchClientTaskV.toArray(new AsynchClientTask[0]), true, false, null, true);
}
use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.
the class RunRefSimulationFastOp method saveROIsAsExternalData.
private void saveROIsAsExternalData(ROI[] rois, LocalWorkspace localWorkspace, ExternalDataIdentifier newROIExtDataID) throws ObjectNotFoundException, ImageException, IOException {
ISize isize = rois[0].getISize();
Origin origin = rois[0].getRoiImages()[0].getOrigin();
Extent extent = rois[0].getRoiImages()[0].getExtent();
VCImage vcImage = new VCImageUncompressed(null, new byte[isize.getXYZ()], extent, isize.getX(), isize.getY(), isize.getZ());
RegionImage regionImage = new RegionImage(vcImage, 0, null, null, RegionImage.NO_SMOOTHING);
CartesianMesh cartesianMesh = CartesianMesh.createSimpleCartesianMesh(origin, extent, isize, regionImage);
int NumTimePoints = 1;
int NumChannels = rois.length;
// dimensions: time points, channels, whole image ordered by z slices.
double[][][] pixData = new double[NumTimePoints][NumChannels][];
int index = 0;
for (ROI roi : rois) {
pixData[0][index++] = createDoubleArray(roi.getBinaryPixelsXYZ(1));
}
// Origin origin = new Origin(0,0,0);
FieldDataFileOperationSpec fdos = new FieldDataFileOperationSpec();
fdos.opType = FieldDataFileOperationSpec.FDOS_ADD;
fdos.cartesianMesh = cartesianMesh;
fdos.doubleSpecData = pixData;
fdos.specEDI = newROIExtDataID;
ArrayList<String> varNames = new ArrayList<String>();
ArrayList<VariableType> varTypes = new ArrayList<VariableType>();
for (ROI roi : rois) {
varNames.add(ROI_MASK_NAME_PREFIX + roi.getROIName());
varTypes.add(VariableType.VOLUME);
}
fdos.varNames = varNames.toArray(new String[0]);
fdos.owner = LocalWorkspace.getDefaultOwner();
fdos.times = new double[] { 0.0 };
fdos.variableTypes = varTypes.toArray(new VariableType[0]);
fdos.origin = origin;
fdos.extent = extent;
fdos.isize = isize;
localWorkspace.getDataSetControllerImpl().fieldDataFileOperation(fdos);
}
use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.
the class RunRefSimulationFastOp method savePsfAsExternalData.
private void savePsfAsExternalData(UShortImage psf, String varName, ExternalDataIdentifier newPsfExtDataID, LocalWorkspace localWorkspace) throws IOException, ImageException, ObjectNotFoundException {
Origin origin = new Origin(0, 0, 0);
Extent ext = new Extent(1, 1, 1);
ISize isize = new ISize(3, 3, 1);
VCImageUncompressed vcImage = new VCImageUncompressed(null, new byte[isize.getXYZ()], ext, isize.getX(), isize.getY(), isize.getZ());
RegionImage regionImage = new RegionImage(vcImage, 0, null, null, RegionImage.NO_SMOOTHING);
CartesianMesh cartesianMesh = CartesianMesh.createSimpleCartesianMesh(origin, ext, isize, regionImage);
int NumTimePoints = 1;
// 8 rois integrated into 1 image
int NumChannels = 1;
short[][][] pixData = new short[NumTimePoints][NumChannels][1];
pixData[0][0] = psf.getPixels();
FieldDataFileOperationSpec fdos = new FieldDataFileOperationSpec();
fdos.opType = FieldDataFileOperationSpec.FDOS_ADD;
fdos.cartesianMesh = cartesianMesh;
fdos.shortSpecData = pixData;
fdos.specEDI = newPsfExtDataID;
fdos.varNames = new String[] { varName };
fdos.owner = LocalWorkspace.getDefaultOwner();
fdos.times = new double[] { 0.0 };
fdos.variableTypes = new VariableType[] { VariableType.VOLUME };
fdos.origin = origin;
fdos.extent = ext;
fdos.isize = isize;
localWorkspace.getDataSetControllerImpl().fieldDataFileOperation(fdos);
}
use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.
the class RunRefSimulationOp method saveExternalData.
private static void saveExternalData(Image image, String varName, ExternalDataIdentifier newROIExtDataID, LocalWorkspace localWorkspace) throws ObjectNotFoundException, ImageException, IOException {
Extent extent = image.getExtent();
Origin origin = image.getOrigin();
ISize isize = image.getISize();
VCImage vcImage = new VCImageUncompressed(null, new byte[isize.getXYZ()], extent, isize.getX(), isize.getY(), isize.getZ());
RegionImage regionImage = new RegionImage(vcImage, 0, null, null, RegionImage.NO_SMOOTHING);
CartesianMesh simpleCartesianMesh = CartesianMesh.createSimpleCartesianMesh(origin, extent, isize, regionImage);
int NumTimePoints = 1;
int NumChannels = 1;
// dimensions: time points, channels, whole image ordered by z slices.
double[][][] pixData = new double[NumTimePoints][NumChannels][];
pixData[0][0] = image.getDoublePixels();
FieldDataFileOperationSpec fdos = new FieldDataFileOperationSpec();
fdos.opType = FieldDataFileOperationSpec.FDOS_ADD;
fdos.cartesianMesh = simpleCartesianMesh;
fdos.doubleSpecData = pixData;
fdos.specEDI = newROIExtDataID;
fdos.varNames = new String[] { varName };
fdos.owner = LocalWorkspace.getDefaultOwner();
fdos.times = new double[] { 0.0 };
fdos.variableTypes = new VariableType[] { VariableType.VOLUME };
fdos.origin = origin;
fdos.extent = extent;
fdos.isize = isize;
localWorkspace.getDataSetControllerImpl().fieldDataFileOperation(fdos);
}
use of cbit.vcell.geometry.RegionImage in project vcell by virtualcell.
the class DisplayImageOp method displayImage.
public void displayImage(final Image image, String title, WindowListener listener) {
final ImagePlaneManagerPanel imagePanel = new ImagePlaneManagerPanel();
double[] doublePixels = image.getDoublePixels();
double minPixel = Double.MAX_VALUE;
double maxPixel = -Double.MAX_VALUE;
for (int i = 0; i < doublePixels.length; i++) {
double pixel = doublePixels[i];
doublePixels[i] = pixel;
minPixel = Math.min(minPixel, pixel);
maxPixel = Math.max(maxPixel, pixel);
}
Range newRange = new Range(minPixel, maxPixel);
SourceDataInfo source = new SourceDataInfo(SourceDataInfo.RAW_VALUE_TYPE, doublePixels, image.getExtent(), image.getOrigin(), newRange, 0, image.getNumX(), 1, image.getNumY(), image.getNumX(), image.getNumZ(), image.getNumX() * image.getNumY());
imagePanel.setDisplayAdapterServicePanelVisible(true);
imagePanel.setCurveValueProvider(new CurveValueProvider() {
@Override
public void curveAdded(Curve curve) {
System.out.println("called curveAdded(" + curve + "), do nothing for now");
}
@Override
public void curveRemoved(Curve curve) {
System.out.println("called curveRemoved(" + curve + ")");
}
@Override
public String getCurveValue(CurveSelectionInfo csi) {
System.out.println("called getCurveValue(CurveSelectionInfo " + csi);
return null;
}
@Override
public CurveSelectionInfo getInitalCurveSelection(int tool, Coordinate wc) {
System.out.println("called getInitialCurveSelection(tool=" + tool + ", coord=" + wc + ")");
return null;
}
@Override
public boolean isAddControlPointOK(int tool, Coordinate wc, Curve addedToThisCurve) {
System.out.println("called isAddControlPointOK");
return true;
}
@Override
public boolean providesInitalCurve(int tool, Coordinate wc) {
System.out.println("called providesInitialCurve(tool=" + tool + " (TOOL_LINE=" + CurveEditorTool.TOOL_LINE + "), coord=" + wc);
return false;
}
@Override
public void setDescription(Curve curve) {
System.out.println("called setDescription(" + curve + ")");
curve.setDescription(CurveValueProvider.DESCRIPTION_VOLUME);
}
@Override
public CurveSelectionInfo findChomboCurveSelectionInfoForPoint(CoordinateIndex ci) {
System.out.println("called find ChomboCurveSelectionInfoForPoint(coord=" + ci + ")");
return null;
}
});
DisplayAdapterService das = imagePanel.getDisplayAdapterServicePanel().getDisplayAdapterService();
das.setValueDomain(null);
das.addColorModelForValues(DisplayAdapterService.createGrayColorModel(), DisplayAdapterService.createGraySpecialColors(), DisplayAdapterService.GRAY);
das.addColorModelForValues(DisplayAdapterService.createBlueRedColorModel(), DisplayAdapterService.createBlueRedSpecialColors(), DisplayAdapterService.BLUERED);
das.setActiveColorModelID(DisplayAdapterService.BLUERED);
final JFrame jframe = new JFrame();
jframe.setTitle(title);
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints imageConstraints = new GridBagConstraints();
imageConstraints.gridx = 0;
imageConstraints.gridy = 0;
imageConstraints.weightx = 1.0;
imageConstraints.weighty = 1.0;
imageConstraints.fill = GridBagConstraints.BOTH;
panel.add(imagePanel, imageConstraints);
JButton plotButton = new JButton("plot");
plotButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Curve curve = imagePanel.getCurveRenderer().getSelection().getCurve();
VariableType variableType = VariableType.VOLUME;
Curve samplerCurve = curve.getSampledCurve();
samplerCurve.setDescription(curve.getDescription());
VCImage vcImage = new VCImageUncompressed(null, new byte[image.getISize().getXYZ()], image.getExtent(), image.getISize().getX(), image.getISize().getY(), image.getISize().getZ());
int dimension = 1 + (image.getISize().getY() > 0 ? 1 : 0) + (image.getISize().getZ() > 0 ? 1 : 0);
RegionImage regionImage = new RegionImage(vcImage, dimension, image.getExtent(), image.getOrigin(), RegionImage.NO_SMOOTHING);
CartesianMesh mesh = CartesianMesh.createSimpleCartesianMesh(image.getOrigin(), image.getExtent(), image.getISize(), regionImage);
SpatialSelectionVolume ssVolume = new SpatialSelectionVolume(new CurveSelectionInfo(samplerCurve), variableType, mesh);
String varName = "var";
SymbolTableEntry[] symbolTableEntries = new SymbolTableEntry[] { new VolVariable(varName, null) };
PlotData plotData = getLineScan(ssVolume, image, mesh);
PlotPane plotPane = new PlotPane();
DataSymbolMetadataResolver resolver = null;
Plot2D plot2D = new Plot2D(symbolTableEntries, resolver, new String[] { varName }, new PlotData[] { plotData }, new String[] { "Values along curve", "Distance (\u00b5m)", "[" + varName + "]" });
plotPane.setPlot2D(plot2D);
DialogUtils.showComponentCloseDialog(jframe, plotPane, "plot");
} catch (ImageException | IOException | DataAccessException | MathException e1) {
e1.printStackTrace();
}
}
});
GridBagConstraints plotButtonConstraints = new GridBagConstraints();
plotButtonConstraints.gridx = 0;
plotButtonConstraints.gridy = 1;
panel.add(plotButton, plotButtonConstraints);
jframe.getContentPane().add(panel);
jframe.setSize(500, 500);
jframe.addWindowListener(listener);
jframe.setVisible(true);
imagePanel.setSourceDataInfo(source);
}
Aggregations