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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

 

Sobel算子:

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

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

 

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

 

⑤背景降噪

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

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

 

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

            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;
                    }

得到了正确的结果:

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

 

 

原文链接:https://www.cnblogs.com/Uncle-Joker/p/17373754.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#处理医学影像(四):基于Stitcher算法拼接人体全景脊柱骨骼影像 - Python技术站

(0)
上一篇 2023年5月9日
下一篇 2023年5月9日

相关文章

  • .netcore+vue 实现压缩文件下载功能

    .NET Core + Vue 实现压缩文件下载功能 在本攻略中,我们将详细讲解如何使用.NET Core和Vue.js实现压缩文件下载功能,并提供两个示例说明。 压缩文件下载功能简介 压缩文件下载功能是指将多个文件打包成一个压缩文件,并提供下载链接,用户可以通过该链接下载压缩文件。该功能通常用于批量下载文件,可以提高用户体验和下载效率。 实现压缩文件下载功…

    C# 2023年5月16日
    00
  • c#关于非托管内存的释放问题及解读

    C# 关于非托管内存的释放问题及解读 背景介绍 在 C# 中,我们通常使用垃圾回收机制来释放托管内存,但是当我们需要使用非托管资源时,需要我们自己手动管理非托管内存的释放。如果我们没有适当地释放非托管资源,可能会引起内存泄漏的问题,导致程序性能下降,甚至是崩溃。 下面详细介绍如何在 C# 中缓解这一问题。 释放非托管内存 1. 常见的非托管内存 C# 中常用…

    C# 2023年5月15日
    00
  • C#创建自定义控件及添加自定义属性和事件使用实例详解

    很高兴听到您对C#创建自定义控件及添加自定义属性和事件使用实例的详细讲解感兴趣。那么我来为您详细讲解一下。 创建自定义控件 C#允许我们通过继承Control类来创建自定义控件。以下是创建自定义控件的步骤: 新建一个类,并将其继承自Control类。 public class MyCustomControl : Control { // 自定义控件的实现代码…

    C# 2023年6月7日
    00
  • C#中LINQ多条件JOIN时为什么可以使用匿名类

    在C#中,如果要进行多条件JOIN,则可以使用匿名类型。这是因为多条件JOIN涉及到多个表或者是同一个表的多个字段,需要指定具体的条件。而匿名类型可以方便地创建一个临时的类型,其中可以包含多个字段,从而满足多条件JOIN的需求。 具体实现步骤: 1.创建匿名类型 在C#中,可以使用var关键字创建匿名类型,var类型会在编译时自动推断出匿名类型的具体类型信息…

    C# 2023年6月1日
    00
  • WinForm中快捷键与组合按键的设置方法

    WinForm中快捷键与组合按键的设置方法可以通过以下步骤实现: 在设计视图下选中窗体控件,打开属性窗口,找到KeyPreview属性并将其设置为True,这样窗体就可以接收按键操作。 在该窗体的事件中添加键盘事件处理程序,如KeyDown、KeyUp、KeyPress等事件。 在键盘事件处理程序中判断按下的键是否为设定的快捷键或组合按键,如果是则执行对应的…

    C# 2023年6月7日
    00
  • asp.net下中文验证码,免费开源代码

    当需要在ASP.NET网站中添加中文验证码时,可以使用免费的开源代码库来实现。以下是完整的攻略。 步骤一:下载中文验证码代码库 可以从GitHub上下载中文验证码的开源代码库。该代码库提供了在ASP.NET和MVC网站中添加中文验证码的功能。下载地址:https://github.com/rui2dou/captcha-aspnet。 步骤二:将代码库添加到…

    C# 2023年5月31日
    00
  • C#使用StopWatch获取程序毫秒级执行时间的方法

    我来为您讲解C#使用StopWatch获取程序毫秒级执行时间的方法: 什么是StopWatch类 StopWatch类是.NET Framework中的一个计时器类,可以用来精确地测量一段代码的执行时间。它使用了高精度计数器(比如CPU计时器)来测量时间,因此能够精确到毫秒、微秒和纳秒级别,比使用DateTime.Now等类更加准确。 如何使用StopWat…

    C# 2023年6月1日
    00
  • C#中lock用法详解

    C#中lock用法详解 什么是lock? 在C#中,lock用于控制多线程访问共享资源的同步。如果一个线程进入到了一个使用lock控制同步的代码块中,那么其他线程将会被阻塞,直到这个线程离开这个代码块为止。 lock的基本使用方式 lock语法的基本形式为: lock (lockObject) { // 处理共享资源的代码 } 其中,lockObject是一…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部