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/archive/2023/05/05/17373754.html

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

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

相关文章

  • C# yield关键字详解

    C#yield关键字详解 yield 是 C# 中的一个关键字,它可以用来创建迭代器。一个包括 yield 语句的方法或者运算符,被称之为迭代器方法或者迭代器块。 在一个迭代器方法中,通过 yield return 语句向调用者返回一个序列中的下一个元素。每次调用 iterator 方法时,通过 yield return 返回的元素会被记录下来,并暂停方法的…

    C# 2023年5月15日
    00
  • 轻松学习C#的异常处理

    下面我将详细讲解如何轻松学习C#的异常处理,包括以下几点: 一、异常处理概述 在编写程序时,不可避免地会遇到各种错误,比如输入错误、内存不足、文件不存在等等,这些错误我们称之为异常。当程序出现异常时,如果不进行处理,程序将会无法正常运行,甚至会出现崩溃的情况。因此,异常处理十分重要。 C#中的异常处理主要通过try-catch-finally语句实现。其中,…

    C# 2023年5月15日
    00
  • c#中Invoke与BeginInvoke的用法及说明

    我来给你详细讲解一下“c#中Invoke与BeginInvoke的用法及说明”的完整攻略。 什么是Invoke和BeginInvoke 在C#中,Invoke和BeginInvoke用于在线程间执行委托。委托是将方法作为参数传递的.NET语言特性,所以可以在新的线程中执行该方法。Invoke会阻塞当前线程直到委托完成,而BeginInvoke不会阻塞并立即返…

    C# 2023年5月15日
    00
  • c#用for语句输出一个三角形的方法

    下面就为您详细讲解一下,在C#中用for语句输出一个三角形的方法: 思路 首先,我们需要知道三角形的构成,通常由若干个等腰直角三角形拼接成的。那么,我们可以通过for循环嵌套的方式来输出若干个等腰直角三角形,最终构成一个完整的三角形。具体的思路如下: 外层循环控制等腰三角形的行数。 内层循环控制等腰三角形的列数。 输出符号根据行数和列数来判断输出的内容,可以…

    C# 2023年6月7日
    00
  • c#实现16进制和字符串之间转换的代码

    下面是详细讲解C#实现16进制和字符串之间转换的完整攻略。 背景介绍 在计算机科学中,十六进制是一种更方便地表示二进制数的方法,而字符串则是日常编程中常见的一种数据类型。在实际开发中,我们经常会需要将十六进制和字符串之间进行转换,以方便进行数据传输或处理。 策略分析 在C#中,我们可以通过以下两种方式实现十六进制和字符串之间的转换: 使用BitConvert…

    C# 2023年6月6日
    00
  • C#实现将应用程序设置为开机启动的方法

    下面我会详细讲解如何用 C# 实现将应用程序设置为开机启动的方法。 方法一:使用注册表 Windows 操作系统允许我们通过修改注册表的方式来设置开机启动程序。下面是具体的步骤: 打开注册表编辑器。在 Windows 搜索框中键入 “regedit” 并回车即可打开。 找到以下注册表路径:HKEY_CURRENT_USER\SOFTWARE\Microsof…

    C# 2023年6月7日
    00
  • javascript 节点排序实现代码

    下面是关于“javascript 节点排序实现代码”的完整攻略。 一、准备要排序的节点 首先,需要获取需要排序的节点,并将它们存入到一个数组中,以便进行排序操作。可以通过以下方式获取需要排序的节点: const nodes = document.querySelectorAll(‘.node’); // 获取所有需要排序的节点 二、将节点进行排序操作 在获取…

    C# 2023年6月8日
    00
  • 通过Ajax进行Post提交Json数据的方法

    当我们需要在前端用javascript发送POST请求时,因为请求是异步的,所以可以借助Ajax来实现。如果请求的数据格式是JSON,那么需要注意的是,需要将JSON对象转化为字符串再进行POST请求。下面给出了两个实例来说明如何通过Ajax进行POST提交JSON数据的方法。 方法一:使用XMLHttpRequest对象 // 构造XMLHttpReque…

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