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

yizhihongxing

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

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

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

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#中+=是什么意思及+=的用法

    当我们在C#中使用“+=”时,它实际上是一个复合赋值运算符,旨在在现有变量的基础上添加新值。这个符号结合了加号“+”和赋值号“=”,并简化了代码,使其更易读。 使用“+=”的基本语法如下: variable += newValue; 其中,variable是要添加值的变量,newValue是要添加到variable的新值。如果variable中有旧值,则ne…

    C# 2023年6月1日
    00
  • C#实现UI控件输出日志的方法详解

    标题:C#实现UI控件输出日志的方法详解 正文: 在C#中,我们通常使用控制台输出日志信息。但是,在UI应用程序中,我们更经常使用UI控件来展示日志信息。本文将详细介绍如何在C#中实现UI控件输出日志的方法。 基本思路 UI控件输出日志的基本思路是通过控制UI控件的Text属性,将日志信息添加到UI控件上,从而实现日志的输出。这个过程可以使用delegate…

    C# 2023年5月15日
    00
  • C#数组中List, Dictionary的相互转换问题

    C#数组中List, Dictionary的相互转换是常见的问题,下面是一些详细的解答。 将List转换为数组 如果你有一个List对象想要转换成数组,可以使用List类的ToArray()方法。示例代码如下: List<int> list = new List<int> { 1, 2, 3 }; int[] array = list…

    C# 2023年6月1日
    00
  • C# 中的List.Sort()–集合排序方法全面解析

    C#中的List.Sort()–集合排序方法全面解析 1. 概述 在C#开发中,List 是常见的一种集合类型,其提供了一个 Sort() 方法来实现对集合的排序。本篇文章主要介绍 List 中的 Sort() 方法的功能及相关使用技巧。 2. 功能说明 List 中的Sort()方法用于对集合进行排序。默认情况下,Sort()方法按照升序对集合进行排序,…

    C# 2023年5月15日
    00
  • .net泛型通用函数的特殊问题的解决方法

    .NET泛型通用函数的特殊问题的解决方法 问题描述 在使用.NET泛型通用函数时,偶尔会遇到类型推断错误和性能降低等问题,如何解决这些问题呢? 解决方法 1. 明确指定泛型类型 当类型推断错误导致编译器无法正确推断泛型函数的类型时,我们可以通过明确指定泛型类型来解决这个问题。示例如下: List<object> list = new List&l…

    C# 2023年5月14日
    00
  • asp.net(c#) ubb处理类

    下面我将为你详细讲解如何使用ASP.NET(C#) UBB处理类来处理UBB代码。具体步骤如下: 1.概述 UBB是一个简单的标记语言,用于在文本中添加样式和链接。ASP.NET(C#) UBB处理类可以帮助我们将UBB代码转换为HTML代码,方便展示在网页上。 2.安装UBB处理类 首先需要在ASP.NET(C#)项目中安装UBB处理类库。可以通过 NuG…

    C# 2023年6月3日
    00
  • 深入学习C#网络编程之HTTP应用编程(下)

    深入学习C#网络编程之HTTP应用编程(下)攻略 该文章主要介绍了C#网络编程中HTTP应用编程的相关知识,包括HTTP协议的基本知识、HTTP应用编程的常用类、HTTP请求的发送和返回等。下面对该文章的内容进行更详细的解释。 1. HTTP协议的基本知识 HTTP协议是基于TCP协议之上的应用层协议,用于客户端和服务器之间的数据传输。文章中讲解了HTTP协…

    C# 2023年6月6日
    00
  • C# String字符串案例详解

    C# String字符串案例详解 在C#编程中,字符串常常是我们经常需要处理的数据类型之一。因此,对于string类型的操作和处理,是我们编程学习的重中之重。本文将带大家详细了解C# String字符串的应用实例及操作技巧。 1. 字符串的定义及基本操作 在C#中,String字符串是一种不可变的类型,即被创建之后,它的值就不能被修改了。以下是一些定义字符串…

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