feat: Add resample transmission image and positioning image.
This commit is contained in:
@@ -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)};
|
||||
|
||||
@@ -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;
|
||||
|
||||
79
src/common/createPositioningImage.cpp
Normal file
79
src/common/createPositioningImage.cpp
Normal 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;
|
||||
}
|
||||
13
src/common/createPositioningImage.h
Normal file
13
src/common/createPositioningImage.h
Normal 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__
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user