59 const QVector<float>& volData,
60 const QVector<int>& dims,
61 const Matrix4f& vox2ras,
65 const int dimX = dims[0];
66 const int dimY = dims[1];
67 const int dimZ = dims[2];
72 switch (orientation) {
74 sliceIndex = std::clamp(sliceIndex, 0, dimZ - 1);
78 result.
pixels.resize(dimX, dimY);
80 for (
int iy = 0; iy < dimY; ++iy) {
81 for (
int ix = 0; ix < dimX; ++ix) {
82 result.
pixels(ix, iy) = volData[ix + dimX * (iy + dimY * sliceIndex)];
93 origin << 0.0f, 0.0f,
static_cast<float>(sliceIndex), 1.0f;
98 sliceIndex = std::clamp(sliceIndex, 0, dimY - 1);
102 result.
pixels.resize(dimX, dimZ);
104 for (
int iz = 0; iz < dimZ; ++iz) {
105 for (
int ix = 0; ix < dimX; ++ix) {
106 result.
pixels(ix, iz) = volData[ix + dimX * (sliceIndex + dimY * iz)];
116 originC << 0.0f,
static_cast<float>(sliceIndex), 0.0f, 1.0f;
121 sliceIndex = std::clamp(sliceIndex, 0, dimX - 1);
125 result.
pixels.resize(dimY, dimZ);
127 for (
int iz = 0; iz < dimZ; ++iz) {
128 for (
int iy = 0; iy < dimY; ++iy) {
129 result.
pixels(iy, iz) = volData[sliceIndex + dimX * (iy + dimY * iz)];
139 originS << static_cast<float>(sliceIndex), 0.0f, 0.0f, 1.0f;
146 float minVal = result.
pixels.minCoeff();
147 float maxVal = result.
pixels.maxCoeff();
148 if (maxVal > minVal) {
149 result.
pixels = (result.
pixels.array() - minVal) / (maxVal - minVal);
160 const QVector<float>& volData,
161 const QVector<int>& dims,
162 const Matrix4f& vox2ras,
163 const Vector3f& rasPoint)
165 Vector3i voxel =
rasToVoxel(vox2ras, rasPoint);
167 QVector<MriSliceImage> slices;
179 const Vector3f& rasPoint)
181 Matrix4f ras2vox = vox2ras.inverse();
183 rasH << rasPoint, 1.0f;
184 Vector4f voxH = ras2vox * rasH;
187 static_cast<int>(std::round(voxH.x())),
188 static_cast<int>(std::round(voxH.y())),
189 static_cast<int>(std::round(voxH.z()))
196 const Vector3i& voxel)
199 voxH << static_cast<float>(voxel.x()),
200 static_cast<float>(voxel.y()),
201 static_cast<float>(voxel.z()),
203 Vector4f rasH = vox2ras * voxH;
205 return rasH.head<3>();
223 const Vector3f& rasPoint)
232 const Vector3f& rasPoint)
240 const Vector3i& voxel)
MriSlicer class declaration.
MriVolData class declaration.
MRI volume and coordinate-system I/O (volumes, voxel geometry, transforms).
Extracted MRI slice image.
Eigen::Matrix4f sliceToRas
SliceOrientation orientation
static Eigen::Vector3f voxelToRas(const Eigen::Matrix4f &vox2ras, const Eigen::Vector3i &voxel)
static MriSliceImage extractSlice(const QVector< float > &volData, const QVector< int > &dims, const Eigen::Matrix4f &vox2ras, SliceOrientation orientation, int sliceIndex)
static Eigen::Vector3i rasToVoxel(const Eigen::Matrix4f &vox2ras, const Eigen::Vector3f &rasPoint)
static QVector< MriSliceImage > extractOrthogonal(const QVector< float > &volData, const QVector< int > &dims, const Eigen::Matrix4f &vox2ras, const Eigen::Vector3f &rasPoint)
MRI volume data from FreeSurfer MGH/MGZ file.
QVector< int > dims() const
Eigen::Matrix4f computeVox2Ras() const
QVector< float > voxelDataAsFloat() const