Skip to content
Snippets Groups Projects
Commit 459e85c5 authored by Vojtech Moravec's avatar Vojtech Moravec
Browse files

Skip step in conversion from image to 2d vectors.

parent 70972b73
Branches
No related tags found
No related merge requests found
......@@ -45,12 +45,8 @@ public class VectorQuantizationBenchmark extends BenchmarkBase {
return reconstructedChunk.asImageU16();
}
private int[][] getPlaneVectors(ImageU16 plane, V2i qVector) {
if (qVector.getY() > 1) {
return Chunk2D.chunksAsImageVectors(plane.as2dChunk().divideIntoChunks(qVector));
} else {
return plane.as2dChunk().divideInto1DVectors(qVector.getX());
}
private int[][] getPlaneVectors(final ImageU16 plane, final V2i qVector) {
return plane.toQuantizationVectors(qVector);
}
public void startBenchmark(final V2i qVector) {
......
package azgracompress.data;
import azgracompress.utilities.TypeConverter;
public class Chunk2D {
private final int FILL_VALUE = 0;
private int[] data;
......@@ -73,7 +71,6 @@ public class Chunk2D {
}
public Chunk2D[] divideIntoChunks(final V2i chunkDims) {
final int xSize = dims.getX();
final int ySize = dims.getY();
......@@ -90,6 +87,27 @@ public class Chunk2D {
return chunks;
}
public int[][] divideInto2DVectors(final V2i qVectorDims) {
final int xSize = dims.getX();
final int ySize = dims.getY();
final int chunkXSize = qVectorDims.getX();
final int chunkYSize = qVectorDims.getY();
final int chunkSize = chunkXSize * chunkYSize;
final int chunkCount = getRequiredChunkCount(qVectorDims);
int[][] vectors = new int[chunkCount][chunkSize];
int vecIndex = 0;
for (int chunkYOffset = 0; chunkYOffset < ySize; chunkYOffset += chunkYSize) {
for (int chunkXOffset = 0; chunkXOffset < xSize; chunkXOffset += chunkXSize) {
copyDataToVector(vectors[vecIndex++], qVectorDims, chunkXOffset, chunkYOffset);
}
}
return vectors;
}
private int getRequiredChunkCount(final V2i chunkDims) {
final int xChunkCount = (int) Math.ceil(dims.getX() / (double) chunkDims.getX());
final int yChunkCount = (int) Math.ceil(dims.getY() / (double) chunkDims.getY());
......@@ -152,6 +170,20 @@ public class Chunk2D {
return new Chunk2D(chunkDims, chunkOffset.toV2l(), chunkData);
}
private void copyDataToVector(int[] vector, final V2i qVectorDims, final int chunkXOffset, final int chunkYOffset) {
int srcX, srcY;
final int qVecYSize = qVectorDims.getY();
final int qVecXSize = qVectorDims.getX();
for (int y = 0; y < qVecYSize; y++) {
srcY = chunkYOffset + y;
for (int x = 0; x < qVecXSize; x++) {
srcX = chunkXOffset + x;
final int dstIndex = index(x, y, qVectorDims);
vector[dstIndex] = isInside(srcX, srcY) ? data[index(srcX, srcY)] : FILL_VALUE;
}
}
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Chunk2D) {
......@@ -198,6 +230,7 @@ public class Chunk2D {
return imageVectors;
}
public void reconstructFromVectors(int[][] vectors) {
if (vectors.length == 0) {
return;
......@@ -223,7 +256,7 @@ public class Chunk2D {
}
public ImageU16 asImageU16() {
// return new ImageU16(dims.getX(), dims.getY(), TypeConverter.intArrayToShortArray(data));
// return new ImageU16(dims.getX(), dims.getY(), TypeConverter.intArrayToShortArray(data));
return new ImageU16(dims.getX(), dims.getY(), data);
}
......@@ -232,20 +265,20 @@ public class Chunk2D {
data = newData;
}
public static int[][] chunksAsImageVectors(final Chunk2D[] chunks) {
if (chunks.length == 0) {
return new int[0][0];
}
final int vectorCount = chunks.length;
final int vectorSize = chunks[0].data.length;
int[][] imageVectors = new int[vectorCount][vectorSize];
for (int i = 0; i < vectorCount; i++) {
assert (chunks[i].data.length == vectorSize);
System.arraycopy(chunks[i].data,0,imageVectors[i],0, vectorSize);
}
return imageVectors;
}
// public static int[][] chunksAsImageVectors(final Chunk2D[] chunks) {
// if (chunks.length == 0) {
// return new int[0][0];
// }
// final int vectorCount = chunks.length;
// final int vectorSize = chunks[0].data.length;
// int[][] imageVectors = new int[vectorCount][vectorSize];
//
// for (int i = 0; i < vectorCount; i++) {
// assert (chunks[i].data.length == vectorSize);
// System.arraycopy(chunks[i].data, 0, imageVectors[i], 0, vectorSize);
// }
// return imageVectors;
// }
public static void updateChunkData(Chunk2D[] chunks, final int[][] newData) {
assert (chunks.length == newData.length) : "chunks len newData len mismatch.";
......
......@@ -55,4 +55,21 @@ public class ImageU16 {
public int getHeight() {
return height;
}
/**
* Chunk the image data into quantization vectors of requested dimension.
*
* @param qVectorDims Quantization vector dimension.
* @return Array of quantization vectors.
*/
public int[][] toQuantizationVectors(final V2i qVectorDims) {
if (qVectorDims.getY() == 1) {
// 1D row vectors.
return as2dChunk().divideInto1DVectors(qVectorDims.getX());
} else {
// 2D matrix vectors.
return as2dChunk().divideInto2DVectors(qVectorDims);
//return Chunk2D.chunksAsImageVectors(as2dChunk().divideIntoChunks(qVectorDims));
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment