1 package mpi
.fruitfly
.general
;
8 * <p>Copyright: Copyright (c) 2006</p>
12 * @author not attributable
16 import static mpi
.fruitfly
.math
.General
.max
;
20 import ij
.process
.ByteProcessor
;
21 import ij
.process
.FloatProcessor
;
22 import ij
.process
.ImageProcessor
;
23 import ij
.process
.ShortProcessor
;
25 import java
.awt
.Point
;
27 import mpi
.fruitfly
.math
.datastructures
.FloatArray
;
28 import mpi
.fruitfly
.math
.datastructures
.FloatArray2D
;
29 import mpi
.fruitfly
.math
.datastructures
.FloatArray3D
;
30 import mpi
.fruitfly
.math
.datastructures
.FloatArray4D
;
33 public class ImageArrayConverter
35 public static boolean CUTOFF_VALUES
= true;
36 public static boolean NORM_VALUES
= false;
38 public static ImagePlus
FloatArrayToImagePlus(FloatArray2D image
, String name
, float min
, float max
)
40 ImagePlus imp
= IJ
.createImage(name
,"32-Bit Black", image
.width
, image
.height
, 1);
41 FloatProcessor ip
= (FloatProcessor
)imp
.getProcessor();
42 FloatArrayToFloatProcessor(ip
, image
);
47 ip
.setMinAndMax(min
, max
);
54 public static ImagePlus
FloatArrayToStack(FloatArray3D image
, String name
, float min
, float max
)
56 int width
= image
.width
;
57 int height
= image
.height
;
58 int nstacks
= image
.depth
;
60 ImageStack stack
= new ImageStack(width
, height
);
62 for (int slice
= 0; slice
< nstacks
; slice
++)
64 ImagePlus impResult
= IJ
.createImage("Result", "32-Bit Black", width
, height
, 1);
65 ImageProcessor ipResult
= impResult
.getProcessor();
66 float[] sliceImg
= new float[width
* height
];
68 for (int x
= 0; x
< width
; x
++)
69 for (int y
= 0; y
< height
; y
++)
70 sliceImg
[y
* width
+ x
] = image
.get(x
,y
,slice
);
72 ipResult
.setPixels(sliceImg
);
75 ipResult
.resetMinAndMax();
77 ipResult
.setMinAndMax(min
, max
);
79 stack
.addSlice("Slice " + slice
, ipResult
);
82 return new ImagePlus(name
, stack
);
85 public static ImagePlus
DoubleArrayToStack(double[] image
, int width
, int height
, int nstacks
, String name
, float min
, float max
)
87 ImageStack stack
= new ImageStack(width
, height
);
89 for (int slice
= 0; slice
< nstacks
; slice
++)
91 ImagePlus impResult
= IJ
.createImage("Result", "32-Bit Black", width
, height
, 1);
92 ImageProcessor ipResult
= impResult
.getProcessor();
93 float[] sliceImg
= new float[width
* height
];
95 for (int x
= 0; x
< width
; x
++)
96 for (int y
= 0; y
< height
; y
++)
97 sliceImg
[y
* width
+ x
] = (float)image
[x
+ width
* (y
+ slice
* height
)];
99 ipResult
.setPixels(sliceImg
);
102 ipResult
.resetMinAndMax();
104 ipResult
.setMinAndMax(min
, max
);
106 stack
.addSlice("Slice " + slice
, ipResult
);
109 return new ImagePlus(name
, stack
);
112 public static FloatArray3D
StackToFloatArrayZeroPadding(ImageStack stack
, int wZP
, int hZP
, int dZP
)
114 Object
[] imageStack
= stack
.getImageArray();
116 int width
= stack
.getWidth();
117 int height
= stack
.getHeight();
118 int nstacks
= stack
.getSize();
120 int offsetX
= (wZP
- width
)/2;
121 int offsetY
= (hZP
- height
)/2;
122 int offsetZ
= (dZP
- nstacks
)/2;
124 if (imageStack
== null || imageStack
.length
== 0)
126 System
.out
.println("Image Stack is empty.");
130 if (imageStack
[0] instanceof int[])
132 System
.out
.println("RGB images supported at the moment.");
137 //float[][][] pixels = new float[wZP][hZP][dZP];
138 FloatArray3D pixels
= new FloatArray3D(wZP
,hZP
,dZP
);
141 int stepY
= pixels
.getPos(0,1,0) - width
;
143 if (imageStack
[0] instanceof byte[])
145 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
147 byte[] pixelTmp
= (byte[]) imageStack
[countSlice
];
149 pos
= pixels
.getPos(offsetX
, offsetY
, offsetZ
+ countSlice
);
151 for (int y
= 0; y
< height
; y
++)
153 for (int x
= 0; x
< width
; x
++)
155 //pixels.data[pixels.getPos(x + offsetX, y + offsetY, countSlice + offsetZ)] = (float) (pixelTmp[count++] & 0xff);
156 pixels
.data
[pos
++] = (float) (pixelTmp
[count
++] & 0xff);
162 else if (imageStack
[0] instanceof short[])
163 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
165 short[] pixelTmp
= (short[])imageStack
[countSlice
];
167 pos
= pixels
.getPos(offsetX
, offsetY
, offsetZ
+ countSlice
);
169 for (int y
= 0; y
< height
; y
++)
171 for (int x
= 0; x
< width
; x
++)
173 //pixels.data[pixels.getPos(x + offsetX, y + offsetY, countSlice + offsetZ)] = (float) (pixelTmp[count++] & 0xffff);
174 pixels
.data
[pos
++] = (float) (pixelTmp
[count
++] & 0xffff);
179 else // instance of float[]
180 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
182 float[] pixelTmp
= (float[])imageStack
[countSlice
];
184 pos
= pixels
.getPos(offsetX
, offsetY
, offsetZ
+ countSlice
);
186 for (int y
= 0; y
< height
; y
++)
188 for (int x
= 0; x
< width
; x
++)
190 //pixels.data[pixels.getPos(x + offsetX, y + offsetY, countSlice + offsetZ)] = pixelTmp[count++];
191 pixels
.data
[pos
++] = pixelTmp
[count
++];
200 public static FloatArray4D
StackToFloatArrayComplexZeroPadding(ImageStack stack
, int wZP
, int hZP
, int dZP
)
202 Object
[] imageStack
= stack
.getImageArray();
204 int width
= stack
.getWidth();
205 int height
= stack
.getHeight();
206 int nstacks
= stack
.getSize();
208 int offsetX
= (wZP
- width
)/2;
209 int offsetY
= (hZP
- height
)/2;
210 int offsetZ
= (dZP
- nstacks
)/2;
212 if (imageStack
== null || imageStack
.length
== 0)
214 System
.out
.println("Image Stack is empty.");
218 if (imageStack
[0] instanceof int[])
220 System
.out
.println("RGB images supported at the moment.");
225 //float[][][] pixels = new float[wZP][hZP][dZP];
226 FloatArray4D pixels
= new FloatArray4D(wZP
,hZP
,dZP
,2);
229 int stepY
= pixels
.getPos(0,1,0,0) - width
;
232 if (imageStack
[0] instanceof byte[])
233 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
235 byte[] pixelTmp
= (byte[])imageStack
[countSlice
];
237 pos
= pixels
.getPos(offsetX
, offsetY
, offsetZ
+ countSlice
,0);
239 for (int y
= 0; y
< height
; y
++)
241 for (int x
= 0; x
< width
; x
++)
243 //pixels.data[pixels.getPos(x + offsetX, y + offsetY, countSlice + offsetZ, 0)] = (float) (pixelTmp[count++] & 0xff);
244 pixels
.data
[pos
++] = (float) (pixelTmp
[count
++] & 0xff);
249 else if (imageStack
[0] instanceof short[])
250 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
252 short[] pixelTmp
= (short[])imageStack
[countSlice
];
254 pos
= pixels
.getPos(offsetX
, offsetY
, offsetZ
+ countSlice
,0);
256 for (int y
= 0; y
< height
; y
++)
258 for (int x
= 0; x
< width
; x
++)
260 //pixels.data[pixels.getPos(x + offsetX, y + offsetY, countSlice + offsetZ, 0)] = (float) (pixelTmp[count++] & 0xffff);
261 pixels
.data
[pos
++] = (float) (pixelTmp
[count
++] & 0xffff);
266 else // instance of float[]
267 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
269 float[] pixelTmp
= (float[])imageStack
[countSlice
];
271 pos
= pixels
.getPos(offsetX
, offsetY
, offsetZ
+ countSlice
,0);
273 for (int y
= 0; y
< height
; y
++)
275 for (int x
= 0; x
< width
; x
++)
277 //pixels.data[pixels.getPos(x + offsetX, y + offsetY, countSlice + offsetZ, 0)] = pixelTmp[count++];
278 pixels
.data
[pos
++] = pixelTmp
[count
++];
287 public static double[] StackToDoubleArrayZeroPadding(ImageStack stack
, int wZP
, int hZP
, int dZP
)
289 Object
[] imageStack
= stack
.getImageArray();
291 int width
= stack
.getWidth();
292 int height
= stack
.getHeight();
293 int nstacks
= stack
.getSize();
295 int offsetX
= (wZP
- width
)/2;
296 int offsetY
= (hZP
- height
)/2;
297 int offsetZ
= (dZP
- nstacks
)/2;
299 if (imageStack
== null || imageStack
.length
== 0)
301 System
.out
.println("Image Stack is empty.");
305 if (imageStack
[0] instanceof int[])
307 System
.out
.println("RGB images supported at the moment.");
312 double[] pixels
= new double[wZP
* hZP
* dZP
];
315 if (imageStack
[0] instanceof byte[])
316 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
318 byte[] pixelTmp
= (byte[])imageStack
[countSlice
];
321 for (int y
= 0; y
< height
; y
++)
322 for (int x
= 0; x
< width
; x
++)
323 pixels
[(x
+offsetX
) + width
* ((y
+offsetY
) + (countSlice
+offsetZ
) * height
)] = (pixelTmp
[count
++] & 0xff);
325 else if (imageStack
[0] instanceof short[])
326 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
328 short[] pixelTmp
= (short[])imageStack
[countSlice
];
331 for (int y
= 0; y
< height
; y
++)
332 for (int x
= 0; x
< width
; x
++)
333 pixels
[(x
+offsetX
) + width
* ((y
+offsetY
) + (countSlice
+offsetZ
) * height
)] = (pixelTmp
[count
++] & 0xffff);
335 else // instance of float[]
336 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
338 float[] pixelTmp
= (float[])imageStack
[countSlice
];
341 for (int y
= 0; y
< height
; y
++)
342 for (int x
= 0; x
< width
; x
++)
343 pixels
[(x
+offsetX
) + wZP
* ((y
+offsetY
) + (countSlice
+offsetZ
) * hZP
)] = pixelTmp
[count
++];
349 //id + nd * (id-1 + nd-1 * (... + n2 * i1))
350 public static double[] StackToDoubleArray1D(ImageStack stack
)
352 Object
[] imageStack
= stack
.getImageArray();
353 int width
= stack
.getWidth();
354 int height
= stack
.getHeight();
355 int nstacks
= stack
.getSize();
357 if (imageStack
== null || imageStack
.length
== 0)
359 System
.out
.println("Image Stack is empty.");
363 if (imageStack
[0] instanceof int[])
365 System
.out
.println("RGB images supported at the moment.");
369 double[] pixels
= new double[width
* height
* nstacks
];
373 if (imageStack
[0] instanceof byte[])
374 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
376 byte[] pixelTmp
= (byte[])imageStack
[countSlice
];
379 for (int y
= 0; y
< height
; y
++)
380 for (int x
= 0; x
< width
; x
++)
381 pixels
[x
+ width
* (y
+ countSlice
* height
)] = (pixelTmp
[count
++] & 0xff);
383 else if (imageStack
[0] instanceof short[])
384 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
386 short[] pixelTmp
= (short[])imageStack
[countSlice
];
389 for (int y
= 0; y
< height
; y
++)
390 for (int x
= 0; x
< width
; x
++)
391 pixels
[x
+ width
* (y
+ countSlice
* height
)] = (float)(pixelTmp
[count
++] & 0xffff);
393 else // instance of float[]
394 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
396 float[] pixelTmp
= (float[])imageStack
[countSlice
];
399 for (int y
= 0; y
< height
; y
++)
400 for (int x
= 0; x
< width
; x
++)
401 pixels
[x
+ width
* (y
+ countSlice
* height
)] = pixelTmp
[count
++];
408 public static FloatArray3D
StackToFloatArray(ImageStack stack
)
410 Object
[] imageStack
= stack
.getImageArray();
411 int width
= stack
.getWidth();
412 int height
= stack
.getHeight();
413 int nstacks
= stack
.getSize();
415 if (imageStack
== null || imageStack
.length
== 0)
417 System
.out
.println("Image Stack is empty.");
421 if (imageStack
[0] instanceof int[])
423 System
.out
.println("RGB images supported at the moment.");
427 FloatArray3D pixels
= new FloatArray3D(width
, height
, nstacks
);
428 //float[][][] pixels = new float[width][height][nstacks];
432 if (imageStack
[0] instanceof byte[])
433 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
435 byte[] pixelTmp
= (byte[])imageStack
[countSlice
];
438 for (int y
= 0; y
< height
; y
++)
439 for (int x
= 0; x
< width
; x
++)
440 pixels
.data
[pixels
.getPos(x
,y
,countSlice
)] = (float)(pixelTmp
[count
++] & 0xff);
442 else if (imageStack
[0] instanceof short[])
443 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
445 short[] pixelTmp
= (short[])imageStack
[countSlice
];
448 for (int y
= 0; y
< height
; y
++)
449 for (int x
= 0; x
< width
; x
++)
450 pixels
.data
[pixels
.getPos(x
,y
,countSlice
)] = (float)(pixelTmp
[count
++] & 0xffff);
452 else // instance of float[]
453 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
455 float[] pixelTmp
= (float[])imageStack
[countSlice
];
458 for (int y
= 0; y
< height
; y
++)
459 for (int x
= 0; x
< width
; x
++)
460 pixels
.data
[pixels
.getPos(x
,y
,countSlice
)] = pixelTmp
[count
++];
467 public static float[][][] StackToFloatArrayDeprecated(ImageStack stack
)
469 Object
[] imageStack
= stack
.getImageArray();
470 int width
= stack
.getWidth();
471 int height
= stack
.getHeight();
472 int nstacks
= stack
.getSize();
474 if (imageStack
== null || imageStack
.length
== 0)
476 System
.out
.println("Image Stack is empty.");
480 if (imageStack
[0] instanceof int[])
482 System
.out
.println("RGB images supported at the moment.");
486 float[][][] pixels
= new float[width
][height
][nstacks
];
490 if (imageStack
[0] instanceof byte[])
491 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
493 byte[] pixelTmp
= (byte[])imageStack
[countSlice
];
496 for (int y
= 0; y
< height
; y
++)
497 for (int x
= 0; x
< width
; x
++)
498 pixels
[x
][y
][countSlice
] = (float)(pixelTmp
[count
++] & 0xff);
500 else if (imageStack
[0] instanceof short[])
501 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
503 short[] pixelTmp
= (short[])imageStack
[countSlice
];
506 for (int y
= 0; y
< height
; y
++)
507 for (int x
= 0; x
< width
; x
++)
508 pixels
[x
][y
][countSlice
] = (float)(pixelTmp
[count
++] & 0xffff);
510 else // instance of float[]
511 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
513 float[] pixelTmp
= (float[])imageStack
[countSlice
];
516 for (int y
= 0; y
< height
; y
++)
517 for (int x
= 0; x
< width
; x
++)
518 pixels
[x
][y
][countSlice
] = pixelTmp
[count
++];
525 public static FloatArray4D
StackToFloatArrayComplex(ImageStack stack
)
527 Object
[] imageStack
= stack
.getImageArray();
528 int width
= stack
.getWidth();
529 int height
= stack
.getHeight();
530 int nstacks
= stack
.getSize();
532 if (imageStack
== null || imageStack
.length
== 0)
534 System
.out
.println("Image Stack is empty.");
538 if (imageStack
[0] instanceof int[])
540 System
.out
.println("RGB images supported at the moment.");
544 FloatArray4D pixels
= new FloatArray4D(width
, height
, nstacks
, 2);
545 //float[][][] pixels = new float[width][height][nstacks];
549 if (imageStack
[0] instanceof byte[])
550 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
552 byte[] pixelTmp
= (byte[])imageStack
[countSlice
];
555 for (int y
= 0; y
< height
; y
++)
556 for (int x
= 0; x
< width
; x
++)
557 pixels
.data
[pixels
.getPos(x
,y
,countSlice
,0)] = (float)(pixelTmp
[count
++] & 0xff);
559 else if (imageStack
[0] instanceof short[])
560 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
562 short[] pixelTmp
= (short[])imageStack
[countSlice
];
565 for (int y
= 0; y
< height
; y
++)
566 for (int x
= 0; x
< width
; x
++)
567 pixels
.data
[pixels
.getPos(x
,y
,countSlice
,0)] = (float)(pixelTmp
[count
++] & 0xffff);
569 else // instance of float[]
570 for (int countSlice
= 0; countSlice
< nstacks
; countSlice
++)
572 float[] pixelTmp
= (float[])imageStack
[countSlice
];
575 for (int y
= 0; y
< height
; y
++)
576 for (int x
= 0; x
< width
; x
++)
577 pixels
.data
[pixels
.getPos(x
,y
,countSlice
,0)] = pixelTmp
[count
++];
584 public static int[][] ImageToIntArray(ImageProcessor ip
)
587 Object pixelArray
= ip
.getPixels();
590 if (ip
instanceof ByteProcessor
)
592 image
= new int[ip
.getWidth()][ip
.getHeight()];
593 byte[] pixels
= (byte[])pixelArray
;
595 for (int y
= 0; y
< ip
.getHeight(); y
++)
596 for (int x
= 0; x
< ip
.getWidth(); x
++)
597 image
[x
][y
] = pixels
[count
++] & 0xff;
599 else if (ip
instanceof ShortProcessor
)
601 image
= new int[ip
.getWidth()][ip
.getHeight()];
602 short[] pixels
= (short[])pixelArray
;
604 for (int y
= 0; y
< ip
.getHeight(); y
++)
605 for (int x
= 0; x
< ip
.getWidth(); x
++)
606 image
[x
][y
] = pixels
[count
++] & 0xffff;
608 else if (ip
instanceof FloatProcessor
)
610 image
= new int[ip
.getWidth()][ip
.getHeight()];
611 float[] pixels
= (float[])pixelArray
;
613 for (int y
= 0; y
< ip
.getHeight(); y
++)
614 for (int x
= 0; x
< ip
.getWidth(); x
++)
615 image
[x
][y
] = (int)pixels
[count
++];
619 image
= new int[ip
.getWidth()][ip
.getHeight()];
620 int[] pixels
= (int[])pixelArray
;
622 // still unknown how to do...
625 for (int y = 0; y < ip.getHeight(); y++)
626 for (int x = 0; x < ip.getWidth(); x++)
627 image[x][y] = pixels[count++];// & 0xffffff;
634 public static float[][] ImageToFloatArray2DDeprecated(ImageProcessor ip
)
637 Object pixelArray
= ip
.getPixels();
640 if (ip
instanceof ByteProcessor
)
642 image
= new float[ip
.getWidth()][ip
.getHeight()];
643 byte[] pixels
= (byte[])pixelArray
;
645 for (int y
= 0; y
< ip
.getHeight(); y
++)
646 for (int x
= 0; x
< ip
.getWidth(); x
++)
647 image
[x
][y
] = pixels
[count
++] & 0xff;
649 else if (ip
instanceof ShortProcessor
)
651 image
= new float[ip
.getWidth()][ip
.getHeight()];
652 short[] pixels
= (short[])pixelArray
;
654 for (int y
= 0; y
< ip
.getHeight(); y
++)
655 for (int x
= 0; x
< ip
.getWidth(); x
++)
656 image
[x
][y
] = pixels
[count
++] & 0xffff;
658 else if (ip
instanceof FloatProcessor
)
660 image
= new float[ip
.getWidth()][ip
.getHeight()];
661 float[] pixels
= (float[])pixelArray
;
663 for (int y
= 0; y
< ip
.getHeight(); y
++)
664 for (int x
= 0; x
< ip
.getWidth(); x
++)
665 image
[x
][y
] = pixels
[count
++];
669 image
= new float[ip
.getWidth()][ip
.getHeight()];
670 int[] pixels
= (int[])pixelArray
;
672 // still unknown how to do...
675 for (int y = 0; y < ip.getHeight(); y++)
676 for (int x = 0; x < ip.getWidth(); x++)
677 image[x][y] = pixels[count++];// & 0xffffff;
684 public static double[] ImageToDoubleArray1D(ImageProcessor ip
)
687 Object pixelArray
= ip
.getPixels();
690 if (ip
instanceof ByteProcessor
)
692 image
= new double[ip
.getWidth() * ip
.getHeight()];
693 byte[] pixels
= (byte[])pixelArray
;
695 for (int y
= 0; y
< ip
.getHeight(); y
++)
696 for (int x
= 0; x
< ip
.getWidth(); x
++)
697 image
[count
] = pixels
[count
++] & 0xff;
699 else if (ip
instanceof ShortProcessor
)
701 image
= new double[ip
.getWidth() * ip
.getHeight()];
702 short[] pixels
= (short[])pixelArray
;
704 for (int y
= 0; y
< ip
.getHeight(); y
++)
705 for (int x
= 0; x
< ip
.getWidth(); x
++)
706 image
[count
] = pixels
[count
++] & 0xffff;
708 else if (ip
instanceof FloatProcessor
)
710 image
= new double[ip
.getWidth() * ip
.getHeight()];
711 float[] pixels
= (float[])pixelArray
;
713 for (int y
= 0; y
< ip
.getHeight(); y
++)
714 for (int x
= 0; x
< ip
.getWidth(); x
++)
715 image
[count
] = pixels
[count
++];
719 image
= new double[ip
.getWidth() * ip
.getHeight()];
720 int[] pixels
= (int[])pixelArray
;
722 // still unknown how to do...
725 for (int y = 0; y < ip.getHeight(); y++)
726 for (int x = 0; x < ip.getWidth(); x++)
727 image[x][y] = pixels[count++];// & 0xffffff;
734 public static FloatArray2D
ImageToFloatArray2D(ImageProcessor ip
)
737 Object pixelArray
= ip
.getPixels();
740 if (ip
instanceof ByteProcessor
)
742 image
= new FloatArray2D(ip
.getWidth(), ip
.getHeight());
743 byte[] pixels
= (byte[])pixelArray
;
745 for (int y
= 0; y
< ip
.getHeight(); y
++)
746 for (int x
= 0; x
< ip
.getWidth(); x
++)
747 image
.data
[count
] = pixels
[count
++] & 0xff;
749 else if (ip
instanceof ShortProcessor
)
751 image
= new FloatArray2D(ip
.getWidth(), ip
.getHeight());
752 short[] pixels
= (short[])pixelArray
;
754 for (int y
= 0; y
< ip
.getHeight(); y
++)
755 for (int x
= 0; x
< ip
.getWidth(); x
++)
756 image
.data
[count
] = pixels
[count
++] & 0xffff;
758 else if (ip
instanceof FloatProcessor
)
760 image
= new FloatArray2D(ip
.getWidth(), ip
.getHeight());
761 float[] pixels
= (float[])pixelArray
;
763 for (int y
= 0; y
< ip
.getHeight(); y
++)
764 for (int x
= 0; x
< ip
.getWidth(); x
++)
765 image
.data
[count
] = pixels
[count
++];
769 image
= new FloatArray2D(ip
.getWidth(), ip
.getHeight());
770 int[] pixels
= (int[])pixelArray
;
772 // still unknown how to do...
775 for (int y = 0; y < ip.getHeight(); y++)
776 for (int x = 0; x < ip.getWidth(); x++)
777 image[x][y] = pixels[count++];// & 0xffffff;
784 public static void normFloatArray(FloatArray img
)
786 float min
= img
.data
[0];
787 float max
= img
.data
[0];
789 for (float f
: img
.data
)
798 for (int i
= 0; i
< img
.data
.length
; i
++)
799 img
.data
[i
] = (img
.data
[i
] - min
)/(max
-min
);
802 public static int DRAWTYPE_OVERLAP
= 0;
803 public static int DRAWTYPE_ERRORMAP
= 1;
805 public static FloatArray2D
drawTranslatedImages(FloatArray2D img1
, FloatArray2D img2
, Point shift
, int drawType
)
808 int h1
= img1
.height
;
811 int h2
= img2
.height
;
813 boolean createOverlappingImages
= (drawType
== DRAWTYPE_OVERLAP
);
814 boolean createErrorMap
= (drawType
== DRAWTYPE_ERRORMAP
);
819 int imgW
= max(w1
, w2
) + max(0, Math
.abs(sx
) - Math
.abs((w1
- w2
)));
820 int imgH
= max(h1
, h2
) + max(0, Math
.abs(sy
) - Math
.abs((h1
- h2
)));
822 FloatArray2D outputImg
= new FloatArray2D(imgW
, imgH
);
824 int offsetImg1X
= max(0, -sx
); // + max(0, max(0, -sx) - max(0, (w1 - w2)/2));
825 int offsetImg1Y
= max(0, -sy
); // + max(0, max(0, -sy) - max(0, (h1 - h2)/2));
826 int offsetImg2X
= max(0, sx
); // + max(0, max(0, sx) - max(0, (w2 - w1)/2));
827 int offsetImg2Y
= max(0, sy
); // + max(0, max(0, sy) - max(0, (h2 - h1)/2));
829 float pixel1
, pixel2
;
831 // iterate over whole image
832 for (int y
= 0; y
< imgH
; y
++)
833 for (int x
= 0; x
< imgW
; x
++)
835 pixel1
= img1
.getZero(x
- offsetImg1X
, y
- offsetImg1Y
);
836 pixel2
= img2
.getZero(x
- offsetImg2X
, y
- offsetImg2Y
);
838 if (createOverlappingImages
)
839 outputImg
.set( (pixel1
+ pixel2
) / 2f
, x
, y
);
841 // compute errors only if the images overlap
842 if (x
>= offsetImg1X
&& x
>= offsetImg2X
&&
843 x
< offsetImg1X
+ w1
&& x
< offsetImg2X
+ w2
&&
844 y
>= offsetImg1Y
&& y
>= offsetImg2Y
&&
845 y
< offsetImg1Y
+ h1
&& y
< offsetImg2Y
+ h2
)
848 outputImg
.set( (pixel1
+ pixel2
) / 2f
, x
, y
);
855 public static FloatArray2D
zeroPad(FloatArray2D ip
, int width
, int height
)
857 FloatArray2D image
= new FloatArray2D(width
, height
);
859 int offsetX
= (width
- ip
.width
)/2;
860 int offsetY
= (height
- ip
.height
)/2;
864 System
.err
.println("mpi.fruitfly.general.ImageArrayConverter.ZeroPad(): Zero-Padding size in X smaller than image! " + width
+ " < " + ip
.width
);
870 System
.err
.println("mpi.fruitfly.general.ImageArrayConverter.ZeroPad(): Zero-Padding size in Y smaller than image! " + height
+ " < " + ip
.height
);
876 for (int y
= 0; y
< ip
.height
; y
++)
877 for (int x
= 0; x
< ip
.width
; x
++)
878 image
.set(ip
.data
[count
++], x
+offsetX
, y
+offsetY
);
884 public static FloatArray2D
ImageToFloatArray2DZeroPadding(ImageProcessor ip
, int width
, int height
)
886 FloatArray2D image
= new FloatArray2D(width
, height
);
887 Object pixelArray
= ip
.getPixels();
890 int offsetX
= (width
- ip
.getWidth())/2;
891 int offsetY
= (height
- ip
.getHeight())/2;
895 System
.err
.println("mpi.fruitfly.general.ImageArrayConverter.ImageToFloatArray2DZeroPadding(): Zero-Padding size in X smaller than image! " + width
+ " < " + ip
.getWidth());
901 System
.err
.println("mpi.fruitfly.general.ImageArrayConverter.ImageToFloatArray2DZeroPadding(): Zero-Padding size in Y smaller than image! " + height
+ " < " + ip
.getHeight());
905 if (ip
instanceof ByteProcessor
)
907 byte[] pixels
= (byte[])pixelArray
;
909 for (int y
= 0; y
< ip
.getHeight(); y
++)
910 for (int x
= 0; x
< ip
.getWidth(); x
++)
911 image
.set(pixels
[count
++] & 0xff, x
+offsetX
, y
+offsetY
);
913 else if (ip
instanceof ShortProcessor
)
915 short[] pixels
= (short[])pixelArray
;
917 for (int y
= 0; y
< ip
.getHeight(); y
++)
918 for (int x
= 0; x
< ip
.getWidth(); x
++)
919 image
.set(pixels
[count
++] & 0xffff, x
+offsetX
, y
+offsetY
);
921 else if (ip
instanceof FloatProcessor
)
923 float[] pixels
= (float[])pixelArray
;
925 for (int y
= 0; y
< ip
.getHeight(); y
++)
926 for (int x
= 0; x
< ip
.getWidth(); x
++)
927 image
.set(pixels
[count
++], x
+offsetX
, y
+offsetY
);
931 int[] pixels
= (int[])pixelArray
;
933 // still unknown how to do...
936 for (int y = 0; y < ip.getHeight(); y++)
937 for (int x = 0; x < ip.getWidth(); x++)
938 image[x][y] = pixels[count++];// & 0xffffff;
946 public static double[] ImageToDoubleArray1DZeroPadding(ImageProcessor ip
, int width
, int height
)
949 Object pixelArray
= ip
.getPixels();
952 int offsetX
= (width
- ip
.getWidth())/2;
953 int offsetY
= (height
- ip
.getHeight())/2;
957 System
.err
.println("mpi.fruitfly.general.ImageArrayConverter.ImageToDoubleArray1DZeroPadding(): Zero-Padding size in X smaller than image! " + width
+ " < " + ip
.getWidth());
963 System
.err
.println("mpi.fruitfly.general.ImageArrayConverter.ImageToDoubleArray1DZeroPadding(): Zero-Padding size in Y smaller than image! " + height
+ " < " + ip
.getHeight());
967 if (ip
instanceof ByteProcessor
)
969 image
= new double[width
* height
];
970 byte[] pixels
= (byte[])pixelArray
;
972 for (int y
= 0; y
< ip
.getHeight(); y
++)
973 for (int x
= 0; x
< ip
.getWidth(); x
++)
974 image
[(y
+offsetY
)*width
+ x
+ offsetX
] = pixels
[count
++] & 0xff;
976 else if (ip
instanceof ShortProcessor
)
978 image
= new double[width
* height
];
979 short[] pixels
= (short[])pixelArray
;
981 for (int y
= 0; y
< ip
.getHeight(); y
++)
982 for (int x
= 0; x
< ip
.getWidth(); x
++)
983 image
[(y
+offsetY
)*width
+ x
+ offsetX
] = pixels
[count
++] & 0xffff;
985 else if (ip
instanceof FloatProcessor
)
987 image
= new double[width
* height
];
988 float[] pixels
= (float[])pixelArray
;
990 for (int y
= 0; y
< ip
.getHeight(); y
++)
991 for (int x
= 0; x
< ip
.getWidth(); x
++)
992 image
[(y
+offsetY
)*width
+ x
+ offsetX
] = pixels
[count
++];
996 image
= new double[width
* height
];
997 int[] pixels
= (int[])pixelArray
;
999 // still unknown how to do...
1002 for (int y = 0; y < ip.getHeight(); y++)
1003 for (int x = 0; x < ip.getWidth(); x++)
1004 image[x][y] = pixels[count++];// & 0xffffff;
1011 public static void ArrayToByteProcessor(ImageProcessor ip
, int[][] pixels
)
1013 byte[] data
= new byte[pixels
.length
* pixels
[0].length
];
1016 for (int y
= 0; y
< pixels
[0].length
; y
++)
1017 for (int x
= 0; x
< pixels
.length
; x
++)
1018 data
[count
++] = (byte)(pixels
[x
][y
] & 0xff);
1023 public static void ArrayToByteProcessor(ImageProcessor ip
, float[][] pixels
)
1025 byte[] data
= new byte[pixels
.length
* pixels
[0].length
];
1028 for (int y
= 0; y
< pixels
[0].length
; y
++)
1029 for (int x
= 0; x
< pixels
.length
; x
++)
1030 data
[count
++] = (byte)(((int)pixels
[x
][y
]) & 0xff);
1035 public static void ArrayToFloatProcessor(ImageProcessor ip
, double[] pixels
, int width
, int height
)
1037 float[] data
= new float[width
* height
];
1040 for (int y
= 0; y
< height
; y
++)
1041 for (int x
= 0; x
< width
; x
++)
1042 data
[count
] = (float)pixels
[count
++];
1045 ip
.resetMinAndMax();
1048 public static void ArrayToFloatProcessor(ImageProcessor ip
, float[] pixels
, int width
, int height
)
1050 float[] data
= new float[width
* height
];
1053 for (int y
= 0; y
< height
; y
++)
1054 for (int x
= 0; x
< width
; x
++)
1055 data
[count
] = (float)pixels
[count
++];
1058 ip
.resetMinAndMax();
1061 public static void FloatArrayToFloatProcessor(ImageProcessor ip
, FloatArray2D pixels
)
1063 float[] data
= new float[pixels
.width
* pixels
.height
];
1066 for (int y
= 0; y
< pixels
.height
; y
++)
1067 for (int x
= 0; x
< pixels
.width
; x
++)
1068 data
[count
] = pixels
.data
[count
++];
1071 ip
.resetMinAndMax();
1074 public static void normPixelValuesToByte(int[][] pixels
, boolean cutoff
)
1076 int max
= 0, min
= 255;
1078 // check minmal and maximal values or cut of values that are higher or lower than 255 resp. 0
1079 for (int y
= 0; y
< pixels
[0].length
; y
++)
1080 for (int x
= 0; x
< pixels
.length
; x
++)
1084 if (pixels
[x
][y
] < 0)
1087 if (pixels
[x
][y
] > 255)
1092 if (pixels
[x
][y
] < min
)
1095 if (pixels
[x
][y
] > max
)
1104 // if they do not match bytevalues we have to do something
1105 if (max
> 255 || min
< 0)
1109 factor
= (max
-min
) / 255.0;
1111 for (int y
= 0; y
< pixels
[0].length
; y
++)
1112 for (int x
= 0; x
< pixels
.length
; x
++)
1113 pixels
[x
][y
] = (int)((pixels
[x
][y
] - min
) / factor
);
1117 public static void normPixelValuesToByte(float[][] pixels
, boolean cutoff
)
1119 float max
= 0, min
= 255;
1121 // check minmal and maximal values or cut of values that are higher or lower than 255 resp. 0
1122 for (int y
= 0; y
< pixels
[0].length
; y
++)
1123 for (int x
= 0; x
< pixels
.length
; x
++)
1127 if (pixels
[x
][y
] < 0)
1130 if (pixels
[x
][y
] > 255)
1135 if (pixels
[x
][y
] < min
)
1138 if (pixels
[x
][y
] > max
)
1147 // if they do not match bytevalues we have to do something
1148 if (max
> 255 || min
< 0)
1152 factor
= (max
-min
) / 255.0;
1154 for (int y
= 0; y
< pixels
[0].length
; y
++)
1155 for (int x
= 0; x
< pixels
.length
; x
++)
1156 pixels
[x
][y
] = (int)((pixels
[x
][y
] - min
) / factor
);
1160 public static void normPixelValuesToByte(float[][][] pixels
, boolean cutoff
)
1162 float max
= 0, min
= 255;
1164 // check minmal and maximal values or cut of values that are higher or lower than 255 resp. 0
1165 for (int z
= 0; z
< pixels
[0][0].length
; z
++)
1166 for (int y
= 0; y
< pixels
[0].length
; y
++)
1167 for (int x
= 0; x
< pixels
.length
; x
++)
1171 if (pixels
[x
][y
][z
] < 0)
1172 pixels
[x
][y
][z
] = 0;
1174 if (pixels
[x
][y
][z
] > 255)
1175 pixels
[x
][y
][z
] = 255;
1179 if (pixels
[x
][y
][z
] < min
)
1180 min
= pixels
[x
][y
][z
];
1182 if (pixels
[x
][y
][z
] > max
)
1183 max
= pixels
[x
][y
][z
];
1191 // if they do not match bytevalues we have to do something
1192 if (max
> 255 || min
< 0)
1196 factor
= (max
-min
) / 255.0;
1198 for (int z
= 0; z
< pixels
[0][0].length
; z
++)
1199 for (int y
= 0; y
< pixels
[0].length
; y
++)
1200 for (int x
= 0; x
< pixels
.length
; x
++)
1201 pixels
[x
][y
][z
] = (int)((pixels
[x
][y
][z
] - min
) / factor
);