Skip to content

Commit

Permalink
Added option for clamping Hounsfield scale values (now OFF by default) (
Browse files Browse the repository at this point in the history
  • Loading branch information
mlavik1 authored Aug 18, 2024
1 parent 316eaed commit 59606fb
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 8 deletions.
6 changes: 6 additions & 0 deletions Assets/Editor/ImportSettingsEditorWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ private void OnGUI()
PlayerPrefs.SetInt("NormaliseScaleOnImport", normaliseScaleOnImport ? 1 : 0);
EditorGUILayout.EndHorizontal();

EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Clamp Hounsfield values to body tissues range?");
bool clampHounsfield = EditorGUILayout.Toggle("", PlayerPrefs.GetInt("ClampHounsfield") > 0);
PlayerPrefs.SetInt("ClampHounsfield", clampHounsfield ? 1 : 0);
EditorGUILayout.EndHorizontal();

EditorGUILayout.Space();
EditorGUILayout.Space();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ public VolumeDataset ImportSeries(IImageSequenceSeries series, ImageSequenceImpo
// Create dataset
VolumeDataset dataset = ScriptableObject.CreateInstance<VolumeDataset>();

ImportSeriesInternal(files, dataset, settings.progressHandler);
bool clampHounsfield = PlayerPrefs.GetInt("ClampHounsfield") > 0;
ImportSeriesInternal(files, dataset, settings.progressHandler, clampHounsfield);

return dataset;
}
Expand All @@ -165,11 +166,12 @@ public async Task<VolumeDataset> ImportSeriesAsync(IImageSequenceSeries series,
// Create dataset
VolumeDataset dataset = ScriptableObject.CreateInstance<VolumeDataset>();

await Task.Run(() => ImportSeriesInternal(files,dataset, settings.progressHandler));
bool clampHounsfield = PlayerPrefs.GetInt("ClampHounsfield") > 0;
await Task.Run(() => ImportSeriesInternal(files,dataset, settings.progressHandler, clampHounsfield));

return dataset;
}
private void ImportSeriesInternal(List<DICOMSliceFile> files,VolumeDataset dataset, IProgressHandler progress)
private void ImportSeriesInternal(List<DICOMSliceFile> files,VolumeDataset dataset, IProgressHandler progress, bool clampHounsfield)
{
// Calculate slice location from "Image Position" (0020,0032)
CalculateSliceLocations(files);
Expand Down Expand Up @@ -205,7 +207,10 @@ private void ImportSeriesInternal(List<DICOMSliceFile> files,VolumeDataset datas
int pixelValue = pixelArr[pixelIndex];
float hounsfieldValue = pixelValue * slice.slope + slice.intercept;

dataset.data[dataIndex] = Mathf.Clamp(hounsfieldValue, -1024.0f, 3071.0f);
if (clampHounsfield)
hounsfieldValue = Mathf.Clamp(hounsfieldValue, -1024.0f, 3071.0f);

dataset.data[dataIndex] = hounsfieldValue;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,8 @@ public VolumeDataset ImportSeries(IImageSequenceSeries series, ImageSequenceImpo
return null;
}

ImportSeriesInternal(dicomNames, sequenceSeries, image, size, pixelData, volumeDataset);
bool clampHounsfield = PlayerPrefs.GetInt("ClampHounsfield") > 0;
ImportSeriesInternal(dicomNames, sequenceSeries, image, size, pixelData, volumeDataset, clampHounsfield);

return volumeDataset;
}
Expand All @@ -128,12 +129,13 @@ public async Task<VolumeDataset> ImportSeriesAsync(IImageSequenceSeries series,
return null;
}

await Task.Run(() => ImportSeriesInternal(dicomNames, sequenceSeries, image, size, pixelData, volumeDataset));
bool clampHounsfield = PlayerPrefs.GetInt("ClampHounsfield") > 0;
await Task.Run(() => ImportSeriesInternal(dicomNames, sequenceSeries, image, size, pixelData, volumeDataset, clampHounsfield));

return volumeDataset;
}

private void ImportSeriesInternal(VectorString dicomNames, ImageSequenceSeries sequenceSeries, Image image, VectorUInt32 size, float[] pixelData, VolumeDataset volumeDataset)
private void ImportSeriesInternal(VectorString dicomNames, ImageSequenceSeries sequenceSeries, Image image, VectorUInt32 size, float[] pixelData, VolumeDataset volumeDataset, bool clampHounsfield)
{
ImageSeriesReader reader = new ImageSeriesReader();

Expand Down Expand Up @@ -163,7 +165,12 @@ private void ImportSeriesInternal(VectorString dicomNames, ImageSequenceSeries s
Marshal.Copy(imgBuffer, pixelData, 0, numPixels);

for (int i = 0; i < pixelData.Length; i++)
pixelData[i] = Mathf.Clamp(pixelData[i], -1024, 3071);
{
if (clampHounsfield)
pixelData[i] = Mathf.Clamp(pixelData[i], -1024.0f, 3071.0f);
else
pixelData[i] = pixelData[i];
}

VectorDouble spacing = image.GetSpacing();

Expand Down

0 comments on commit 59606fb

Please sign in to comment.