feat: Add resample transmission image and positioning image.

This commit is contained in:
sunwen
2025-06-27 15:59:25 +08:00
parent 049b7068d7
commit 0852e076b3
5 changed files with 120 additions and 8 deletions

View File

@@ -70,6 +70,8 @@ namespace {
{
switch (aType)
{
case Recon::DICOMExporter::SOS:
case Recon::DICOMExporter::ATT:
case Recon::DICOMExporter::REFL:
case Recon::DICOMExporter::CoronalPositioning:
return Aurora::transpose(flipHorizontal(aImage));
@@ -344,7 +346,7 @@ namespace Recon
RECON_INFO("Save DICOM to Path:{0}, type:{1}==================>",path,(int)type);
}
void DICOMExporter::exportDICOM(Aurora::Matrix aMatrix, const Aurora::Matrix& aOriginMatrix, ImageType type)
void DICOMExporter::exportPositioningDICOM(Aurora::Matrix aMatrix, const Aurora::Matrix& aOriginMatrix, ImageType type)
{
int XYZ [3] = {aMatrix.getDimSize(0),aMatrix.getDimSize(1), aMatrix.getDimSize(2)};
int originXYZ[3] = {aOriginMatrix.getDimSize(0),aOriginMatrix.getDimSize(1), aOriginMatrix.getDimSize(2)};

View File

@@ -34,7 +34,7 @@ public:
~DICOMExporter();
void setExportBasePath(const std::string & path);
void exportDICOM(Aurora::Matrix aMatrix, ImageType type);
void exportDICOM(Aurora::Matrix aMatrix, const Aurora::Matrix& aOriginMatrix, ImageType type);
void exportPositioningDICOM(Aurora::Matrix aMatrix, const Aurora::Matrix& aOriginMatrix, ImageType type);
private:
std::string mBasePath;

View File

@@ -0,0 +1,79 @@
#include "createPositioningImage.h"
using namespace Recon;
Aurora::Matrix Recon::createCoronalPlaneImage(const Aurora::Matrix& a3DImage)
{
if(a3DImage.isNull())
{
return Aurora::Matrix();
}
int row = a3DImage.getDimSize(0);
int column = a3DImage.getDimSize(1);
int resultSize = row * column;
int slice = a3DImage.getDimSize(2);
Aurora::Matrix result = a3DImage.block(2,0,0);
for(int i=1; i<slice; ++i)
{
for(int j=0;j<resultSize;++j)
{
if(result.getData()[j] < a3DImage.getData()[resultSize * i + j])
{
result.getData()[j] = a3DImage.getData()[resultSize * i + j];
}
}
}
return result;
}
Aurora::Matrix Recon::createSagittalPlaneImage(const Aurora::Matrix& a3DImage)
{
if(a3DImage.isNull())
{
return Aurora::Matrix();
}
int row = a3DImage.getDimSize(0);
int column = a3DImage.getDimSize(2);
int resultSize = row * column;
int slice = a3DImage.getDimSize(1);
Aurora::Matrix result = a3DImage.block(1,0,0);
result.forceReshape(result.getDimSize(0), result.getDimSize(2), 1);
for(int i=1; i<slice; ++i)
{
auto nextSlice = a3DImage.block(1,i,i);
for(int j=0;j<resultSize;++j)
{
if(result[j] < nextSlice[j])
{
result[j] = nextSlice[j];
}
}
}
return result;
}
Aurora::Matrix Recon::createTransversePlaneImage(const Aurora::Matrix& a3DImage)
{
if(a3DImage.isNull())
{
return Aurora::Matrix();
}
int row = a3DImage.getDimSize(1);
int column = a3DImage.getDimSize(2);
int resultSize = row * column;
int slice = a3DImage.getDimSize(0);
Aurora::Matrix result = a3DImage.block(0,0,0);
result.forceReshape(result.getDimSize(1), result.getDimSize(2), 1);
for(int i=1; i<slice; ++i)
{
auto nextSlice = a3DImage.block(0,i,i);
for(int j=0;j<resultSize;++j)
{
if(result[j] < nextSlice[j])
{
result[j] = nextSlice[j];
}
}
}
return result;
}

View File

@@ -0,0 +1,13 @@
#ifndef __CREATEPOSITIONINGIMAGE_H__
#define __CREATEPOSITIONINGIMAGE_H__
#include "Matrix.h"
namespace Recon
{
Aurora::Matrix createCoronalPlaneImage(const Aurora::Matrix& a3DImage);
Aurora::Matrix createSagittalPlaneImage(const Aurora::Matrix& a3DImage);
Aurora::Matrix createTransversePlaneImage(const Aurora::Matrix& a3DImage);
}
#endif // __CREATEPOSITIONINGIMAGE_H__

View File

@@ -19,7 +19,9 @@
#include "common/getGeometryInfo.h"
#include "common/estimatePulseLength.h"
#include "common/ceMatchedFilterHandling.h"
#include "common/createPositioningImage.h"
#include "transmissionReconstruction/startTransmissionReconstruction.h"
#include "transmissionReconstruction/saveTransmissionImagesInReflCoords.h"
#include "reflectionReconstruction/preprocessData/estimateOffset.h"
#include "reflectionReconstruction/preprocessData/precalcImageParameters.h"
#include "reflectionReconstruction/preprocessData/preprocessTransmissionReconstructionForReflection.h"
@@ -159,6 +161,7 @@ int Recon::startReconstructions( const std::string& aDataPath, const std::string
TransmissionReconstructionResult transmissionResult;
bool sosAvailable = false;
bool attAvailable = false;
precalcImageParameters(geom);
if(transParams::runTransmissionReco)
{
if(ceRef.measuredCEUsed)
@@ -217,17 +220,22 @@ int Recon::startReconstructions( const std::string& aDataPath, const std::string
transmissionResult = startTransmissionReconstruction(mp_inter, mpRef_inter, slList_inter, snList_inter, rlList_inter, rnList_inter, temp, tempRef, geom, geomRef, expInfo, expInfoRef, preComputes, &dataParser, &refParser);
attAvailable = true;
sosAvailable = true;
exporter.exportDICOM(transmissionResult.recoSOS, DICOMExporter::SOS);
exporter.exportDICOM(transmissionResult.recoATT, DICOMExporter::ATT);
writer.setMatrix(transmissionResult.recoSOS, "sos");
writer.setMatrix(transmissionResult.recoATT, "att");
Matrix minPos = Matrix::fromRawData(new float[3],3,1,1);
Matrix maxPos = Matrix::fromRawData(new float[3],3,1,1);
std::copy(transmissionResult.ddmis.getData(), transmissionResult.ddmis.getData() + 3, minPos.getData());
std::copy(transmissionResult.ddmis.getData() + 3, transmissionResult.ddmis.getData() + 6, maxPos.getData());
Matrix sosImage= saveTransmissionImagesInReflCoords(transmissionResult.recoSOS,minPos,maxPos);
Matrix attImage= saveTransmissionImagesInReflCoords(transmissionResult.recoATT,minPos,maxPos);
exporter.exportDICOM(sosImage, DICOMExporter::SOS);
exporter.exportDICOM(attImage, DICOMExporter::ATT);
writer.setMatrix(sosImage, "sos");
writer.setMatrix(attImage, "att");
}
if(reflectParams::runReflectionReco)
{
Matrix recoSOS = transmissionResult.recoSOS;
Matrix recoATT = transmissionResult.recoATT;
precalcImageParameters(geom);
Matrix recoATT = transmissionResult.recoATT;
//检测可使用内存是否足够,输出警报用,todo
//checkEnvAndMemory(reflectParams.imageInfos.IMAGE_XYZ);
auto preProcessData = preprocessTransmissionReconstructionForReflection(recoSOS, recoATT, transmissionResult.ddmis, geom, temp);
@@ -245,8 +253,18 @@ int Recon::startReconstructions( const std::string& aDataPath, const std::string
reflectParams::gpuSelectionList = reconParams::gpuSelectionList;
RECON_INFO("Start reflectionRecostruction.");
Matrix env = startReflectionReconstruction(&dataParser, preProcessData.saftMode, mp_inter, slList_inter, snList_inter, rlList_inter, rnList_inter, geom, preProcessData.transRecos, expInfo, preComputes);
auto transversePanel = createTransversePlaneImage(env);
auto sagittalPanel = createSagittalPlaneImage(env);
auto coronalPanel = createCoronalPlaneImage(env);
writer.setMatrix(env, "reflect");
writer.setMatrix(transversePanel, "transversePositioning");
writer.setMatrix(sagittalPanel, "sagittalPositioning");
writer.setMatrix(coronalPanel, "coronalPositioning");
exporter.exportDICOM(env, Recon::DICOMExporter::REFL);
exporter.exportPositioningDICOM(transversePanel, env, Recon::DICOMExporter::TransversePositioning);
exporter.exportPositioningDICOM(sagittalPanel, env, Recon::DICOMExporter::SagittalPositioning);
exporter.exportPositioningDICOM(coronalPanel, env, Recon::DICOMExporter::CoronalPositioning);
}
writer.write();
return 0;