Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ A Java library to link QuPath with ImgLib2.
Here is a sample script that shows how to use the library from QuPath:

```groovy
import qupath.ext.imglib2.ImgCreator
import qupath.ext.imglib2.ImgBuilder
import qupath.ext.imglib2.ImgLib2ImageServer
import net.imglib2.type.numeric.ARGBType

Expand All @@ -16,13 +16,13 @@ var server = getCurrentServer()

// Create Img<T> from level
var level = 0
var img = ImgCreator.builder(server).build().createForLevel(level)
var img = ImgBuilder.createBuilder(server).build().createForLevel(level)
println img


// Create RandomAccessibleInterval<T> from downsample
var downsample = 1
var randomAccessible = ImgCreator.builder(server).build().createForDownsample(downsample)
var randomAccessible = ImgBuilder.createBuilder(server).build().createForDownsample(downsample)
println randomAccessible


Expand All @@ -37,17 +37,17 @@ var type = new ARGBType() // only valid if server represents a RGB image. Othe
// net.imglib2.type.numeric.integer.IntType for INT32 images
// net.imglib2.type.numeric.real.FloatType for FLOAT32 images
// net.imglib2.type.numeric.real.DoubleType for FLOAT64 images
var safeImg = ImgCreator.builder(server, type).build().createForLevel(level)
var safeImg = ImgBuilder.createBuilder(server, type).build().createForLevel(level)
println safeImg


// Once you have an image (or random accessible), you can use regular ImgLib2 functions
// For example, to read the pixel located at [x:1, y:2; c:0; z:0; t:0]:
var randomAccess = randomAccessible.randomAccess()

var position = new long[ImgCreator.NUMBER_OF_AXES]
position[ImgCreator.AXIS_X] = 1
position[ImgCreator.AXIS_Y] = 2
var position = new long[ImgBuilder.NUMBER_OF_AXES]
position[ImgBuilder.AXIS_X] = 1
position[ImgBuilder.AXIS_Y] = 2

var pixel = randomAccess.setPositionAndGet(position)
println pixel
Expand Down
458 changes: 458 additions & 0 deletions src/main/java/qupath/ext/imglib2/ImgBuilder.java

Large diffs are not rendered by default.

406 changes: 0 additions & 406 deletions src/main/java/qupath/ext/imglib2/ImgCreator.java

This file was deleted.

132 changes: 67 additions & 65 deletions src/main/java/qupath/ext/imglib2/ImgLib2ImageServer.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;

import net.imglib2.img.basictypeaccess.IntAccess;
import net.imglib2.img.basictypeaccess.volatiles.VolatileAccess;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;

import net.imglib2.img.basictypeaccess.ByteAccess;
import net.imglib2.img.basictypeaccess.volatiles.VolatileAccess;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;

import net.imglib2.img.basictypeaccess.DoubleAccess;
import net.imglib2.img.basictypeaccess.volatiles.VolatileAccess;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;

import net.imglib2.img.basictypeaccess.FloatAccess;
import net.imglib2.img.basictypeaccess.volatiles.VolatileAccess;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;

import net.imglib2.img.basictypeaccess.IntAccess;
import net.imglib2.img.basictypeaccess.volatiles.VolatileAccess;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;

import net.imglib2.img.basictypeaccess.ShortAccess;
import net.imglib2.img.basictypeaccess.volatiles.VolatileAccess;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
* This package contains {@link net.imglib2.img.basictypeaccess.DataAccess} whose values are taken
* from {@link java.awt.image.BufferedImage} or {@link java.awt.image.Raster}.
*/
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;
2 changes: 1 addition & 1 deletion src/main/java/qupath/ext/imglib2/package-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* This package contains classes to create and work with ImgLib2 accessibles from QuPath {@link qupath.lib.images.servers.ImageServer}:
* <ul>
* <li>
* The {@link qupath.ext.imglib2.ImgCreator} class create {@link net.imglib2.img.Img} or {@link net.imglib2.RandomAccessibleInterval}
* The {@link qupath.ext.imglib2.ImgBuilder} class create {@link net.imglib2.img.Img} or {@link net.imglib2.RandomAccessibleInterval}
* from {@link qupath.lib.images.servers.ImageServer}.
* </li>
* <li>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package qupath.ext.imglib2;

import net.imglib2.RandomAccessibleInterval;
import net.imglib2.img.Img;
import net.imglib2.type.numeric.ARGBType;
import net.imglib2.type.numeric.integer.ByteType;
import net.imglib2.type.numeric.integer.IntType;
Expand Down Expand Up @@ -36,15 +35,15 @@
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class TestImgCreator {
public class TestImgBuilder {

@Test
void Check_Rgb_Server() throws Exception {
boolean isRgb = true;
PixelType pixelType = PixelType.UINT8;
ImageServer<BufferedImage> imageServer = new GenericImageServer(isRgb, pixelType);

Img<ARGBType> img = ImgCreator.builder(imageServer, new ARGBType()).build().createForLevel(0);
RandomAccessibleInterval<ARGBType> img = ImgBuilder.createBuilder(imageServer, new ARGBType()).buildForLevel(0);

Utils.assertArgbRandomAccessibleEquals(img, (x, y, channel, z, t) -> ARGBType.rgba(255, 0, 0, 0), 1);

Expand All @@ -57,7 +56,7 @@ void Check_Uint8_Server() throws Exception {
PixelType pixelType = PixelType.UINT8;
ImageServer<BufferedImage> imageServer = new GenericImageServer(isRgb, pixelType);

Img<UnsignedByteType> img = ImgCreator.builder(imageServer, new UnsignedByteType()).build().createForLevel(0);
RandomAccessibleInterval<UnsignedByteType> img = ImgBuilder.createBuilder(imageServer, new UnsignedByteType()).buildForLevel(0);

Utils.assertRandomAccessibleEquals(img, (x, y, channel, z, t) -> 1, 1);

Expand All @@ -70,7 +69,7 @@ void Check_Int8_Server() throws Exception {
PixelType pixelType = PixelType.INT8;
ImageServer<BufferedImage> imageServer = new GenericImageServer(isRgb, pixelType);

Img<ByteType> img = ImgCreator.builder(imageServer, new ByteType()).build().createForLevel(0);
RandomAccessibleInterval<ByteType> img = ImgBuilder.createBuilder(imageServer, new ByteType()).buildForLevel(0);

Utils.assertRandomAccessibleEquals(img, (x, y, channel, z, t) -> 1, 1);

Expand All @@ -83,7 +82,7 @@ void Check_Uint16_Server() throws Exception {
PixelType pixelType = PixelType.UINT16;
ImageServer<BufferedImage> imageServer = new GenericImageServer(isRgb, pixelType);

Img<UnsignedShortType> img = ImgCreator.builder(imageServer, new UnsignedShortType()).build().createForLevel(0);
RandomAccessibleInterval<UnsignedShortType> img = ImgBuilder.createBuilder(imageServer, new UnsignedShortType()).buildForLevel(0);

Utils.assertRandomAccessibleEquals(img, (x, y, channel, z, t) -> 1, 1);

Expand All @@ -96,7 +95,7 @@ void Check_Int16_Server() throws Exception {
PixelType pixelType = PixelType.INT16;
ImageServer<BufferedImage> imageServer = new GenericImageServer(isRgb, pixelType);

Img<ShortType> img = ImgCreator.builder(imageServer, new ShortType()).build().createForLevel(0);
RandomAccessibleInterval<ShortType> img = ImgBuilder.createBuilder(imageServer, new ShortType()).buildForLevel(0);

Utils.assertRandomAccessibleEquals(img, (x, y, channel, z, t) -> 1, 1);

Expand All @@ -109,7 +108,7 @@ void Check_Uint32_Server() throws Exception {
PixelType pixelType = PixelType.UINT32;
ImageServer<BufferedImage> imageServer = new GenericImageServer(isRgb, pixelType);

Img<UnsignedIntType> img = ImgCreator.builder(imageServer, new UnsignedIntType()).build().createForLevel(0);
RandomAccessibleInterval<UnsignedIntType> img = ImgBuilder.createBuilder(imageServer, new UnsignedIntType()).buildForLevel(0);

Utils.assertRandomAccessibleEquals(img, (x, y, channel, z, t) -> 1, 1);

Expand All @@ -122,7 +121,7 @@ void Check_Int32_Server() throws Exception {
PixelType pixelType = PixelType.INT32;
ImageServer<BufferedImage> imageServer = new GenericImageServer(isRgb, pixelType);

Img<IntType> img = ImgCreator.builder(imageServer, new IntType()).build().createForLevel(0);
RandomAccessibleInterval<IntType> img = ImgBuilder.createBuilder(imageServer, new IntType()).buildForLevel(0);

Utils.assertRandomAccessibleEquals(img, (x, y, channel, z, t) -> 1, 1);

Expand All @@ -135,7 +134,7 @@ void Check_Float32_Server() throws Exception {
PixelType pixelType = PixelType.FLOAT32;
ImageServer<BufferedImage> imageServer = new GenericImageServer(isRgb, pixelType);

Img<FloatType> img = ImgCreator.builder(imageServer, new FloatType()).build().createForLevel(0);
RandomAccessibleInterval<FloatType> img = ImgBuilder.createBuilder(imageServer, new FloatType()).buildForLevel(0);

Utils.assertRandomAccessibleEquals(img, (x, y, channel, z, t) -> 1, 1);

Expand All @@ -148,7 +147,7 @@ void Check_Float64_Server() throws Exception {
PixelType pixelType = PixelType.FLOAT64;
ImageServer<BufferedImage> imageServer = new GenericImageServer(isRgb, pixelType);

Img<DoubleType> img = ImgCreator.builder(imageServer, new DoubleType()).build().createForLevel(0);
RandomAccessibleInterval<DoubleType> img = ImgBuilder.createBuilder(imageServer, new DoubleType()).buildForLevel(0);

Utils.assertRandomAccessibleEquals(img, (x, y, channel, z, t) -> 1, 1);

Expand All @@ -159,8 +158,8 @@ void Check_Float64_Server() throws Exception {
void Check_X_Dimension_Size() throws Exception {
ImageServer<BufferedImage> imageServer = new ComplexDoubleImageServer();
int expectedSize = imageServer.getWidth();
Img<?> img = ImgCreator.builder(imageServer).build().createForLevel(0);
int dimensionIndex = ImgCreator.AXIS_X;
RandomAccessibleInterval<?> img = ImgBuilder.createBuilder(imageServer).buildForLevel(0);
int dimensionIndex = ImgBuilder.AXIS_X;

Assertions.assertEquals(expectedSize, img.dimension(dimensionIndex));

Expand All @@ -171,8 +170,8 @@ void Check_X_Dimension_Size() throws Exception {
void Check_Y_Dimension_Size() throws Exception {
ImageServer<BufferedImage> imageServer = new ComplexDoubleImageServer();
int expectedSize = imageServer.getHeight();
Img<?> img = ImgCreator.builder(imageServer).build().createForLevel(0);
int dimensionIndex = ImgCreator.AXIS_Y;
RandomAccessibleInterval<?> img = ImgBuilder.createBuilder(imageServer).buildForLevel(0);
int dimensionIndex = ImgBuilder.AXIS_Y;

Assertions.assertEquals(expectedSize, img.dimension(dimensionIndex));

Expand All @@ -183,8 +182,8 @@ void Check_Y_Dimension_Size() throws Exception {
void Check_Channel_Dimension_Size() throws Exception {
ImageServer<BufferedImage> imageServer = new ComplexDoubleImageServer();
int expectedSize = imageServer.nChannels();
Img<?> img = ImgCreator.builder(imageServer).build().createForLevel(0);
int dimensionIndex = ImgCreator.AXIS_CHANNEL;
RandomAccessibleInterval<?> img = ImgBuilder.createBuilder(imageServer).buildForLevel(0);
int dimensionIndex = ImgBuilder.AXIS_CHANNEL;

Assertions.assertEquals(expectedSize, img.dimension(dimensionIndex));

Expand All @@ -195,8 +194,8 @@ void Check_Channel_Dimension_Size() throws Exception {
void Check_Z_Dimension_Size() throws Exception {
ImageServer<BufferedImage> imageServer = new ComplexDoubleImageServer();
int expectedSize = imageServer.getMetadata().getSizeZ();
Img<?> img = ImgCreator.builder(imageServer).build().createForLevel(0);
int dimensionIndex = ImgCreator.AXIS_Z;
RandomAccessibleInterval<?> img = ImgBuilder.createBuilder(imageServer).buildForLevel(0);
int dimensionIndex = ImgBuilder.AXIS_Z;

Assertions.assertEquals(expectedSize, img.dimension(dimensionIndex));

Expand All @@ -207,8 +206,8 @@ void Check_Z_Dimension_Size() throws Exception {
void Check_Time_Dimension_Size() throws Exception {
ImageServer<BufferedImage> imageServer = new ComplexDoubleImageServer();
int expectedSize = imageServer.getMetadata().getSizeT();
Img<?> img = ImgCreator.builder(imageServer).build().createForLevel(0);
int dimensionIndex = ImgCreator.AXIS_TIME;
RandomAccessibleInterval<?> img = ImgBuilder.createBuilder(imageServer).buildForLevel(0);
int dimensionIndex = ImgBuilder.AXIS_TIME;

Assertions.assertEquals(expectedSize, img.dimension(dimensionIndex));

Expand All @@ -221,7 +220,7 @@ void Check_Pixels_Of_Level_0() throws Exception {
ImageServer<BufferedImage> imageServer = new ComplexDoubleImageServer();
double downsample = imageServer.getDownsampleForResolution(level);

Img<DoubleType> img = ImgCreator.builder(imageServer, new DoubleType()).build().createForLevel(level);
RandomAccessibleInterval<DoubleType> img = ImgBuilder.createBuilder(imageServer, new DoubleType()).buildForLevel(level);

Utils.assertRandomAccessibleEquals(img, ComplexDoubleImageServer::getPixel, downsample);

Expand All @@ -234,7 +233,7 @@ void Check_Pixels_Of_Level_1() throws Exception {
ImageServer<BufferedImage> imageServer = new ComplexDoubleImageServer();
double downsample = imageServer.getDownsampleForResolution(level);

Img<DoubleType> img = ImgCreator.builder(imageServer, new DoubleType()).build().createForLevel(level);
RandomAccessibleInterval<DoubleType> img = ImgBuilder.createBuilder(imageServer, new DoubleType()).buildForLevel(level);

Utils.assertRandomAccessibleEquals(img, ComplexDoubleImageServer::getPixel, downsample);

Expand All @@ -247,7 +246,7 @@ void Check_Pixels_Of_Downsample_1() throws Exception {
ImageServer<BufferedImage> imageServer = new ComplexDoubleImageServer();
double downsample = imageServer.getDownsampleForResolution(level);

RandomAccessibleInterval<DoubleType> img = ImgCreator.builder(imageServer, new DoubleType()).build().createForDownsample(downsample);
RandomAccessibleInterval<DoubleType> img = ImgBuilder.createBuilder(imageServer, new DoubleType()).buildForDownsample(downsample);

Utils.assertRandomAccessibleEquals(img, ComplexDoubleImageServer::getPixel, downsample);

Expand All @@ -260,7 +259,7 @@ void Check_Pixels_Of_Downsample_4() throws Exception {
ImageServer<BufferedImage> imageServer = new ComplexDoubleImageServer();
double downsample = imageServer.getDownsampleForResolution(level);

RandomAccessibleInterval<DoubleType> img = ImgCreator.builder(imageServer, new DoubleType()).build().createForDownsample(downsample);
RandomAccessibleInterval<DoubleType> img = ImgBuilder.createBuilder(imageServer, new DoubleType()).buildForDownsample(downsample);

Utils.assertRandomAccessibleEquals(img, ComplexDoubleImageServer::getPixel, downsample);

Expand Down
40 changes: 20 additions & 20 deletions src/test/java/qupath/ext/imglib2/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,11 @@ public static <T extends NativeType<T> & RealType<T>> Img<T> createImg(long[] di

cursor.localize(position);
int index = Math.toIntExact(
position[ImgCreator.AXIS_X] +
position[ImgCreator.AXIS_Y] * dimensions[ImgCreator.AXIS_X] +
position[ImgCreator.AXIS_CHANNEL] * dimensions[ImgCreator.AXIS_X] * dimensions[ImgCreator.AXIS_Y] +
position[ImgCreator.AXIS_Z] * dimensions[ImgCreator.AXIS_X] * dimensions[ImgCreator.AXIS_Y] * dimensions[ImgCreator.AXIS_CHANNEL] +
position[ImgCreator.AXIS_TIME] * dimensions[ImgCreator.AXIS_X] * dimensions[ImgCreator.AXIS_Y] * dimensions[ImgCreator.AXIS_CHANNEL] * dimensions[ImgCreator.AXIS_Z]
position[ImgBuilder.AXIS_X] +
position[ImgBuilder.AXIS_Y] * dimensions[ImgBuilder.AXIS_X] +
position[ImgBuilder.AXIS_CHANNEL] * dimensions[ImgBuilder.AXIS_X] * dimensions[ImgBuilder.AXIS_Y] +
position[ImgBuilder.AXIS_Z] * dimensions[ImgBuilder.AXIS_X] * dimensions[ImgBuilder.AXIS_Y] * dimensions[ImgBuilder.AXIS_CHANNEL] +
position[ImgBuilder.AXIS_TIME] * dimensions[ImgBuilder.AXIS_X] * dimensions[ImgBuilder.AXIS_Y] * dimensions[ImgBuilder.AXIS_CHANNEL] * dimensions[ImgBuilder.AXIS_Z]
);

value.setReal(pixels[index]);
Expand All @@ -85,11 +85,11 @@ public static Img<ARGBType> createArgbImg(long[] dimensions, int[] pixels) {

cursor.localize(position);
int index = Math.toIntExact(
position[ImgCreator.AXIS_X] +
position[ImgCreator.AXIS_Y] * dimensions[ImgCreator.AXIS_X] +
position[ImgCreator.AXIS_CHANNEL] * dimensions[ImgCreator.AXIS_X] * dimensions[ImgCreator.AXIS_Y] +
position[ImgCreator.AXIS_Z] * dimensions[ImgCreator.AXIS_X] * dimensions[ImgCreator.AXIS_Y] * dimensions[ImgCreator.AXIS_CHANNEL] +
position[ImgCreator.AXIS_TIME] * dimensions[ImgCreator.AXIS_X] * dimensions[ImgCreator.AXIS_Y] * dimensions[ImgCreator.AXIS_CHANNEL] * dimensions[ImgCreator.AXIS_Z]
position[ImgBuilder.AXIS_X] +
position[ImgBuilder.AXIS_Y] * dimensions[ImgBuilder.AXIS_X] +
position[ImgBuilder.AXIS_CHANNEL] * dimensions[ImgBuilder.AXIS_X] * dimensions[ImgBuilder.AXIS_Y] +
position[ImgBuilder.AXIS_Z] * dimensions[ImgBuilder.AXIS_X] * dimensions[ImgBuilder.AXIS_Y] * dimensions[ImgBuilder.AXIS_CHANNEL] +
position[ImgBuilder.AXIS_TIME] * dimensions[ImgBuilder.AXIS_X] * dimensions[ImgBuilder.AXIS_Y] * dimensions[ImgBuilder.AXIS_CHANNEL] * dimensions[ImgBuilder.AXIS_Z]
);

value.set(pixels[index]);
Expand All @@ -108,11 +108,11 @@ public static <T extends RealType<T>> void assertRandomAccessibleEquals(RandomAc

Assertions.assertEquals(
pixelGetter.get(
(int) (position[ImgCreator.AXIS_X] * downsample),
(int) (position[ImgCreator.AXIS_Y] * downsample),
position[ImgCreator.AXIS_CHANNEL],
position[ImgCreator.AXIS_Z],
position[ImgCreator.AXIS_TIME]
(int) (position[ImgBuilder.AXIS_X] * downsample),
(int) (position[ImgBuilder.AXIS_Y] * downsample),
position[ImgBuilder.AXIS_CHANNEL],
position[ImgBuilder.AXIS_Z],
position[ImgBuilder.AXIS_TIME]
),
pixel.getRealDouble()
);
Expand All @@ -129,11 +129,11 @@ public static void assertArgbRandomAccessibleEquals(RandomAccessibleInterval<ARG

Assertions.assertEquals(
pixelGetter.get(
(int) (position[ImgCreator.AXIS_X] * downsample),
(int) (position[ImgCreator.AXIS_Y] * downsample),
position[ImgCreator.AXIS_CHANNEL],
position[ImgCreator.AXIS_Z],
position[ImgCreator.AXIS_TIME]
(int) (position[ImgBuilder.AXIS_X] * downsample),
(int) (position[ImgBuilder.AXIS_Y] * downsample),
position[ImgBuilder.AXIS_CHANNEL],
position[ImgBuilder.AXIS_Z],
position[ImgBuilder.AXIS_TIME]
),
pixel.get()
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;

import net.imglib2.img.basictypeaccess.IntAccess;
import net.imglib2.type.numeric.ARGBType;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package qupath.ext.imglib2.bufferedimageaccesses;
package qupath.ext.imglib2.accesses;

import net.imglib2.img.basictypeaccess.ByteAccess;
import org.junit.jupiter.api.Assertions;
Expand Down
Loading