Если вы новичок в работе с медицинскими изображениями, то вас ждет минное поле. Вам придется отложить интуицию в сторону, потому что во многих случаях ее нет или, по крайней мере, не было с самого начала. Так вот, у нас просто условность, построенная на условности.

Типичной отправной точкой в ​​медицинской ориентации является признание двух широко используемых «перспектив», широко известных как радиологическая и неврологическая точка зрения. Первый возник при взгляде на грудь, где пациент будет рассматриваться спереди, лицом к ним, а второй - в мозгу, где пациент будет рассматриваться сзади сверху.

В трехмерных медицинских изображениях мы обычно говорим об осевом срезе (голова-ноги), мы могли бы сказать, что рентгенолог грудной клетки будет смотреть на срез снизу, а радиолог - сверху.

Однако, как программисты, мы любим говорить о трехмерных объемах с точки зрения матричных индексов 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, как на правом рисунке выше, тогда IJKtoLPSmatrix покажет, что 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.00   0.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         ║
╚═════════════╩═════════════╝

Эта статья существует благодаря некоторым полезным ресурсам и отлично подходит для дальнейшего чтения:

КТ-изображения были доступны под лицензией CC0: