/** * 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()); }