Если вы новичок в работе с медицинскими изображениями, то вас ждет минное поле. Вам придется отложить интуицию в сторону, потому что во многих случаях ее нет или, по крайней мере, не было с самого начала. Так вот, у нас просто условность, построенная на условности.
Типичной отправной точкой в медицинской ориентации является признание двух широко используемых «перспектив», широко известных как радиологическая и неврологическая точка зрения. Первый возник при взгляде на грудь, где пациент будет рассматриваться спереди, лицом к ним, а второй - в мозгу, где пациент будет рассматриваться сзади сверху.
В трехмерных медицинских изображениях мы обычно говорим об осевом срезе (голова-ноги), мы могли бы сказать, что рентгенолог грудной клетки будет смотреть на срез снизу, а радиолог - сверху.
Однако, как программисты, мы любим говорить о трехмерных объемах с точки зрения матричных индексов i, j, k. Таким образом, знание того, к какой оси объема относится наш код и к какому анатомическому направлению, позволит нам выполнить нашу работу.
Соглашения об ориентации
Как правило, то, как хранится медицинское изображение, не зависит от ориентации, в которой оно просматривается. Метаданные ориентации изображения сообщают нам об отношении того, как изображение хранится в реальном мире, точнее, об отношении осей объема хранилища IJK к реальному миру. то есть влево/вправо, назад/вперед и вверх/вниз.
╔════════╦════════════╗ ║ Common ║ Anatomical ║ ╠════════╬════════════╣ ║ Left ║ Left ║ ║ Right ║ Right ║ ║ Up ║ Superior ║ ║ Down ║ Inferior ║ ║ Front ║ Anterior ║ ║ Back ║ Posterior ║ ╚════════╩════════════╝
Это возвращает нас к нашим клиническим радиологическим и неврологическим взглядам, которые мы будем называть LPS (левая, задняя и верхняя) и RAS (правая, передняя и верхняя) соответственно. Различные форматы данных и приложения, как правило, используют один из них.
Отображение один к одному перевода IJKtoLPS
будет означать, что 1-я ось указывает влево, 2-я — назад, а 3-я — вверх. Это можно обозначить в аффинной матрице 3x3, как показано ниже.
1 0 0
IJKtoLPS = 0 1 0
0 0 1
Каждый столбец представляет собой базисный вектор, который кодирует каждую ось изображения слева направо соответственно. Поскольку отношение в данном случае взаимно однозначное, аффинная матрица была тождественной. Левое изображение на рисунке ниже демонстрирует это.
Предположим, что изображение на самом деле сохранено в формате RAS, как на правом рисунке выше, тогда IJKtoLPS
matrix покажет, что 1-я и 2-я оси теперь перевернуты.
-1 0 0
IJKtoLPS = 0 -1 0
0 0 1
На самом деле у вас могут быть всевозможные комбинации, вот несколько примеров, с которыми вы можете работать.
╔═══════════╦══════╗ ║ IJKtoLPS ║ Code ║ ╠═══════════╬══════╣ ║ 0 -1 0 ║ ║ ║ 0 0 1 ║ SRP ║ ║ 1 0 0 ║ ║ ╠═══════════╬══════╣ ║ 0 0 -1 ║ ║ ║ -1 0 0 ║ AIR ║ ║ 0 -1 0 ║ ║ ╠═══════════╬══════╣ ║ 0 1 0 ║ ║ ║ 0 0 -1 ║ SLA ║ ║ 1 0 0 ║ ║ ╚═══════════╩══════╝
Однако у нас все еще есть другая широко используемая система отсчета РАН. Принцип тот же, но теперь единичная матрица указывает на правую и переднюю.
1 0 0
IJKtoLPS = 0 1 0
0 0 1
Итак, теперь коды в приведенных выше примерах с точки зрения RAS стали SLA, PIL и SRP соответственно.
Переключение между двумя эталонными плоскостями — это просто вопрос матрицы, использующей скалярное произведение.
-1 0 0 IJKtoLPS = 0 -1 0 ∙ IJKtoRAS
0 0 1-1 0 0 IJKtoRAS = 0 -1 0 ∙ IJKtoLPS
0 0 1
Происхождение изображения и интервал
Никакое объяснение ориентации изображения не будет полным без упоминания о его происхождении. Поскольку аффинная матрица 3D-изображения фактически имеет размер 4x4, а 4-й столбец определяет, где в нашем реальном мире возникает верхний левый воксель в нашем 3D-объеме. Для изображения в RAS-ориентации, где верхний левый воксель был откалиброван сканером так, чтобы он исходил из [-9, 2, -5]
мм, аффинная 3D-матрица 4x4 будет
-1 0 0 -9
IJKtoLPS = 0 -1 0 2
0 0 1 -5
0 0 0 1
Кроме того, мы предположили, что размер каждого вокселя составляет 1 x 1 x 1
мм, на самом деле это не всегда так. В этом случае мы скажем, что это на самом деле 0.25 x 0.50 x 1.00
мм. Аффинная матрица примет окончательную форму
-0.25 0
.000
.00-9.00 IJKtoLPS = 0
.00-0.50 0.00 2.00
0.00 0.00 1.00 -5.00 0.00 0.00 0.00 1.00
Обратите внимание на 1
в конце 4-го столбца, который требуется по определению аффинной матрицы.
Программирование
Полезные пакеты на Python для работы с 3D-изображениями для медицины представлены как dicom_numpy
для DICOM (.dcm) и nibabel
для NIFTI (.nii). Оба этих пакета могут загружать 3D-объемы в соответствующих форматах и возвращать вам аффинную матрицу. Однако имейте в виду, что изображения dicom работают в LPS, а nifti и, следовательно, nibabel в RAS. Поэтому, если вы хотите преобразовать DICOM в NIFTI таким образом, нам нужно будет выполнить преобразование на аффинной матрице. Такие инструменты, как dicom2nifti
, в любом случае выполняют это автоматически, и для каждого языка программирования существует несколько пакетов преобразования.
Отдельно отмечу nibabel, так как у него есть количество инструментов для работы с ориентациями, например aff2axcodes()
вернет трехбуквенный код оси. На самом деле, в nibabel есть удобный инструмент для принудительного перевода объектов изображения nibabel в его родной формат RAS nib.as_closest_canonical(img)
.
Конвенция о форматах и программах медицинской визуализации
Как уже упоминалось, код опорной оси зависит от приложения/формата, с которым вы работаете. Ниже приведен скомпилированный список некоторых распространенных приложений. Некоторые форматы, такие как NRRD, указывают ссылку, в которой следует интерпретировать аффинный код, в заголовке файла. MATLAB загружает данные медицинских изображений по мере их поступления, то есть dicomread
в LPS и niftiread
в RAS, поэтому вам придется применить собственное преобразование, если вы хотите использовать MATLAB для преобразования форматов.
╔═════════════╦═════════════╗ ║ Tool ║ Orientation ║ ╠═════════════╬═════════════╣ ║ DICOM ║ LPS ║ ║ NIFTI ║ RAS ║ ║ NRRD ║ flexible ║ ║ dicom_numpy ║ LPS ║ ║ nibabel ║ RAS ║ ║ MATLAB ║ raw ║ ║ Slicer ║ RAS ║ ║ ITKsnap ║ LPI ║ ╚═════════════╩═════════════╝
Эта статья существует благодаря некоторым полезным ресурсам и отлично подходит для дальнейшего чтения:
- https://nipy.org/nibabel/image_orientation.html
- https://nipy.org/nibabel/coordinate_systems.html
- https://www.slicer.org/wiki/Coordinate_systems
- https://itk.org/Wiki/Proposals:Ориентация
КТ-изображения были доступны под лицензией CC0: