Skip to content

Commit 29eae9c

Browse files
authored
Fix #2338 - Mesh generation from distance transforms. (#2339)
* Fix #2338 - Mesh generation from distance transforms. The code I had added to handle the segmentations was only meant for segmentations, not distance transforms.
1 parent d201bb5 commit 29eae9c

File tree

5 files changed

+25
-10
lines changed

5 files changed

+25
-10
lines changed

Libs/Analyze/MeshGenerator.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,10 @@ MeshHandle MeshGenerator::build_mesh_from_image(ImageType::Pointer image, float
100100
try {
101101
// only interested in 1's and 0's
102102
Image itk_image = Image(image);
103-
itk_image.binarize(0, 1);
104-
image = itk_image.getITKImage();
103+
if (!itk_image.isDistanceTransform()) {
104+
itk_image.binarize(0, 1);
105+
image = itk_image.getITKImage();
106+
}
105107

106108
// connect to VTK
107109
vtkSmartPointer<vtkImageImport> vtk_image = vtkSmartPointer<vtkImageImport>::New();

Libs/Image/Image.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -938,7 +938,7 @@ Point3 Image::centerOfMass(PixelType minVal, PixelType maxVal) const {
938938
return com;
939939
}
940940

941-
Image::StatsPtr Image::statsFilter() {
941+
Image::StatsPtr Image::statsFilter() const {
942942
using FilterType = itk::StatisticsImageFilter<ImageType>;
943943
FilterType::Pointer filter = FilterType::New();
944944

@@ -1159,6 +1159,15 @@ Image& Image::fill(PixelType value) {
11591159
return *this;
11601160
}
11611161

1162+
//-------------------------------------------------------------------------
1163+
bool Image::isDistanceTransform() const {
1164+
auto stats = statsFilter();
1165+
// examine scalar range of image
1166+
auto min = stats->GetMinimum();
1167+
auto max = stats->GetMaximum();
1168+
return (min < 0 && max > 0);
1169+
}
1170+
11621171
//-------------------------------------------------------------------------
11631172
TransformPtr Image::createCenterOfMassTransform() {
11641173
AffineTransformPtr xform(AffineTransform::New());

Libs/Image/Image.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@ class Image {
3636
using InterpolatorType = itk::LinearInterpolateImageFunction<ImageType>;
3737

3838
// constructors and assignment operators //
39-
Image(const Dims dims);
40-
Image(const std::string& pathname) : itk_image_(read(pathname)) {}
41-
Image(ImageType::Pointer imagePtr) : itk_image_(imagePtr) {
39+
explicit Image(const Dims dims);
40+
explicit Image(const std::string& pathname) : itk_image_(read(pathname)) {}
41+
explicit Image(ImageType::Pointer imagePtr) : itk_image_(imagePtr) {
4242
if (!itk_image_) throw std::invalid_argument("null imagePtr");
4343
}
44-
Image(const vtkSmartPointer<vtkImageData> vtkImage);
44+
explicit Image(const vtkSmartPointer<vtkImageData> vtkImage);
45+
4546
Image(Image&& img) : itk_image_(nullptr) { this->itk_image_.Swap(img.itk_image_); }
4647
Image(const Image& img) : itk_image_(cloneData(img.itk_image_)) {}
4748
Image& operator=(const Image& img); /// lvalue assignment operator
@@ -306,6 +307,9 @@ class Image {
306307
//! fill with value
307308
Image& fill(PixelType value);
308309

310+
//! Return if the image is a distance transform
311+
bool isDistanceTransform() const;
312+
309313
//! Return supported file types
310314
static std::vector<std::string> getSupportedTypes() {
311315
return {"nrrd", "nii", "nii.gz", "mhd", "tiff", "jpeg", "jpg", "png", "dcm", "ima"};
@@ -340,7 +344,7 @@ class Image {
340344
/// pad image by the given dims (always positive) in each direction
341345
Image& pad(Dims lowerExtendRegion, Dims upperExtendRegion, PixelType value = 0.0);
342346

343-
StatsPtr statsFilter();
347+
StatsPtr statsFilter() const;
344348

345349
ImageType::Pointer itk_image_;
346350

Testing/ImageTests/ImageTests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ TEST(ImageTests, intensityTest) {
328328

329329
TEST(ImageTests, setlevelTest) {
330330
Image image(std::string(TEST_DATA_DIR) + "/1x2x2.nrrd");
331-
image.applyTPLevelSetFilter(std::string(TEST_DATA_DIR) + "/curvature1.nrrd");
331+
image.applyTPLevelSetFilter(Image(std::string(TEST_DATA_DIR) + "/curvature1.nrrd"));
332332
Image ground_truth(std::string(TEST_DATA_DIR) + "/set-level_baseline.nrrd");
333333

334334
ASSERT_TRUE(image == ground_truth);

Testing/MeshTests/MeshTests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ TEST(MeshTests, fillHolesTest) {
316316

317317
TEST(MeshTests, probeVolumeTest) {
318318
Mesh femur(std::string(TEST_DATA_DIR) + "/femur.vtk");
319-
femur.probeVolume(std::string(TEST_DATA_DIR) + "/femurVtkDT.nrrd");
319+
femur.probeVolume(Image(std::string(TEST_DATA_DIR) + "/femurVtkDT.nrrd"));
320320
Mesh ground_truth(std::string(TEST_DATA_DIR) + "/probe.vtk");
321321

322322
ASSERT_TRUE(femur == ground_truth);

0 commit comments

Comments
 (0)