Ручная сегментация легких занимает около 10 минут и требуется определенная сноровка, чтобы получить такой же качественный результат, как при автоматической сегментации. Автоматическая сегментация занимает около 15 секунд.
Я предполагал, что без нейронной сети удастся получить точность не выше 70%. Также я предполагал, что морфологические операции – это только подготовка изображения к более сложным алгоритмам. Но в результате обработки тех, хоть и немногочисленных 40 образцов томографических данных, что есть на руках, алгоритм выделил легкие без ошибок, причём после теста на первых пяти случаях алгоритм уже не претерпевал значительных изменений и с первого применения правильно отработал на остальных 35 исследованиях без изменения настроек.
Также нейронные сети имеют минус – для их обучения нужны сотни обучающих образцов лёгких, которые придётся размечать вручную.

Содержание
- Строение дыхательной системы
- Шкала Хаунсфилда
- Математическая морфология
- Алгоритм Ли и RLE-компрессия
- Пороговое преобразование базового объема
- Отсечение внешнего воздуха
- Выделение максимального по объему объекта
- Закрытие сосудов внутри лёгких
- Алгоритм сегментации дыхательных органов
- Реализация алгоритма в среде MATLAB
- Заключение
Строение дыхательной системы
Дыхательная система включает в себя дыхательные пути и лёгкие. Выделяют верхний и нижний отделы дыхательных путей. Точкой разделения между нижними и верхними дыхательными путями является точка пересечения пищевых и дыхательных каналов. Всё, что выше гортани – верхний отдел, а остальное – нижний.
Перечислим дыхательные органы:
Носовая полость: — нос, гайморовы пазухи и т.д.
Глотка — канал, по которому перемещается пища и воздух.
Гортань – отвечает за образование голоса. Находится на уровне шейных позвонков C4-C6.
Трахея – трубка, соединяющая гортань и бронхи.
Бронхи – дыхательные каналы, основная часть которых находится внутри лёгких.
Лёгкие – основной дыхательный орган.

Шкала Хаунсфилда
Годфри Хаунсфилд — британский инженер-электрик, который вместе с американским теоретиком Алланом Кормаком разработал компьютерную томографию, за что получил Нобелевскую премию в 1979 году.

Шкала Хаунсфилда — количественная шкала рентгеновской плотности, которая измеряется в единицах Хаунсфилда, обозначаемых HU.
Рентгеновская плотность вычисляется на основе коэффициента ослабления вещества, то есть степени уменьшения мощности излучения при прохождении через это вещество.
Рентгеновская плотность вычисляется по формуле:
где — линейные коэффициенты ослабления для измеряемого вещества, воды и воздуха.
Рентгеновская плотность бывает отрицательной, потому что нулевая рентгеновская плотность соответствует воде. А значит все вещества, через которые рентгеновские волны проходят с меньшим уменьшением мощности излучения, чем через воду (например, легочные ткани, воздух), будут иметь отрицательную рентгеновскую плотность.
Ниже перечислены приблизительные рентгеновские плотности для различных тканей:
- Воздух: -1000 HU.
- Дыхательные органы: от -950 до -300 HU.
- Кровь (без контрастирования сосудов): от 0 до 100 HU.
- Кости: от 100 до 1000 HU.

Ссылки на Википедию: шкала Хаунсфилда, Годфри Хаунсфилд, коэффициент ослабления.
Математическая морфология
Основное место среди выбранных в данной статье алгоритмов занимают морфологические операции.
В области компьютерного зрения морфологическими операциями называют группу алгоритмов по преобразованию формы объектов. Чаще всего морфологические операции применяют к бинаризованным изображениям, где вокселям объектов соответствуют единицы, а пустоте нули.
К основным морфологическим операциям относят:
Морфологическая дилатация (dilation, расширение) — добавление новых вокселей ко всем краевым вокселям объектов. То есть по всем граничным вокселям совершается проход с ядром с заданной формой (шар, куб, крест и т.д.). Данную операцию часто применяют для соединения множества рядом стоящих объектов в единый объект.
Морфологическая эрозия (erosion, размывание) — уничтожение всех вокселей, лежащих на границе объектов. Эта операция обратна дилатации. Данная операция бывает полезна для удаления шума в виде множества мелких объектов, соединенных между собой. Однако, данный метод удаления шума стоит использовать только в случае, если сегментируемый объект имеет толщину значительно большую, чем радиус эрозии.
Морфологическое закрытие (closing) — это дилатация с последующей эрозией. Применяется для закрытия отверстий внутри объектов и для объединения рядом стоящих объектов.
Морфологическое открытие (opening) — это эрозия с последующей дилатацией. Применяется для удаления мелких шумовых объектов и для разделения объектов на несколько объектов.

Алгоритм Ли и RLE-компрессия
Для выделения объектов в бинаризованном воксельном объёме используется алгоритм Ли. Данный алгоритм изначально был придуман для поиска кр��тчайшего пути. Но мы используем его для выделения и перемещения объектов из одного трехмерного массива вокселей в другой. Его суть состоит в параллельном перемещении во всех возможных направлениях из начальной точки. Для трехмерного случая возможны 26 либо 6 направлений движения из заданного вокселя (если воксель не находится с краю изображения).
Для оптимизации по быстродействию был применен алгоритм кодирования длин серий (run-length encoding). Его суть заключается в том, что последовательности единиц и нулей заменяются цифрой, равной количеству элементов в последовательности. Например, строка “00110111” может быть заменена как: “2;2;1;3”. Это позволяет уменьшить количество обращений к памяти.

Ссылки на Википедию: алгоритм Ли, алгоритм RLE.
Пороговое преобразование базового объема
С помощью томографа получены данные о рентгеновской плотности в каждой точке пространства. Воксели воздуха имеют рентгеновскую плотность в промежутке от -1100 до -900 HU, а воксели дыхательных органов от -900 до -300 HU. Поэтому можем убрать все лишние воксели, имеющие рентгеновскую плотность больше -300 HU. В итоге получим бинаризованный воксельный объём, содержащий только дыхательные органы и воздух.

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

Однако, не во всех случаях будет удалён воздух внутри стола томографа, так как он может не иметь связи с углами сцены.

Поэтому просканируем не только углы, но и все воксели, лежащие на любой из краевых плоскостей сцены. Но в результате почему-то удалились и сами лёгкие. Оказывается, трахея тоже имела связь с верхней плоскостью сцены.

Придётся исключить верхнюю плоскость из зоны сканирования. Также бывают исследования, в которых лёгкие были захвачены не полностью и нижняя плоскость имеет связь с легкими. Так что при желании можно исключить и нижнюю плоскость.

Но такой метод действует только на грудных исследований. В случае же захвата полного объёма тела на снимке появится связь внутреннего и внешнего воздуха через носовую полость. Поэтому необходимо применить морфологическую эрозию для разделения внутреннего и внешнего воздуха.

После применения эрозии можем вернуться к полученному ранее методу сегментации внешнего воздуха по признаку соседства с боковыми плоскостями сцены.

Выделив внешний воздух, можно было бы сразу отнять его из общего объёма воздуха и лёгких и получить внутренний воздух тела и легкие. Но есть одна проблема. После эрозии была потеряна часть информации о внешнем воздухе. Чтобы восстановить её, применим дилатацию внешнего воздуха.

Далее вычитаем внешний воздух из всего воздуха и дыхательных органов и получаем внутренний воздух и дыхательные органы.


Выделение максимального по объему объекта
Далее выделим дыхательные органы как максимальный по объему объект. Дыхательные органы — это отдельный объект. Связи между легкими и воздухом внутри желудочно-кишечного тракта нет.

Стоит заметить, что важен правильный выбор порога рентгеновской плотности на начальном шаге порогового преобразования. Иначе в некоторых случаях может не оказаться связи между двумя лёгкими в результате низкого разрешения. Например, если считать, что воксели дыхательных органов имеют рентгеновскую плотность от -500 HU и менее, то в случае, приведённом ниже, выделение дыхательных органов как крупнейшего по объёму объекта приведёт к ошибке, так как отсутствует связь между двумя лёгкими. Поэтому следует повысить порог до -300 HU.

Закрытие сосудов внутри лёгких
Для захвата сосудов внутри лёгких применим морфологическое закрытие, то есть дилатацию с последующей эрозией с тем же радиусом. Рентгеновская плотность сосудов составляет около -100..100 HU.

Крупные кровеносные пути не закрылись. Но в этом и нет необходимости. Цель данной операции была в уничтожении множества мелких отверстий внутри легких для упрощения дальнейшей сегментации легких.
Алгоритм сегментации дыхательных органов
В итоге получаем следующий алгоритм сегментации дыхательных органов:
- Пороговое преобразование базового объёма по порогу < -300 HU.
- Морфологическая эрозия радиусом 3 мм для разделения внешнего и внутреннего воздуха.
- Выделение внешнего воздуха по признаку соседства с граничными боковыми плоскостями воксельной сцены.
- Морфологическая дилатация внешнего воздуха для восстановления потерянной в результате эрозии информации.
- Вычитание внешнего воздуха из всего воздуха и дыхательных органов для получения внутреннего воздуха и дыхательных органов.
- Выделение максимального по объёму объекта.
- Морфологическое закрытие сосудов внутри лёгких.

Реализация алгоритма в среде MATLAB
Метод getRespiratoryOrgans
% Возвращает весь объем органов дыхания (объем легких и дыхательных путей) % без разделения левого и правого легкого. % V = базовый объем с данными по радиоплотности в единицах Хаунсфилда. % cr = радиус морфологического закрытия сосудов. % ci = количество итераций морфологического закрытия сосудов (например, 3 раза % делают дилатацию и после этого 3 раза делают эрозию. function RO = getRespiratoryOrgans(V,cr,ci) % Пороговое преобразование базового объёма % по порогу < -300 HU. AL=~imbinarize(V,-300); % Морфологическая эрозия радиусом 3 мм для % разделения внешнего и внутреннего воздуха. SE=strel('sphere',3); EAL=imerode(AL,SE); % Выделение внешнего воздуха по признаку соседства % с граничными боковыми плоскостями воксельной сцены. EA=getExternalAir(EAL); % Морфологическая дилатация внешнего воздуха для % восстановления потерянной в результате эрозии информации. DEA=EA; for i=1:4 DEA=imdilate(DEA,SE); DEA=DEA&AL; end % Вычитание внешнего воздуха из всего воздуха и дыхательных % органов для получения внутреннего воздуха и дыхательных органов. IAL=AL-DEA; % Выделение максимального по объёму объекта. RO=getMaxObject(IAL); % Морфологическое закрытие сосудов внутри лёгких. RO=closeVoxelVolume(RO,3,2);
Метод getExternalAir
% Возвращает объем, связанный с краевыми поверхностями трехмерного объема % (кроме верхней поверхности, поскольку легкие могут иметь % соединение с верхней поверхностью). % EAL = эродированный бинаризованный объем легких и воздуха. function EA = getExternalAir(EAL) % Функция bwlabeln сегментирует объекты: воксели одного % объекта приравнивает к единице, другого – к двойке и т.д. V=bwlabeln(EAL); % Запрашиваем такие характеристики объектов, как ограничительный бокс % и список всех вокселей объекта. R=regionprops3(V,'BoundingBox','VoxelList'); n=height(R); % Создаём 3-D матрицу для хранения вокселей внешнего воздуха. s=size(EAL); EA=zeros(s,'logical'); % Произведём перебор всех найденных объектов в цикле % с целью нахождения объектов, принадлежащих внешнему воздуху. for i=1:n % Определим координаты x и y, принадлежащие самым крайним % вокселям объекта. x0=R(i,1).BoundingBox(1); y0=R(i,1).BoundingBox(2); x1=x0+R(i,1).BoundingBox(4); y1=y0+R(i,1).BoundingBox(5); % Если крайние воксели объекта соприкасаются с боковыми % плоскостями сцены, то копируем все воксели данного объекта % в матрицу EA. if (x0 < 1 || x1 > s(1)-1 || y0 < 1 || y1 > s(2)-1) % Преобразуем данные о координатах вокселей объекта к % матричному типу: [[x1 y1 z1][x2 y2 z3] … [xn yn zn]]. mat=cell2mat(R(i,2).VoxelList); ms=size(mat); % Заполняем матрицу, содержащую воксели внешнего воздуха. for j=1:ms(1) x=mat(j,2); y=mat(j,1); z=mat(j,3); EA(x,y,z)=1; end end end
Метод getMaxObject
% Возвращает самый большой объект в трехмерном объеме "V". % O = воксели самого большого объекта. % m = объем самого большого объекта. function [O,m] = getMaxObject(V) % Сегментируем объекты. V=bwlabeln(V); % Запрашиваем информацию об объёме объектов и координатах % вокселей объектов. R=regionprops3(V,'Volume','VoxelList'); % Определяем индекс максимального по объёму объекта. v=R(:,1).Volume; [m,i]=max(v); % Создаём 3-D матрицу для хранения вокселей крупнейшего % объекта. s=size(V); O=zeros(s,'logical'); % Переносим воксели крупнейшего объекта в новую матрицу. mat=cell2mat(R(i,2).VoxelList); ms=size(mat); for j=1:ms(1) x=mat(j,2); y=mat(j,1); z=mat(j,3); O(x,y,z)=1; end
Исходный код можно скачать по ссылке.
Заключение
Следующими статьями планируются:
- сегментация трахеи и бронхов;
- сегментация легких;
- сегментация долей легких.
Будут рассматриваться такие алгоритмы, как:
- дистанционное преобразование (distance transform);
- преобразование ближайших соседей (nearest neighbor transform, также известный как feature transform);
- вычисление собственных значений матрицы Гессе для сегментации плоских 3D объектов;
- сегментация методом водораздела (watershed segmentation).
