Как и Колби сказал , причина, по которой он выглядит неправильно, почти наверняка является уровнем окна.
Для изображения CT, подобного этому, вы, вероятно, захотите уровень окна около w = 400, уровень= 50, то есть мин = -150, макс = 250. См. Статью Colby, связанную с.
Вы можете выбрать подходящие значения уровня окна (т. Е. Min / max) или, как упоминал Колби, извлечь их из вероятных сохраненных значений WL в файле dicom,и вычислите мин / макс из них (мин = уровень - окно / 2, макс = уровень + окно / 2).
В вашем коде измените его на:
level = dicom_file.WindowCenter
window = dicom_file.WindowWidth
# ...or set window/level manually to values you want
vmin = level - window/2
vmax = level + window/2
plt.imshow(hu_pixels, cmap='gray', vmin=vmin, vmax=vmax)
plt.show()
ТакжеВы сказали в начале: «Я пытаюсь выполнить некоторые задачи сегментации».
Если это так, вам нужно использовать 16-битные данные как есть, а не 8-битную версию, поскольку
- у него гораздо больший диапазон данных, поэтому он намного лучше для сегментации, и
- для КТ, фактические значения имеют клиническое значение, поэтому являются критическими для сегментации.
... так что, если вашей общей целью является сегментирование, а не просто отображение изображения, то отображение с правильным окном / уровнем не является большой проблемой. Для сегментации вам необходимо понять, что данные заполнены 16-разрядными данными и использовать их во всем 16-разрядном диапазоне данных.
Просто выясните, как работает WL и как отображать его так, как вам нравится / нужно /хотите с imshow (), и вам будет хорошо.