Skip to content

Commit 59606fb

Browse files
authored
Added option for clamping Hounsfield scale values (now OFF by default) (mlavik1#262)
1 parent 316eaed commit 59606fb

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

Assets/Editor/ImportSettingsEditorWindow.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ private void OnGUI()
3737
PlayerPrefs.SetInt("NormaliseScaleOnImport", normaliseScaleOnImport ? 1 : 0);
3838
EditorGUILayout.EndHorizontal();
3939

40+
EditorGUILayout.BeginHorizontal();
41+
EditorGUILayout.LabelField("Clamp Hounsfield values to body tissues range?");
42+
bool clampHounsfield = EditorGUILayout.Toggle("", PlayerPrefs.GetInt("ClampHounsfield") > 0);
43+
PlayerPrefs.SetInt("ClampHounsfield", clampHounsfield ? 1 : 0);
44+
EditorGUILayout.EndHorizontal();
45+
4046
EditorGUILayout.Space();
4147
EditorGUILayout.Space();
4248

Assets/Scripts/Importing/ImageSequenceImporter/OpenDICOM/DICOMImporter.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ public VolumeDataset ImportSeries(IImageSequenceSeries series, ImageSequenceImpo
147147
// Create dataset
148148
VolumeDataset dataset = ScriptableObject.CreateInstance<VolumeDataset>();
149149

150-
ImportSeriesInternal(files, dataset, settings.progressHandler);
150+
bool clampHounsfield = PlayerPrefs.GetInt("ClampHounsfield") > 0;
151+
ImportSeriesInternal(files, dataset, settings.progressHandler, clampHounsfield);
151152

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

168-
await Task.Run(() => ImportSeriesInternal(files,dataset, settings.progressHandler));
169+
bool clampHounsfield = PlayerPrefs.GetInt("ClampHounsfield") > 0;
170+
await Task.Run(() => ImportSeriesInternal(files,dataset, settings.progressHandler, clampHounsfield));
169171

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

208-
dataset.data[dataIndex] = Mathf.Clamp(hounsfieldValue, -1024.0f, 3071.0f);
210+
if (clampHounsfield)
211+
hounsfieldValue = Mathf.Clamp(hounsfieldValue, -1024.0f, 3071.0f);
212+
213+
dataset.data[dataIndex] = hounsfieldValue;
209214
}
210215
}
211216
}

Assets/Scripts/Importing/ImageSequenceImporter/SimpleITK/SimpleITKDICOMImporter.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ public VolumeDataset ImportSeries(IImageSequenceSeries series, ImageSequenceImpo
105105
return null;
106106
}
107107

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

110111
return volumeDataset;
111112
}
@@ -128,12 +129,13 @@ public async Task<VolumeDataset> ImportSeriesAsync(IImageSequenceSeries series,
128129
return null;
129130
}
130131

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

133135
return volumeDataset;
134136
}
135137

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

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

165167
for (int i = 0; i < pixelData.Length; i++)
166-
pixelData[i] = Mathf.Clamp(pixelData[i], -1024, 3071);
168+
{
169+
if (clampHounsfield)
170+
pixelData[i] = Mathf.Clamp(pixelData[i], -1024.0f, 3071.0f);
171+
else
172+
pixelData[i] = pixelData[i];
173+
}
167174

168175
VectorDouble spacing = image.GetSpacing();
169176

0 commit comments

Comments
 (0)