自动呼吸器官分割

手动肺分割大约需要10分钟,并且需要一定的技能才能获得与自动分割相同的高质量结果。 自动分段大约需要15秒。


我以为没有神经网络,准确度就不会超过70%。 我还假设形态学操作只是为更复杂的算法准备图像。 但是,由于处理了这些手部断层扫描数据,尽管数量很少,但只有40个,该算法对肺部进行了分割,没有错误。 此外,在前五种情况下进行测试后,该算法并未发生明显变化,并且在不更改设置的情况下,在其他35项研究中也能正常工作。


同样,神经网络也有一个缺点-对于其训练,我们需要数百个肺部训练样本,这些样本需要手动标记。



内容内容



呼吸系统的结构


呼吸系统包括气道和肺。 气道分为上,下气道。 下呼吸道和上呼吸道之间的分离点是食道与气道的交点。 喉部上方的所有器官均为上呼吸道,喉部下方的所有器官均为下呼吸道。


呼吸器官清单:


鼻腔是在鼻子和咽之间的充满空气的腔。
是食物和空气传播的通道。
气管是连接到喉和支气管的管。
负责声音的形成。 它位于颈椎C4-C6的水平。
支气管是呼吸道,其主要部分位于肺部内部。
是主要的呼吸器官。



豪恩斯菲尔德量表


戈弗雷·霍恩斯菲尔德(Godfrey Hounsfield)是一位英国电气工程师,他与美国理论家艾伦·科马克(Allan Cormack)一起开发了计算机断层扫描技术,为此他在1979年获得了诺贝尔奖。



霍恩斯菲尔德标度-是描述无线电密度的定量标度,以霍恩斯菲尔德为单位测量,表示为HU。


辐射密度是根据辐射衰减系数计算的。 衰减系数表征了一定数量的材料可以被辐射穿透的程度。


辐射密度通过以下公式计算:


$$显示$$ {μ_{X}-μ_{water} \超过μ_{water}-μ_{air}} \乘以1000 $$ display $$


在哪里 μXμμ是被测材料,水和空气的线性衰减系数。


放射性密度可以为负,因为零放射性密度对应于水。 这意味着所有具有比水衰减系数低的衰减系数的材料(例如,肺组织,空气)将具有负的放射性密度。


下面列出了各种组织的大约射线密度:


  • 空气:-1000 HU。
  • 呼吸器官:-950至-300 HU。
  • 血液(不与血管形成对比):从0到100 HU。
  • 骨骼:100至1000 HU。


链接到Wikipedia: 霍恩斯菲尔德标度戈弗雷·霍恩斯菲尔德衰减系数


数学形态


形态学运算是算法中使用的主要工具。
在计算机视觉领域,形态学运算被称为一组用于变换对象形状的算法。 最常见的是,形态学运算应用于二进制化的图像,其中单位对应于对象体素,零对应于空白。
主要的形态学操作包括:


形态膨胀是向对象的所有边缘体素添加新的体素。 换句话说,算法扫描与对象边缘相对应的所有体素,并使用具有给定形式(球形,立方体,十字形等)的内核将其放大。 核具有自己的半径(对于球体)或侧面的宽度(对于立方体)。 此操作通常用于将多个附近的对象合并为一个对象。


形态侵蚀是位于对象边界(边界)上的所有体素的截止。 此操作与扩张相反。 此操作对于消除许多小的互连对象形式的噪声很有用。 但是,仅当目标物体的厚度比腐蚀半径大得多时,才应使用这种噪声消除方法。 否则,有用的信息将丢失。


形态学上的闭合是扩张,随后是侵蚀。 它用于封闭对象内部的孔并合并附近的对象。


形态开放是侵蚀然后扩张。 它用于去除小噪音对象并将这些对象分成几个对象。



Lee算法和RLE压缩


为了选择二值化体素体积中的对象,使用了Lie算法。 最初,发明该算法是为了找到走出迷宫的最短路径。 我们使用它来选择对象,并将其从三维三维像素阵列移动到另一个三维像素阵列。 该算法的基本思想是从起点开始在所有可能的方向上平行移动。 对于三维情况,可以从一个体素沿26或6个方向移动。


为了优化性能,应用了行程编码算法。 该算法的主要思想是将一和零的序列替换为一个数字,该数字等于该序列中元素的数量。 例如,字符串“ 00110111”可以替换为:“ 2; 2; 1; 3“。 这减少了内存访问的次数。



Wikipedia链接: Lee算法RLE算法


基本体积的阈值转换


使用断层扫描仪,获得了在扫描空间每个点的射线密度数据。 空气体素的辐射密度为-1100至-900 HU,呼吸器官体素的辐射密度为-900至-300 HU。 因此,我们可以删除所有辐射密度大于-300 HU的不必要体素。 结果,我们获得了仅包含呼吸器官和空气的二值化体素体积。



外部空气排出


为了分割身体的内部空气,我们删除了3D立体角附近的所有对象。 因此,我们去除了外部空气。



但是,并非所有情况都可以消除断层扫描仪工作台中的空气,因为断层扫描仪工作台可能与3D体积的角部没有任何联系。



因此,我们不仅将扫描角,而且将扫描位于f的任何边缘平面上的所有体素。 但是,如下图所示,肺也被切除了。 事实证明,气管还与3D体积的上平面有关。



我们必须从扫描区域中排除顶部平面。 也有研究未完全捕获肺部,并且下平面与肺部相连。
因此,如果您愿意,也可以排除下平面。



但是这种方法仅影响胸部研究。 在捕获全部身体的情况下,将出现通过鼻腔的内部和外部空气的连接。因此,有必要进行形态学侵蚀以分离内部和外部空气。



施加腐蚀之后,我们可以返回之前获得的外部空气分割方法,该方法基于外部空气与3D体积侧面的连通性。



在对外部空气进行分割之后,我们可以立即从空气和肺的全部体积中减去外部空气,从而获得身体和肺部的内部空气。 但是有一个问题。 侵蚀后,有关外部空气的一些信息丢失了。 为了恢复它,我们应用外部空气膨胀。



接下来,我们从整个空气和呼吸器官中减去外部空气,得到内部空气和呼吸器官。




最大体积对象的分割


接下来,我们将呼吸器官分割为体积最大的对象。 呼吸器官与胃肠道内的空气无关。



值得注意的是,在初始步骤正确选择射线密度阈值很重要。 否则,在某些情况下,由于分辨率低,两个肺之间可能没有连接。 例如,如果我们假设呼吸器官的体素具有-500 HU及以下的放射密度,则在以下情况下,将呼吸器官分割为体积最大的对象将导致错误,因为两个肺。 因此,阈值应增加到-300 HU。



关闭肺部血管


为了捕获肺内的血管,我们将使用形态学上的闭合,即扩张,然后以相同的半径进行侵蚀。 血管的放射密度(无反差)约为0..100 HU。



在图像中,我们可以看到没有关闭大的血液通道。 但这不是必需的。 此操作的目的是破坏肺内的许多小孔,以简化后续步骤中的肺分割过程。


呼吸器官分割算法


结果,我们获得了以下呼吸器官分割算法:


  1. 具有阈值“ <-300 HU”的基本卷的阈值变换。
  2. 半径为3 mm的形态腐蚀,用于外部和内部空气的分离。
  3. 基于外部空气与3D体积边界侧平面的连通性对外部空气进行细分。
  4. 外部空气的形态膨胀可恢复侵蚀后丢失的信息。
  5. 从整个空气和呼吸器官中减去外部空气以获得内部空气和呼吸器官。
  6. 最大体积对象的分段。
  7. 肺内血管的形态闭合。


MATLAB中的算法实现


函数“ getRespiratoryOrgans”


% Returns the whole respiratory organs volume (lung and airway volume) % without separating of the left and right lung. % V = base volume with radiodensity data in Hounsfield units. % cr = radius of vessels morphological closing. % ci = iteration count of vessels morphological closing (fe 3-times % make dilation and after that 3-times make erosion. function RO = getRespiratoryOrgans(V,cr,ci) % Threshold transform of the base volume with the threshold level "<-300 HU". AL=~imbinarize(V,-300); % Morphological erosion with the 3 mm radius for the separation of external % and internal air. SE=strel('sphere',3); EAL=imerode(AL,SE); % Segmentation of external air based on external air connectivity with the % boundary side planes of the 3D volume. EA=getExternalAir(EAL); % Morphological dilation of the external air to restore the information lost % after the erosion. DEA=EA; for i=1:4 DEA=imdilate(DEA,SE); DEA=DEA&AL; end % Subtraction of the external air from the whole air and respiratory organs to % obtain the internal air and respiratory organs. IAL=AL-DEA; % Segmentation of the maximum volume object. RO=getMaxObject(IAL); Morphological closing of the vessels inside the lungs. RO=closeVoxelVolume(RO,3,2); 

函数“ getExternalAir”


 % Returns the volume which is connected with the edge surfaces of % the voxel scene (except the top surface, because lungs can have % a connection with the top surface). % EAL = eroded lung-and-air binarized volume. function EA = getExternalAir(EAL) % The “bwlabeln” function segments objects: voxels of a one object % equates to 1, and of another one - to 2, etc. V=bwlabeln(EAL); % We request such characteristics of the objects as bounding box and % list of all object voxels. R=regionprops3(V,'BoundingBox','VoxelList'); n=height(R); % Create a 3D matrix for storing external air voxels. s=size(EAL); EA=zeros(s,'logical'); % Scan all the objects to find objects belonging to the external air. for i=1:n % Define the minimum and maximum x and y coordinates of the object. 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); % If the edge voxels of the object are in contact with the side planes of % the 3D volume, then copy all the voxels of this object into the matrix EA. if (x0 < 1 || x1 > s(1)-1 || y0 < 1 || y1 > s(2)-1) % Convert the object voxel coordinates data to the matrix type: % [[x1 y1 z1] [x2 y2 z3] ... [xn yn zn]]. mat=cell2mat(R(i,2).VoxelList); ms=size(mat); % Fill the matrix containing the voxels of the external air. 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”


 % Returns the largest object in the voxel volume V. % O = the voxels of the largest object. % m = the volume of the largest object. function [O,m] = getMaxObject(V) % Segment the objects. V=bwlabeln(V); % Reqiest the information about the objects volume and objects voxel coordinates. R=regionprops3(V,'Volume','VoxelList'); % Determine the index of the maximum volume object. v=R(:,1).Volume; [m,i]=max(v); % Create the 3D matrix for storing the largest object voxels. s=size(V); O=zeros(s,'logical'); % Copy the largest object voxels to the new matrix. 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 

可以通过参考下载源代码。


结论


以下文章将是:


  1. 气管和支气管分割;
  2. 肺分割
  3. 肺叶分割。

将考虑以下算法:


  1. 距离变换
  2. 最近邻变换,也称为特征变换;
  3. 计算用于分割平面3D对象的Hessian矩阵的特征值;
  4. 分水岭分割。

Source: https://habr.com/ru/post/zh-CN461329/


All Articles