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

Posted 乔克灬叔叔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#处理医学影像:基于Stitcher算法拼接人体全景脊柱骨骼影像相关的知识,希望对你有一定的参考价值。

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

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

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

     

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

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

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

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

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


 

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

 

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

 

Sobel算子:

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

 

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

 

⑤背景降噪

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

 

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

            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;
                    

得到了正确的结果:

 

 

EmguCV使用Stitcher类来拼接图像

using System;
using System.Windows;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.UI;
using Emgu.CV.Features2D;
using Emgu.CV.ML;
using Emgu.CV.Util;
using Emgu.Util;
using Emgu.CV.Face;
using Emgu.CV.VideoSurveillance;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using OpenTK.Graphics;
using Emgu.CV.Stitching;

namespace EmguCVHist
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Image<Bgr, byte> a = new Image<Bgr, byte>("1.jpg");
            Image<Bgr, byte> b = new Image<Bgr, byte>("2.jpg");
            Image<Bgr, byte> c = new Image<Bgr, byte>("3.jpg");
            Stitcher stitcher = new Stitcher(false);
            Mat outimg= new Mat();
            try
            {
                stitcher.Stitch(new VectorOfMat(new Mat[] { a.Mat, b.Mat, c.Mat }), outimg);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            imageBox1.Image = outimg;
        }
    }
}

 

以上是关于C#处理医学影像:基于Stitcher算法拼接人体全景脊柱骨骼影像的主要内容,如果未能解决你的问题,请参考以下文章

Opencv2.4.9源码分析——Stitching

Opencv2.4.9源码分析——Stitching

EmguCV使用Stitcher类来拼接图像

OpenCV-Python 图像全景拼接stitch及黑边处理

opencv拼接相关1

医学图像之DICOM格式解析