feat: Add resample transmission image function.

This commit is contained in:
sunwen
2025-06-27 13:22:31 +08:00
parent 6203a225c6
commit 049b7068d7
2 changed files with 66 additions and 0 deletions

View File

@@ -0,0 +1,56 @@
#include "saveTransmissionImagesInReflCoords.h"
#include "Function1D.h"
#include "Function2D.h"
#include "Function3D.cuh"
#include "common/meshgrid.h"
#include "config/config.h"
using namespace Aurora;
using namespace Recon;
Aurora::Matrix Recon::saveTransmissionImagesInReflCoords(const Aurora::Matrix& aTransVol, const Aurora::Matrix& aMinPos, const Aurora::Matrix& aMaxPos)
{
float resSOSX = (aMaxPos[0] - aMinPos[0]) / (aTransVol.getDimSize(0) - 1);
float resSOSY = (aMaxPos[1] - aMinPos[1]) / (aTransVol.getDimSize(1) - 1);
float resSOSZ = (aMaxPos[2] - aMinPos[2]) / (aTransVol.getDimSize(2) - 1);
Matrix XREF = createVectorMatrix(reflectParams::imageStartpoint[0] + 0.5*reflectParams::imageResolution, reflectParams::imageResolution
, reflectParams::imageEndpoint[0] + 0.5*reflectParams::imageResolution);
Matrix YREF = createVectorMatrix(reflectParams::imageStartpoint[1] + 0.5*reflectParams::imageResolution, reflectParams::imageResolution
, reflectParams::imageEndpoint[1] + 0.5*reflectParams::imageResolution);
Matrix ZREF = createVectorMatrix(reflectParams::imageStartpoint[2] + 0.5*reflectParams::imageResolution, reflectParams::imageResolution
, reflectParams::imageEndpoint[2] + 0.5*reflectParams::imageResolution);
MeshgridResult meshgridResult = meshgrid(YREF, XREF, ZREF);
XREF = meshgridResult.xx;
YREF = meshgridResult.yy;
ZREF = meshgridResult.zz;
float startX = aMinPos[0] + 0.5*resSOSX;
float dx = resSOSX;
float endX = aMaxPos[0] + 0.5*resSOSX;
float startY = aMinPos[1] + 0.5*resSOSY;
float dy = resSOSY;
float endY = aMaxPos[1] + 0.5*resSOSY;
float startZ = aMinPos[2] + 0.5*resSOSZ;
float dz = resSOSZ;
float endZ = aMaxPos[2] + 0.5*resSOSZ;
size_t dataSize = aTransVol.getDataSize();
auto newTransVol = Aurora::Matrix::fromRawData(new float[dataSize], aTransVol.getDimSize(1), aTransVol.getDimSize(0), aTransVol.getDimSize(2));
size_t sliceDataSize = aTransVol.getDimSize(0) * aTransVol.getDimSize(1);
for(int i=0;i<aTransVol.getDimSize(2);++i)
{
auto slice = transpose(aTransVol.block(2,i,i));
auto startPoint = newTransVol.getData() + i * sliceDataSize;
std::copy(slice.getData(),slice.getData() + sliceDataSize,startPoint);
}
CudaMatrix result = interp3(startX, dx, endX, startY, dy, endY,
startZ, dz, endZ, newTransVol.toDeviceMatrix(),
XREF.toDeviceMatrix(),YREF.toDeviceMatrix(), ZREF.toDeviceMatrix(), aTransVol[0]);
return result.toHostMatrix();
}

View File

@@ -0,0 +1,10 @@
#ifndef __SAVETRANSMISSIONIMAGEREFLCOORDS_H__
#define __SAVETRANSMISSIONIMAGEREFLCOORDS_H__
#include "Matrix.h"
namespace Recon
{
Aurora::Matrix saveTransmissionImagesInReflCoords(const Aurora::Matrix& aTransVol, const Aurora::Matrix& aMinPos, const Aurora::Matrix& aMaxPos);
}
#endif