PlugInDialogCT MD.java
From MIPAV
Revision as of 22:38, 15 February 2012 by
Angelfish100
(
Talk
)
(
diff
)
<previousrevision>
|
Latest revision
(
diff
) |
<nextrevision>
(
diff
)
Jump to:
navigation
,
search
Plug-in AlgorithmCT_MD.java
- |
PlugInAlgorithmCT_MD.java
1
import
gov.nih.mipav.model.algorithms.*;
2
import
gov.nih.mipav.model.structures.*;
3
import
gov.nih.mipav.view.*;
4
5
import
java.io.*;
6
import
java.util.*;
7
8
9
/**
10
*
11
* This shows how to extend the AlgorithmBase class.
12
*
13
* Supports the segmentation
14
* CT scans:
|- |
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
|}
</font>
</div>
{| 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 }
|}
Navigation menu
Views
Page
Discussion
View source
History
Personal tools
Log in
Request account
Navigation
Main page
Recent changes
Random page
Help
Search
Tools
What links here
Related changes
Special pages
Printable version
Permanent link
Page information