PlugInAlgorithmCT MD.java
Jump to navigation
Jump to search
- | 15 * Fat: -190 to -30 16 * Low density muscle: 0 to 30 17 * High density muscle: 31 to 100 18 * If you have any questions, please drop me a line. 19 * ===== 20 * Matthew J. Delmonico, MS, MPH 21 * Graduate Research Assistant, Exercise Physiology 22 * 2132 HHP Building 23 * University of Maryland 24 * College Park, MD 20742 25 * (301) 405-2569 26 * (301) 793-0567 (cell) 27 * 28 * @version July 12, 2002 29 * @author 30 * @see AlgorithmBase 31 * 32 * $Logfile: /mipav/src/plugins/PlugInAlgorithmCT_MD.java $ 33 * $Revision: 10 $ 34 * $Date: 10/13/04 1:09p $ 35 * 36 */ 37 public class PlugInAlgorithmCT_MD extends AlgorithmBase { 38 39 40 private boolean entireImage = true; 41 42 public int fatL = -190; 43 public int fatH = -30; 44 45 public int ldmL = 0; 46 public int ldmH = 30; 47 48 public int hdmL = 31; 49 public int hdmH = 100; 50 51 52 /** 53 * Constructor for 3D images in which changes are placed in a predetermined 54 * destination image. 55 * @param destImg Image model where result image is to stored. 56 * @param srcImg Source image model. 57 */ 58 public PlugInAlgorithmCT_MD(ModelImage destImg, ModelImage srcImg) { 59 super(destImg, srcImg); 60 } 61 62 /** 63 * Prepares this class for destruction. 64 */ 65 public void finalize(){ 66 destImage = null; 67 srcImage = null; 68 super.finalize(); 69 } 70 |} {| border="1" cellpadding="5" |+
Figure 330. PlugInAlgorithmCT_MD.java |- | 71 /** 72 * Starts the algorithm. 73 */ 74 public void run() { 75 76 if (srcImage == null) { 77 displayError("Source Image is null"); 78 notifyListeners(this); 79 return; 80 } 81 if (destImage == null) { 82 displayError("Source Image is null"); 83 notifyListeners(this); 84 return; 85 } 86 87 88 // start the timer to compute the elapsed time 89 setStartTime(); 90 91 if (destImage != null){ // if there exists a destination image 92 if (srcImage.getNDims() == 2){ 93 calcStoreInDest2D(); 94 } 95 else if (srcImage.getNDims() > 2) { 96 calcStoreInDest3D(); 97 } 98 } 99 100 // compute the elapsed time 101 computeElapsedTime(); 102 notifyListeners(this); 103 } 104 105 /** 106 * This function produces a new image that has been median filtered and places 107 * filtered image in the destination image. 108 */ 109 private void calcStoreInDest2D(){ 110 111 112 int length; // total number of data-elements (pixels) in image 113 float buffer[]; // data-buffer (for pixel data) which is the "heart" 114 // of the image |- | 115 try { 116 // image length is length in 2 dims 117 length = srcImage.getExtents()[0] * srcImage.getExtents()[1]; 118 buffer = new float[length]; 119 srcImage.exportData(0,length, buffer); // locks and releases lock 120 } 121 catch (IOException error) { 122 buffer = null; 123 errorCleanUp("Algorithm CT_MD reports: source image locked", true); 124 return; 125 } 126 catch (OutOfMemoryError e){ 127 buffer = null; 128 errorCleanUp("Algorithm CT_MD reports: out of memory", true); 129 return; 130 } 131 132 int mod = length/100; // mod is 1 percent of length 133 initProgressBar(); 134 135 // Fat: -190 to -30 136 // Low density muscle: 0 to 30 137 // High density muscle: 31 to 100 138 BitSet mask = null; 139 if (srcImage.getVOIs().size() > 0 ) { 140 mask = srcImage.generateVOIMask(); 141 entireImage = false; 142 } 143 144 int fat = 0; 145 int ldMuscle = 0; 146 int hdMuscle = 0; 147 for (int i = 0; i < length && !threadStopped; i ){ 148 if (isProgressBarVisible() && (i)%mod==0) 149 progressBar.setValue(Math.round((float)(i)/(length-1) * 100)); 150 151 if (entireImage == true || mask.get(i) ) { 152 if( buffer[i] >= fatL && buffer[i] <= fatH ) { 153 destImage.set(i, 20); 154 fat ; 155 } 156 else if( buffer[i] >= ldmL && buffer[i] <= ldmH ) { 157 destImage.set(i, 40); 158 ldMuscle ; 159 } 160 else if( buffer[i] >= hdmL && buffer[i] <= hdmH ) { 161 destImage.set(i, 60); 162 hdMuscle ; 163 } 164 else { 165 destImage.set(i, 0); 166 //buffer[i] = (float)srcImage.getMin(); 167 168 } 169 } 170 } 171 172 |- | 173 //destImage.releaseLock(); 174 175 if (threadStopped) { 176 finalize(); 177 return; 178 } 179 180 float area = srcImage.getFileInfo()[0].getResolutions()[0] * 181 srcImage.getFileInfo()[0].getResolutions()[1]; 182 183 destImage.getUserInterface().getMessageFrame().append("Number of Fat pixels = " 184 fat , ViewJFrameMessage.DATA ); 185 destImage.getUserInterface().getMessageFrame().append(" Area = " (fat*area) 186 " mm^2\n", ViewJFrameMessage.DATA ); 187 188 destImage.getUserInterface().getMessageFrame().append("Number of LDM pixels = " 189 ldMuscle , ViewJFrameMessage.DATA ); 190 destImage.getUserInterface().getMessageFrame().append(" Area = " (ldMuscle*area) 191 " mm^2\n", ViewJFrameMessage.DATA ); 192 193 destImage.getUserInterface().getMessageFrame().append("Number of HDM pixels = " 194 hdMuscle , ViewJFrameMessage.DATA ); 195 destImage.getUserInterface().getMessageFrame().append(" Area = " (hdMuscle*area) 196 " mm^2\n", ViewJFrameMessage.DATA ); 197 198 destImage.calcMinMax(); 199 setCompleted(true); 200 } 201 202 /** 203 * This function produces a new volume image that has been median filtered. 204 * Image can be filtered by filtering each slice individually, or by filtering 205 * using a kernel-volume. 206 */ 207 private void calcStoreInDest3D(){ 208 209 int totLength, imgLength; 210 float buffer[]; 211 212 float vol = srcImage.getFileInfo()[0].getResolutions()[0] * 213 srcImage.getFileInfo()[0].getResolutions()[1] * 214 srcImage.getFileInfo()[0].getResolutions()[2]; 215 216 try { 217 // image totLength is totLength in 3 dims 218 imgLength = srcImage.getSliceSize(); 219 totLength = srcImage.getSliceSize() * srcImage.getExtents()[2]; 220 buffer = new float[totLength]; 221 srcImage.exportData(0,totLength, buffer); // locks and releases lock 222 buildProgressBar(srcImage.getImageName(), "Processing image ...", 0, 100); 223 } 224 225 catch (IOException error) { 226 buffer = null; 227 errorCleanUp("Algorithm CT_MD: source image locked", true); 228 return; 229 } |- | 230 catch (OutOfMemoryError e){ 231 buffer = null; 232 errorCleanUp("Algorithm CT_MD: Out of memory creating process buffer", true); 233 return; 234 } 235 236 int totFat = 0; 237 int totLdMuscle = 0; 238 int totHdMuscle = 0; 239 initProgressBar(); 240 241 for (int i = 0; i < srcImage.getExtents()[2] && !threadStopped; i ){ 242 int fat = 0; 243 int ldMuscle = 0; 244 int hdMuscle = 0; 245 246 if ( isProgressBarVisible() ) 247 progressBar.setValue(Math.round((float)(i)/(srcImage.getExtents()[2]-1) * 248 100)); 249 250 for (int j = 0; j < imgLength && !threadStopped; j ){ 251 //System.out.println(" j = " j); 252 int index = i*imgLength j; 253 if( buffer[index] >= fatL && buffer[index] <= fatH ) { 254 destImage.set(index, 60); 255 totFat ; 256 fat ; 257 } 258 else if( buffer[index] >= ldmL && buffer[index] <= ldmH ) { 259 destImage.set(index, 120); 260 totLdMuscle ; 261 ldMuscle ; 262 } 263 else if( buffer[index] >= hdmL && buffer[index] <= hdmH ) { 264 destImage.set(index, 200); 265 totHdMuscle ; 266 hdMuscle ; 267 } 268 else { 269 destImage.set(index, 0); 270 //buffer[i] = -1024; 271 } 272 } 273 destImage.getUserInterface().getMessageFrame().append("\n\n ***************** Slice 274 " i " totals ***************\n", 275 ViewJFrameMessage.DATA); 276 destImage.getUserInterface().getMessageFrame().append("Number of fat pixels = " 277 fat , ViewJFrameMessage.DATA ); 278 destImage.getUserInterface().getMessageFrame().append(" Volume = " (fat*vol) 279 " mm^3\n", ViewJFrameMessage.DATA ); 280 281 destImage.getUserInterface().getMessageFrame().append("Number of LDM pixels = " 282 ldMuscle , ViewJFrameMessage.DATA ); 283 destImage.getUserInterface().getMessageFrame().append(" Volume = " 284 (ldMuscle*vol) " mm^3\n", ViewJFrameMessage.DATA ); 285 |- | 286 destImage.getUserInterface().getMessageFrame().append("Number of HDM pixels 287 = " hdMuscle , ViewJFrameMessage.DATA ); 288 destImage.getUserInterface().getMessageFrame().append(" Volume = " 289 (hdMuscle*vol) " mm^3\n", ViewJFrameMessage.DATA ); 290 } 291 292 destImage.releaseLock(); 293 294 if (threadStopped) { 295 finalize(); 296 return; 297 } 298 299 destImage.getUserInterface().getMessageFrame().append("\n ************************ 300 Totals ********************\n", 301 ViewJFrameMessage.DATA); 302 destImage.getUserInterface().getMessageFrame().append("Number of totFat pixels = " 303 totFat , ViewJFrameMessage.DATA ); 304 destImage.getUserInterface().getMessageFrame().append(" Volume = " (totFat*vol) 305 " mm^3\n", ViewJFrameMessage.DATA ); 306 307 destImage.getUserInterface().getMessageFrame().append("Number of LDM pixels = " 308 totLdMuscle , ViewJFrameMessage.DATA ); 309 destImage.getUserInterface().getMessageFrame().append(" Volume = " (totLdMuscle*vol) 310 " mm^3\n", ViewJFrameMessage.DATA ); 311 312 destImage.getUserInterface().getMessageFrame().append("Number of HDM pixels = " 313 totHdMuscle , ViewJFrameMessage.DATA ); 314 destImage.getUserInterface().getMessageFrame().append(" Volume = " (totHdMuscle*vol) 315 " mm^3\n", ViewJFrameMessage.DATA ); 316 317 destImage.calcMinMax(); 318 progressBar.dispose(); 319 setCompleted(true); 320 } 321 } |} Next: Plug-in CT_MD.java See also: |