基于网络上很多都是C++ 、Python实现的图像拼接,或者直接调用的Stitch函数进行的拼接,想着手动实现一个C#版本,具体思路如下:

实际拼接效果如下:


实现起来不是很难,但还是有许多可以优化的点,这些放在以后把。
下面展示一些 内联代码片

/// <summary>/// 基于SIFT算法特征提取进行拼接/// </summary>/// <param name="sender"></param>        /// <param name="e"></param>private void btnSift_Click(object sender, EventArgs e){#region 读取图片//这一部分相对而言较为简单,读者按自己需求编写就可            #endregion//从这开始是正式流程/**   图像二值化,加快特征点检测速度*/Mat srcImgBgr2Gray = new Mat();Mat testImgBgr2Gray = new Mat();Cv2.CvtColor(srcImg, srcImgBgr2Gray,ColorConversionCodes.BGRA2GRAY);Cv2.CvtColor(testImg, testImgBgr2Gray, ColorConversionCodes.BGR2GRAY);#region 创建 SIFT  //var MySift = OpenCvSharp.Features2D.SIFT.Create(400);var MySift = OpenCvSharp.XFeatures2D.SIFT.Create(2000);/**    特征点*/KeyPoint[] srcKeyPoints = MySift.Detect(srcImgBgr2Gray);KeyPoint[] testKeyPoints = MySift.Detect(testImgBgr2Gray);/**    描述子*/Mat srcDescriptors = new Mat();Mat testDescriptors = new Mat();/**    计算特征向量*/srcKeyPoints = MySift.Detect(srcImg);testKeyPoints = MySift.Detect(testImg);MySift.Compute(srcImgBgr2Gray, ref srcKeyPoints, srcDescriptors);MySift.Compute(testImgBgr2Gray, ref testKeyPoints, testDescriptors);#endregion#region 创建FLANN匹配器FlannBasedMatcher matcher = new FlannBasedMatcher();DMatch[] matches = matcher.Match(srcDescriptors, testDescriptors);#endregion#region 比率测试double max_dist = 0;double min_dist = 100;for (int i = 0; i < srcDescriptors.Rows; i++){double dist = matches[i].Distance;if (dist < 0.9 * min_dist){min_dist = dist;}if (dist > 0.9 * max_dist){max_dist = dist;}}            List<DMatch> good_matches = new List<DMatch>();for (int i = 0; i < srcDescriptors.Rows; i++){if (matches[i].Distance < 3 * min_dist){good_matches.Add(matches[i]);   }}if (good_matches.Count <= 0){MessageBox.Show("未匹配到特征点,无法进行拼接!\n请尝试手动拼接","提醒");return;}/**    绘制匹配点*/Mat img_matches = new Mat();Cv2.DrawMatches(srcImg, srcKeyPoints, testImg, testKeyPoints, good_matches, img_matches);/**   创建模板*/Mat srcImgTemp = new Mat();Cv2.CopyMakeBorder(srcImg, srcImgTemp, top, bottom, left, right, BorderTypes.Constant, 0);Mat testImgTemp = new Mat();            Cv2.CopyMakeBorder(testImg, testImgTemp, top, bottom, left, right, BorderTypes.Constant, 0); #endregion#region 透视变换List<Point2f> srcImgTransf = new List<Point2f>();List<Point2f> testImgTransf = new List<Point2f>();for (int i = 0; i < good_matches.Count; i++){srcImgTransf.Add(srcKeyPoints[good_matches[i].QueryIdx].Pt);testImgTransf.Add(testKeyPoints[good_matches[i].TrainIdx].Pt);}List<Point2d> srcImgPoints = srcImgTransf.ConvertAll(Point2fToPoint2d);List<Point2d> testImgPoints = testImgTransf.ConvertAll(Point2fToPoint2d);/**   单应性矩阵*/            Mat testImgWarp = new Mat();Mat M = Cv2.FindHomography(testImgPoints, srcImgPoints, HomographyMethods.Ransac, 5.0);OpenCvSharp.Size sizeTest = new OpenCvSharp.Size(testImg.Cols, testImg.Rows + 250);//CalcCorners(M, testImg);/**   透视变换*/                     Cv2.WarpPerspective(testImgTemp, testImgWarp, M, sizeTest, InterpolationFlags.WarpFillOutliers, BorderTypes.Constant, 0);           #endregion            #region 图像融合/**     ①图像融合*/int dstHeight = testImgWarp.Rows;int dstWidth = srcImg.Cols;Mat dst = new Mat(dstHeight, dstWidth, MatType.CV_8UC3);dst.SetTo(0);Rect rect = new Rect(0, 0, testImgWarp.Cols, testImgWarp.Rows);Mat dstTestImgWarp = new Mat(dst, rect);testImgWarp.CopyTo(dstTestImgWarp);Rect rectTestImg = new Rect(0, 0, srcImg.Cols, srcImg.Rows);Mat dstTestImg = new Mat(dst, rectTestImg);srcImg.CopyTo(dstTestImg);/**     ②黑边处理*///OptimizeSeam(srcImg, dstTestImgWarp,dst);#endregion/**   输出图像*/            Bitmap map = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(dst);pbStitchImg.Image = map;}

以上便是本次实现过程demo,期待和大家共同探讨。

CSharp + OpenCvSharp实现医学图像拼接相关推荐

  1. 护理方面关于人工智能的构想_谷歌秘密的atap实验室正在构想智能设备的未来...

    护理方面关于人工智能的构想 By Harry McCracken 哈里·麦克拉肯(Harry McCracken) In 2015, Dan Kaufman, the director of the ...

  2. OpenCVSharp 基于特征的图像拼接

    拼接有多个意思,有的只是简单的两个图片怼成一张图,比如这样: 怼成这样: OpenCVSharp 有这样的函数,简单说一下,就不上完整代码了: //上下拼接 两图像宽度必须一样 Cv2.VConcat ...

  3. OpenCvSharp三维重建SFM与图像拼接Stitch

    OpenCvSharp三维重建SFM与图像拼接Stitch 关于SFM重建的原理参考https://blog.csdn.net/lpj822/article/details/82716971 关于图像 ...

  4. 超详讲解图像拼接/全景图原理和应用 | 附源码

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 概述 图像拼接是计算机视觉中最成功的应用之一.如今,很难找到不包含 ...

  5. 计算机视觉方向简介 | 图像拼接

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 简介 图像拼接是将同一场景的多个重叠图像拼接成较大的图像的一种方法 ...

  6. OpenCV 实现多张图像拼接

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 拼接算法 OpenCV中从2.4.x版 ...

  7. 医学图像分类_全面梳理:图像配准综述

    内容导读: 1 定义 2 问题背景和应用 3 相关关键词 4 问题分类 4.1 基于问题特点的分类 4.2 根据算法本质的分类 5 图像配准通用流程 5.1 基于特征的图像配准通用流程 6 图像配准质 ...

  8. OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五

    OpenCV学习笔记(五十一)--imge stitching图像拼接stitching stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitch ...

  9. ransac剔除误匹配matlab代码,基于APAP图像拼接算法的改进

    硕 士 学 位 论 文 基于 APAP 图像拼接算法 的 改进 学 科 专 业  软件工程  学 位 类 型工 学硕 士学位 研 究 生 姓 名  刘 诗  导 师姓名 ...

最新文章

  1. Python-OpenCV运动物体检测
  2. 5G UPF + MEC 的部署位置、场景与模式
  3. 北海计算机职称考试地点,【2017年广西北海职称计算机考试报名时间9月1日-5日】- 环球网校...
  4. Kafka刚开启就秒退
  5. Spring AOP源码解析——专治你不会看源码的坏毛病!
  6. 安装指定版本的GPU版本的tensorflow小技巧
  7. java---同步与并发概念
  8. 【渝粤教育】国家开放大学2018年春季 0538-21T社区护理 参考试题
  9. 使用JavaScript调用手机平台上的原生API 1
  10. eureka原理_SpringCloud学习之—Eureka集群搭建
  11. 虚拟机VMware安装学习过程中遇到的几个问题
  12. java asm 教程_java字节码框架ASM的深入学习
  13. 利用word2vec创建中文主题词典——以网络暴力关键词为例
  14. 在VirtualBox上安装Linux的Guest Additions
  15. ps利用高反差保留去除大面积雀斑
  16. SSDT inlineHook
  17. Part 4R 不定积分和定积分
  18. 大端(Big Endian)和小端(Little Endian)的区别
  19. 如何让div透明,内容不透明
  20. 【vue d3 v4】vue2结合d3实现类似企查查的股权穿透图、股权结构图

热门文章

  1. Boom 3D官方汉化免费下载激活版
  2. 期许2016 迎新春技术分享沙龙总结
  3. 软件开发项目风险管理的几点体会
  4. 深度学习需要的显卡配置
  5. 学会聆听别人,聆听也是一门艺术。
  6. vue(h5+app分享微信、朋友圈、保存图片)
  7. 十年后的互联网,云计算成制胜法宝
  8. Excel 2016图表标题不能输入中文,图表一直闪动
  9. 华为nova3i 计算机在哪里,华为nova3i常见问题汇总,你想了解的都在这里
  10. UIView的animateWithDuration动画不执行问题