/** * Generates a zero crossing mask for a 2D function. Sets a ModelImage to 255 if a zero crossing * is detected. * * @param slice the slice of the volume which we are working on (0 if from 2D image) * @param buffer array in which to find zero crossing * @param detectionType the type of zero crossing detection to perform */ public void genZeroXMask(int slice, float[] buffer, int detectionType) { float x0, x1, x2, x3; int i0, i1, i2, i3; int i, j; int indexY; int length; int xDim = srcImage.getExtents()[0]; int yDim = srcImage.getExtents()[1]; length = xDim * yDim; int xxDim = xDim - 1; int yyDim = yDim - 1; float level = 0; int offset = slice * length; for (j = 0; j < yyDim; j++) { indexY = j * xDim; for (i = 0; i < xxDim; i++) { i0 = indexY + i; if (detectionType == MARCHING_SQUARES) { i1 = i0 + 1; i2 = i0 + xDim; i3 = i0 + 1 + xDim; x0 = buffer[i0]; x1 = buffer[i1]; x2 = buffer[i2]; x3 = buffer[i3]; if ((x0 >= level) && (x1 >= level) && (x2 >= level) && (x3 >= level)) { // case 0 - no edge } else if ((x0 >= level) && (x1 >= level) && (x2 < level) && (x3 >= level)) { // case 1 - edge in the lower left zXMask.set(offset + i2, 255); } else if ((x0 >= level) && (x1 >= level) && (x2 >= level) && (x3 < level)) { // case 2 - edge in the lower right zXMask.set(offset + i3, 255); } else if ((x0 >= level) && (x1 >= level) && (x2 < level) && (x3 < level)) { // case 3 - edge horizontally zXMask.set(offset + i2, 255); zXMask.set(offset + i3, 255); } else if ((x0 >= level) && (x1 < level) && (x2 >= level) && (x3 >= level)) { // case 4 - edge in the upper right zXMask.set(offset + i1, 255); } else if ((x0 >= level) && (x1 < level) && (x2 < level) && (x3 >= level)) { // case 5 - ambiguous case; either edge in upper right and lower left or // edge that goes from the upper right to the lower left zXMask.set(offset + i1, 255); zXMask.set(offset + i2, 255); } else if ((x0 >= level) && (x1 < level) && (x2 >= level) && (x3 < level)) { // case 6 - edge going vertically along the right zXMask.set(offset + i1, 255); zXMask.set(offset + i3, 255); } else if ((x0 >= level) && (x1 < level) && (x2 < level) && (x3 < level)) { // case 7 - edge in the upper left zXMask.set(offset + i0, 255); } else if ((x0 < level) && (x1 >= level) && (x2 >= level) && (x3 >= level)) { // case 8 - edge in the upper left zXMask.set(offset + i0, 255); } else if ((x0 < level) && (x1 >= level) && (x2 < level) && (x3 >= level)) { // case 9 - edge going vertically along the left zXMask.set(offset + i0, 255); zXMask.set(offset + i2, 255); } else if ((x0 < level) && (x1 >= level) && (x2 >= level) && (x3 < level)) { // case 10 - ambiguous case; either edge in upper left and lower right or // edge that goes from the upper left to the lower right zXMask.set(offset + i0, 255); zXMask.set(offset + i3, 255); } else if ((x0 < level) && (x1 >= level) && (x2 < level) && (x3 < level)) { // case 11 - edge in the upper right zXMask.set(offset + i1, 255); } else if ((x0 < level) && (x1 < level) && (x2 >= level) && (x3 >= level)) { // case 12 - edge going horizontally along the top zXMask.set(offset + i0, 255); zXMask.set(offset + i1, 255); } else if ((x0 < level) && (x1 < level) && (x2 < level) && (x3 >= level)) { // case 13 - edge in the lower right zXMask.set(offset + i3, 255); } else if ((x0 < level) && (x1 < level) && (x2 >= level) && (x3 < level)) { // case 14 - edge in the lower left zXMask.set(offset + i2, 255); } else if ((x0 < level) && (x1 < level) && (x2 < level) && (x3 < level)) { // case 15 - no edge } } else if (detectionType == NEGATIVE_EDGES) { if (buffer[i0] <= 1) { zXMask.set(offset + i0, 255); } } else if (detectionType == OLD_DETECTION) { i1 = i0 + 1; i2 = i0 + xDim; i3 = i0 + 1 + xDim; x0 = buffer[i0]; x1 = buffer[i1]; x2 = buffer[i2]; x3 = buffer[i3]; if ((x0 > level) && (x1 > level) && (x2 > level) && (x3 > level)) { zXMask.set(offset + i0, 0); } else if ((x0 < level) && (x1 < level) && (x2 < level) && (x3 < level)) { zXMask.set(offset + i0, 0); } else { zXMask.set(offset + i0, 255); } } } } FileInfoBase[] fileInfo = zXMask.getFileInfo(); fileInfo[slice].setModality(srcImage.getFileInfo()[slice].getModality()); fileInfo[slice].setFileDirectory(srcImage.getFileInfo()[slice].getFileDirectory()); fileInfo[slice].setEndianess(srcImage.getFileInfo()[slice].getEndianess()); fileInfo[slice].setUnitsOfMeasure(srcImage.getFileInfo()[slice].getUnitsOfMeasure()); fileInfo[slice].setResolutions(srcImage.getFileInfo()[slice].getResolutions()); fileInfo[slice].setExtents(zXMask.getExtents()); fileInfo[slice].setMax(255); fileInfo[slice].setMin(0); fileInfo[slice].setPixelPadValue(srcImage.getFileInfo()[slice].getPixelPadValue()); fileInfo[slice].setPhotometric(srcImage.getFileInfo()[slice].getPhotometric()); }
/** * This function produces a new image that has been concatenated. Two 2D-images become one 3D * image. */ private void cat2D_2D_3D() { int length; int xDim, yDim; int i; float[] buffer; int cFactor = 1; float[] resols = new float[3]; FileInfoBase[] fileInfo = null; FileInfoDicom[] fileInfoDicom = null; try { resols = new float[3]; xDim = srcImage1.getExtents()[0]; yDim = srcImage1.getExtents()[1]; if (srcImage1.isColorImage()) { cFactor = 4; } length = cFactor * xDim * yDim; buffer = new float[length]; srcImage1.exportData(0, length, buffer); destImage.importData(0, buffer, false); srcImage2.exportData(0, length, buffer); destImage.importData(buffer.length, buffer, true); } catch (IOException error) { buffer = null; destImage.disposeLocal(); // Clean up memory of result image destImage = null; errorCleanUp("Algorithm Concat. Images: Image(s) locked", true); return; } catch (OutOfMemoryError e) { buffer = null; destImage.disposeLocal(); // Clean up memory of result image destImage = null; errorCleanUp("Algorithm Concat. Images: Out of memory", true); return; } resols[0] = srcImage1.getFileInfo()[0].getResolutions()[0]; resols[1] = srcImage1.getFileInfo()[0].getResolutions()[1]; resols[2] = 1; if ((srcImage1.getFileInfo()[0] instanceof FileInfoDicom) && (srcImage2.getFileInfo()[0] instanceof FileInfoDicom)) { fileInfoDicom = new FileInfoDicom[destImage.getExtents()[2]]; fileInfoDicom[0] = (FileInfoDicom) (((FileInfoDicom) srcImage1.getFileInfo()[0]).clone()); fileInfoDicom[1] = (FileInfoDicom) (((FileInfoDicom) srcImage2.getFileInfo()[0]).clone()); destImage.setFileInfo(fileInfoDicom); } else { fileInfo = destImage.getFileInfo(); for (i = 0; (i < destImage.getExtents()[2]) && !threadStopped; i++) { fileInfo[i].setModality(srcImage1.getFileInfo()[0].getModality()); fileInfo[i].setFileDirectory(srcImage1.getFileInfo()[0].getFileDirectory()); fileInfo[i].setEndianess(srcImage1.getFileInfo()[0].getEndianess()); fileInfo[i].setUnitsOfMeasure(srcImage1.getFileInfo()[0].getUnitsOfMeasure()); fileInfo[i].setResolutions(resols); fileInfo[i].setExtents(destImage.getExtents()); fileInfo[i].setMax(destImage.getMax()); fileInfo[i].setMin(destImage.getMin()); fileInfo[i].setImageOrientation(srcImage1.getImageOrientation()); fileInfo[i].setPixelPadValue(srcImage1.getFileInfo()[0].getPixelPadValue()); fileInfo[i].setPhotometric(srcImage1.getFileInfo()[0].getPhotometric()); fileInfo[i].setAxisOrientation(srcImage1.getAxisOrientation()); } if (srcImage1.getFileInfo()[0] instanceof FileInfoImageXML) { if (((FileInfoImageXML) srcImage1.getFileInfo()[0]).getPSetHashtable() != null) { ((FileInfoImageXML) fileInfo[0]) .setPSetHashtable(((FileInfoImageXML) srcImage1.getFileInfo()[0]).getPSetHashtable()); } } if (srcImage2.getFileInfo()[0] instanceof FileInfoImageXML) { if (((FileInfoImageXML) srcImage2.getFileInfo()[0]).getPSetHashtable() != null) { ((FileInfoImageXML) fileInfo[1]) .setPSetHashtable(((FileInfoImageXML) srcImage2.getFileInfo()[0]).getPSetHashtable()); } } } if (threadStopped) { buffer = null; finalize(); return; } setCompleted(true); fileInfo = null; fileInfoDicom = null; }
/** cat. */ private void cat3D_4D_4D() { int length; int xDim, yDim; float[] buffer; int cFactor = 1; int i, j; float[] resols = new float[3]; float[] origins = new float[3]; FileInfoBase[] fileInfo = null; FileInfoDicom[] fileInfoDicom = null; int srcALength, srcBLength; try { fireProgressStateChanged(srcImage1.getImageName(), "Concatenating images ..."); resols = new float[4]; origins = new float[4]; xDim = srcImage1.getExtents()[0]; yDim = srcImage1.getExtents()[1]; if (srcImage1.isColorImage()) { cFactor = 4; } length = cFactor * xDim * yDim; buffer = new float[length]; int nImages; if (srcImage1.getNDims() > srcImage2.getNDims()) { nImages = (srcImage1.getExtents()[2] * srcImage1.getExtents()[3]) + srcImage2.getExtents()[2]; for (i = 0; (i < (srcImage1.getExtents()[2] * srcImage1.getExtents()[3])) && !threadStopped; i++) { fireProgressStateChanged(Math.round((float) (i) / (nImages - 1) * 100)); srcImage1.exportData(i * length, length, buffer); destImage.importData(i * length, buffer, false); } if (threadStopped) { buffer = null; finalize(); return; } for (j = 0; (j < srcImage2.getExtents()[2]) && !threadStopped; j++) { fireProgressStateChanged(Math.round((float) (i + j) / (nImages - 1) * 100)); srcImage2.exportData(j * length, length, buffer); destImage.importData((i + j) * length, buffer, false); } if (threadStopped) { buffer = null; finalize(); return; } destImage.calcMinMax(); } else { nImages = (srcImage2.getExtents()[2] * srcImage2.getExtents()[3]) + srcImage1.getExtents()[2]; for (j = 0; (j < srcImage1.getExtents()[2]) && !threadStopped; j++) { fireProgressStateChanged(Math.round((float) (j) / (nImages - 1) * 100)); srcImage1.exportData(j * length, length, buffer); destImage.importData(j * length, buffer, false); } if (threadStopped) { buffer = null; finalize(); return; } for (i = 0; (i < (srcImage2.getExtents()[2] * srcImage2.getExtents()[3])) && !threadStopped; i++) { fireProgressStateChanged(Math.round((float) (i + j) / (nImages - 1) * 100)); srcImage2.exportData(i * buffer.length, length, buffer); destImage.importData((i + j) * buffer.length, buffer, false); } if (threadStopped) { buffer = null; finalize(); return; } destImage.calcMinMax(); } } catch (IOException error) { buffer = null; destImage.disposeLocal(); // Clean up memory of result image destImage = null; errorCleanUp("Algorithm Concat. Images: Image(s) locked", true); return; } catch (OutOfMemoryError e) { buffer = null; destImage.disposeLocal(); // Clean up memory of result image destImage = null; errorCleanUp("Algorithm Concat. Images: Out of memory", true); return; } resols[0] = srcImage1.getFileInfo()[0].getResolutions()[0]; resols[1] = srcImage1.getFileInfo()[0].getResolutions()[1]; resols[2] = srcImage1.getFileInfo()[0].getResolutions()[2]; resols[3] = srcImage1.getFileInfo()[0].getResolutions()[3]; origins[0] = srcImage1.getFileInfo()[0].getOrigin()[0]; origins[1] = srcImage1.getFileInfo()[0].getOrigin()[1]; origins[2] = srcImage1.getFileInfo()[0].getOrigin()[2]; origins[3] = srcImage1.getFileInfo()[0].getOrigin()[3]; if ((srcImage1.getFileInfo()[0] instanceof FileInfoDicom) && (srcImage2.getFileInfo()[0] instanceof FileInfoDicom)) { fileInfoDicom = new FileInfoDicom[destImage.getExtents()[2] * destImage.getExtents()[3]]; if (srcImage1.getNDims() > srcImage2.getNDims()) { srcALength = srcImage1.getExtents()[2] * srcImage1.getExtents()[3]; for (i = 0; (i < srcALength) && !threadStopped; i++) { fileInfoDicom[i] = (FileInfoDicom) (((FileInfoDicom) srcImage1.getFileInfo()[i]).clone()); fileInfoDicom[i].setOrigin(origins); } for (i = 0; (i < srcImage2.getExtents()[2]) && !threadStopped; i++) { fileInfoDicom[srcALength + i] = (FileInfoDicom) (((FileInfoDicom) srcImage2.getFileInfo()[i]).clone()); fileInfoDicom[srcALength + i].setOrigin(origins); } } else { srcBLength = srcImage2.getExtents()[2] * srcImage2.getExtents()[3]; for (i = 0; (i < srcImage1.getExtents()[2]) && !threadStopped; i++) { fileInfoDicom[i] = (FileInfoDicom) (((FileInfoDicom) srcImage1.getFileInfo()[i]).clone()); fileInfoDicom[i].setOrigin(origins); } for (i = 0; (i < srcBLength) && !threadStopped; i++) { fileInfoDicom[srcImage1.getExtents()[2] + i] = (FileInfoDicom) (((FileInfoDicom) srcImage2.getFileInfo()[i]).clone()); fileInfoDicom[srcImage1.getExtents()[2] + i].setOrigin(origins); } } destImage.setFileInfo(fileInfoDicom); } else { fileInfo = destImage.getFileInfo(); for (i = 0; (i < (destImage.getExtents()[2] * destImage.getExtents()[3])) && !threadStopped; i++) { fileInfo[i].setModality(srcImage1.getFileInfo()[0].getModality()); fileInfo[i].setFileDirectory(srcImage1.getFileInfo()[0].getFileDirectory()); fileInfo[i].setEndianess(srcImage1.getFileInfo()[0].getEndianess()); fileInfo[i].setUnitsOfMeasure(srcImage1.getFileInfo()[0].getUnitsOfMeasure()); fileInfo[i].setResolutions(resols); fileInfo[i].setExtents(destImage.getExtents()); fileInfo[i].setMax(destImage.getMax()); fileInfo[i].setMin(destImage.getMin()); fileInfo[i].setImageOrientation(srcImage1.getImageOrientation()); fileInfo[i].setPixelPadValue(srcImage1.getFileInfo()[0].getPixelPadValue()); fileInfo[i].setPhotometric(srcImage1.getFileInfo()[0].getPhotometric()); fileInfo[i].setAxisOrientation(srcImage1.getAxisOrientation()); } if (srcImage1.getFileInfo()[0] instanceof FileInfoImageXML) { if (srcImage1.getNDims() > srcImage2.getNDims()) { srcALength = srcImage1.getExtents()[2] * srcImage1.getExtents()[3]; for (i = 0; (i < srcALength) && !threadStopped; i++) { if (((FileInfoImageXML) srcImage1.getFileInfo()[i]).getPSetHashtable() != null) { ((FileInfoImageXML) fileInfo[i]) .setPSetHashtable( ((FileInfoImageXML) srcImage1.getFileInfo()[i]).getPSetHashtable()); } } } else { for (i = 0; (i < srcImage1.getExtents()[2]) && !threadStopped; i++) { if (((FileInfoImageXML) srcImage1.getFileInfo()[i]).getPSetHashtable() != null) { ((FileInfoImageXML) fileInfo[i]) .setPSetHashtable( ((FileInfoImageXML) srcImage1.getFileInfo()[i]).getPSetHashtable()); } } } } if (srcImage2.getFileInfo()[0] instanceof FileInfoImageXML) { if (srcImage1.getNDims() > srcImage2.getNDims()) { srcALength = srcImage1.getExtents()[2] * srcImage1.getExtents()[3]; for (i = 0; (i < srcImage2.getExtents()[2]) && !threadStopped; i++) { if (((FileInfoImageXML) srcImage2.getFileInfo()[i]).getPSetHashtable() != null) { ((FileInfoImageXML) fileInfo[srcALength + i]) .setPSetHashtable( ((FileInfoImageXML) srcImage2.getFileInfo()[i]).getPSetHashtable()); } } } else { srcBLength = srcImage2.getExtents()[2] * srcImage2.getExtents()[3]; for (i = 0; (i < srcBLength) && !threadStopped; i++) { if (((FileInfoImageXML) srcImage2.getFileInfo()[i]).getPSetHashtable() != null) { ((FileInfoImageXML) fileInfo[srcImage1.getExtents()[2] + i]) .setPSetHashtable( ((FileInfoImageXML) srcImage2.getFileInfo()[i]).getPSetHashtable()); } } } } } if (threadStopped) { buffer = null; finalize(); return; } setCompleted(true); fileInfo = null; fileInfoDicom = null; }
/** * Use the GUI results to set up the variables needed to run the algorithm. * * @return <code>true</code> if parameters set successfully, <code>false</code> otherwise. */ private boolean setVariables() { String tmpStr; tmpStr = textXDim.getText(); try { subXDim = Integer.parseInt(tmpStr); } catch (NumberFormatException e) { MipavUtil.displayError("New XDIM string is not a valid integer"); textXDim.requestFocus(); textXDim.selectAll(); return false; } if (subXDim < 3) { MipavUtil.displayError("New XDIM must be at least 3"); textXDim.requestFocus(); textXDim.selectAll(); return false; } else if (subXDim > image.getExtents()[0]) { MipavUtil.displayError("New XDIM cannot exceed " + image.getExtents()[0]); textXDim.requestFocus(); textXDim.selectAll(); return false; } tmpStr = textYDim.getText(); try { subYDim = Integer.parseInt(tmpStr); } catch (NumberFormatException e) { MipavUtil.displayError("New YDIM string is not a valid integer"); textYDim.requestFocus(); textYDim.selectAll(); return false; } if (subYDim < 3) { MipavUtil.displayError("New YDIM must be at least 3"); textYDim.requestFocus(); textYDim.selectAll(); return false; } else if (subYDim > image.getExtents()[1]) { MipavUtil.displayError("New YDIM cannot exceed " + image.getExtents()[1]); textYDim.requestFocus(); textYDim.selectAll(); return false; } tmpStr = textNumberImages.getText(); try { numberOfImagesInMosaic = Integer.parseInt(tmpStr); } catch (NumberFormatException e) { MipavUtil.displayError("New numberOfImagesInMosaic string is not a valid integer"); textNumberImages.requestFocus(); textNumberImages.selectAll(); return false; } if (numberOfImagesInMosaic < 1) { MipavUtil.displayError("New numberOfImagesInMosaic must be at least 1"); textNumberImages.requestFocus(); textNumberImages.selectAll(); return false; } else if (numberOfImagesInMosaic > (subXDim * subYDim)) { MipavUtil.displayError("New numberOfImagesInMosaic cannot exceed (newXDim) * (newYDim)"); textNumberImages.requestFocus(); textNumberImages.selectAll(); return false; } displayLoc = NEW; return true; }