2

C#处理医学影像(四):基于Stitcher算法拼接人体全景脊柱骨骼影像 - 乔克灬叔叔

 1 year ago
source link: https://www.cnblogs.com/Uncle-Joker/p/17373754.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在拍摄脊柱或胸片时,经常会遇到因设备高度不够需要分段拍摄的情况,

对于影像科诊断查阅影像时希望将分段影像合并成一张影像,有助于更直观的观察病灶,

以下图为例的两个分段影像:

1083581-20230505113732161-1043194558.jpg

     

1083581-20230505113631536-2031167468.jpg

我们使用OpenCVSharp中的Stitcher类的Stitch方法,导入两张图像并拼接:

1083581-20230505113904600-379291846.png

 但结果却失败了,返回错误结果:ERR_NEED_MORE_IMGS,是由于医学影像的特征点匹配不够,导致无法确定对接点。

一幅图中总存在着一些独特的像素点,这些点我们可以认为就是这幅图的特征,即为特征点

202207190823402.png?202261982641

获取一幅图中存在的一些独特的像素点,需要解决两个问题:

  • 解决尺度不变性问题,不同大小的图片获取到的特征是一样的
  • 提取到的特征点要稳定,能被精确定位 

1083581-20230505115245785-1113625530.jpg

 

1083581-20230505115333021-618451201.png

可参考本系列文章:C#处理医学影像(三):基于漫水边界自动选取病灶范围的实现思路

1083581-20220318160604148-413149739.png
1083581-20220318160711637-832509996.png
1083581-20220318160814607-922214327.png
1083581-20220318161625822-345599523.png

根据算法原理得到如下结果:

1083581-20220318161746611-1519958960.png
1083581-20220318161825787-1588514409.png

Sobel算子:

根据算法原理得到如下结果:

1083581-20220318161929647-1535266017.png
1083581-20220318162008102-2088673447.png

其中直观区别是canny算子计算的结果清晰,但不连续,容易受噪点影响,而sobel算子线条相对柔和,连续性强。

⑤背景降噪

进行一次手动背景降噪,使得展现的无用边缘更少,结果更清晰:

1083581-20220318162452740-1774395355.png
1083581-20220318162501036-681819382.png
1083581-20220318162430341-587803873.png

经过上述的一系列处理步骤后我们再次合并拼接:

            Mat srcImg1 = imgList1[0];
                    Mat srcImg2 = imgList1[1];
                  

                    Mat[] images = new Mat[] { srcImg1, srcImg2};

                    Stitcher stitcher = Stitcher.Create(Stitcher.Mode.Panorama);
                    Mat pano = new Mat();
                    var status = stitcher.Stitch(images, pano);
                    if (status != Stitcher.Status.OK)
                    {
                        ShowMsg.Box("拼接异常(" + status.ToString() + "),请重试。", BoxType.Msg, 120, this);
                        return;
                    }

得到了正确的结果:

1083581-20230505115950031-462690940.png

C#开发PACS、RIS、3D医学影像处理系统系列教程 目录整理:

菜鸟入门篇

医学影像三维篇

PACS三维处理医学图像:

C#开发PACS医学影像三维重建(一):使用VTK重建3D影像

C#开发PACS医学影像三维重建(二):使用VTK进行体绘制

C#开发PACS医学影像三维重建(三):纹理映射与颜色传输

C#开发PACS医学影像三维重建(四):3D网格平滑效果

C#开发PACS医学影像三维重建(五):基于梯度透明的组织漫游

C#开发PACS医学影像三维重建(六):三维光源与阴影效果

C#开发PACS医学影像三维重建(七):空间测量与标注

C#开发PACS医学影像三维重建(八):VR体绘制

C#开发PACS医学影像三维重建(九):MPR三视图切面重建

C#开发PACS医学影像三维重建(十):MIP最小密度投影

C#开发PACS医学影像三维重建(十一):CPR曲面重建

C#开发PACS医学影像三维重建(十二):VE虚拟内镜技术

C#开发PACS医学影像三维重建(十三):基于人体CT值从皮肤渐变到骨骼的梯度透明思路

C#开发PACS医学影像三维重建(十四):基于能量模型算法将曲面牙床展开至二维平面

熟手进阶篇

登峰造极篇

C#开发基于Python人工智能的肺结节自动检测

C#开发基于Python人工智能的脊柱侧弯曲率算法

C#开发基于Python机器学习的医学影像骨骼仿真动画

C#开发基于Python机器学习的术后恢复模拟

C#开发基于U3D的VR眼镜设备虚拟人体三维重建

C#开发基于全息投影的裸眼3D医学影像显示技术

医疗影像软件产品友情链接


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK