C#景深融合

最近因为一个项目要求,将matlab写的一些关于图像的算法转成C#。这个挺坑爹的,C#处理图像还是挺少的,opencv关于这方面的资源挺少的。我用的是opencvsharp这个第三方库,GitHub上有资源。
这个景深融合其实是一个显微镜扫描成像的问题,一共有数张图像,都是局部清晰,其它部分模糊。比如下面这样:

实际处理思路是:图像边缘检测,然后做了一个平滑处理,根据灰度图的亮度进行筛选,形成一个分区。最后根据分区处理像素的填充。
下面贴代码:
读取图片的操作就略去了,边缘提取用的是sobel,注意一下,opencvsharp中的图像处理注意mat数据的溢出。及时调整mat的像素深度比如16s,通常原始图像读取是8u。像素深度关系到具体坐标的数据格式。

    class Oper{public static Mat Deal(Mat ImIn){Mat mat_gray = new Mat();////Mat smooth_img = new Mat();//Cv2.GaussianBlur(ImIn, smooth_img, new OpenCvSharp.Size(3, 3), 0.96, 0.96, BorderTypes.Default);//灰度图Cv2.CvtColor(ImIn, mat_gray, ColorConversionCodes.BGR2GRAY);//GetMatData.Arr(mat_gray);Mat X = new Mat(); Mat Y = new Mat();//InputArray arr = InputArray.Create<float>(new float[3, 3] { { -1, -2, -1 }, { 0, 0, 0 }, { 1, 2, 1 } });//Cv2.Filter2D(mat_gray,X , -1, arr, new Point(-1, -1), 0);//InputArray arr_convert = InputArray.Create<float>(new float[3, 3] { { -1, 0, -1 }, { -2, 0, 2 }, { -1, 0, 1 } });//Cv2.Filter2D(mat_gray, Y, -1, arr, new Point(-1, -1), 0);//sobel边缘//-----------这里开始转变为16位运算-------------Cv2.Sobel(mat_gray, X, MatType.CV_16S, 1, 0, 3,1,0,BorderTypes.Replicate);Cv2.Sobel(mat_gray, Y, MatType.CV_16S, 0, 1, 3,1,0,BorderTypes.Replicate);//GetMatData.getData(X); //GetMatData.getData(Y);int width = X.Cols; int heigth = Y.Rows;//-------double型数据的对应像素深度是64F---------var output = new Mat(X.Size(),MatType.CV_64F);var indexer_x = X.GetGenericIndexer<Int16>();var indexer_y = Y.GetGenericIndexer<Int16>();var indexer_op = output.GetGenericIndexer<double>();//算术平均for (int index = 0; index < heigth ; index++){for (int index_y = 0; index_y < width; index_y++){Int16 Gx = indexer_x[index,index_y];Int16 Gy = indexer_y[index,index_y];double v1 = Math.Pow(Gx, 2);double v2 = Math.Pow(Gy, 2);double val = Math.Sqrt(v1 + v2);indexer_op[index, index_y] = val;}}//var ss =indexer_op[0, 0];Cv2.GaussianBlur(output,output,new OpenCvSharp.Size(31,31),11);//Cv2.ImShow("te", output); Cv2.WaitKey(0);return output;}}

到这里基本完成了图像的局部提取,下面进行一下分区的对比提取。
这部分我是这样理解的,比如十张局部扫描图,根据像素的梯度变化可以将清晰处与模糊处区分开来,sobel可以很好的将边缘提取出来,经过平滑处理形成分区。
之后十张图相当于MN10 的矩阵,根据像素的梯度变化,每个像素取最大值可以准确提取这部分图像的清晰部分。(这里一个理解是实际上清晰部分的梯度变化较模糊处大,梯度值实际上可以表现为亮度的大小)
像素对比处代码如下:

        public static Mat id_Mat (Mat[]coll){int heigth = coll[0].Rows;int width = coll[0].Cols;Mat max_id = new Mat(coll[0].Size(),MatType.CV_8U);var indexer_id = max_id.GetGenericIndexer<byte>();//int ss = max_id.At<double>(10, 10);////注意像素深度的设置,数据格式的统一Mat mat1 = coll[0];var indexer_pre=mat1.GetGenericIndexer<double>();for (int num = 1; num < coll.Length; num++){var mat2 = coll[num];var indexer = mat2.GetGenericIndexer<double>();for (int index = 0; index < heigth ; index++){for (int index_y = 0; index_y < width; index_y++){double G1 = indexer_pre[index,index_y];double G2 = indexer[index, index_y];if (G1 <= G2){double G_double = (double)G2;indexer_pre[index, index_y] = G_double;indexer_id[index, index_y] = (byte)num;}}}}return max_id;}

一点说明,这里为了后续图像合成的方便,输出mat max_id实际是每个像素选取的最大值所属的图像编号。
比如这样的:

1 2
1 2

左上的像素取图片1中对应像素的值。

最后就是填像素值合成了,如下:

    class Merge{   //ID点阵选择相应ID图像填色public static Mat ImMerge(Mat IDIm,Mat[]Coll_Ori){Mat ImMer = new Mat(Coll_Ori[0].Size(), Coll_Ori[0].Type());var indexer_mer=ImMer.GetGenericIndexer<Vec3b>();var indexer_id = IDIm.GetGenericIndexer<byte>();int heigth = IDIm.Rows; int width = IDIm.Cols;for (int index=0;index<Coll_Ori.Length;index++){for (int x = 0; x < heigth; x++){for (int y = 0; y < width; y++){int val_ID = indexer_id[x, y];if (val_ID == index) {var Ori_indexer = Coll_Ori[index].GetGenericIndexer<Vec3b>();indexer_mer[x, y] = Ori_indexer[x, y];}else { continue; }}}}return ImMer;}}

最后的输出图像如下:
例子1,图有点大,截个屏吧!

例子2

总的来说算法的处理效果是不错的,速度上也可以,毕竟C#还是不太适合做算法。我看网上基于C#的这方面代码还没有,希望对大家有一定的价值!

基于opencvsharp的景深融合相关推荐

  1. C# 景深融合软件(opencvsharp开源库)

    EDF可以将不同聚焦面的图像融合成一幅清晰的图像,C#处理图像还是挺少的,opencv关于这方面的资源挺少的.我用的是opencvsharp这个第三方库,GitHub上有资源 一共有3张图像,都是局部 ...

  2. 基于MATLAB的图像融合设计

    基于MATLAB的图像融合设计 摘 要 图像融合能够将不同类型传感器获取的同一对象的图像数据进行空间配准.并且采用一定的算法将不同类型的传感器获取的同一对象的图像数据所含用的信息优势或互补性有机地结合 ...

  3. ICCV 2019丨基于跨视角信息融合的三维人体姿态估计

    点击我爱计算机视觉标星,更快获取CVML新技术 52CV曾经在该论文刊出的第一时间对其报道:ICCV 2019 | 微软开源跨视图融合的3D人体姿态估计算法,大幅改进SOTA精度,该文为原作者解读. ...

  4. 【图像融合】基于小波变换的图像融合

    小波变换   传统的信号理论,是建立在Fourier分析基础上的,而Fourier变换作为一种全局性的变化,其有一定的局限性,如不具备局部化分析能力.不能分析非平稳信号等.在实际应用中人们开始对Fou ...

  5. 基于多传感器数据融合的全自动泊车系统研究与应用(开题报告)

    论 文 题 目 基于多传感器数据融合的全自动泊车系统研究与应用 论文选题来源 以某公司自动泊车项目为依托 本课题研究的目的.意义 随着工业4.0的到来,通讯技术.计算机技术.人工智能技术已经应用到汽车 ...

  6. 基于多传感器数据融合的全自动泊车系统研究与应用(文献综述)

    附:文献综述 基于多传感器数据融合的全自动泊车系统研究与应用 摘要: 随着科技的进步与城市车位空间的减小,汽车逐渐向智能化发展,如何安全快速地泊车成为驾驶员面临的难题.关于自动泊车辅助系统的研究,国内 ...

  7. 传感器怎么获取障碍物的宽度信息_基于多传感器信息融合的机器人障碍物检测...

    基于多传感器信息融合的机器人障碍物检测 王中立,牛颖(太原理工大学信息工程学院,山西太原030024) 摘要:针对单一传感器在机器人避障过程中不能全面且准确定位障碍物的缺点,提出基于多传感器信息融合的 ...

  8. 动态(视频)图像拼接和EDF景深融合解决方案(源码分享)

    如上图所示,4张局部清晰,并且照片右左右上下位移,大小缩放,EDF景深融合成一张清晰的图片,上图为示意图,可实现视频动态景深融合,实时视频状态,调节相机工作距离或者调节镜头焦距,自动合成清晰的图像 图 ...

  9. 基于OpenCV的图像融合

    OpenCV实践-基于OpenCV的图像融合 –<小白学视觉>学习笔记 我们可以尝试多种不同图像组合. 比如可以将两张不同的图片或文本图像与图像组合在一起, 或将彩色背景与圈像组合在一起. ...

最新文章

  1. 局部敏感哈希算法(Locality Sensitive Hashing)
  2. 趣谈Linux操作系统学习笔记:用户态内存映射:如何找到正确的会议室?(第25讲)...
  3. [Lintcode]41. Maximum Subarray/[Leetcode]53. Maximum Subarray
  4. VTK:PolyData之GreedyTerrainDecimation
  5. python中plot的图像类型_Python绘图问题:Matplotlib中指定图片大小和像素
  6. linux主线程结束 子线程还能运行么,linux主线程和子线程
  7. Linux下安装配置JDK
  8. ic读卡器设置工具_从Matlab被禁来看,给IC教育带来哪些启发?
  9. ubuntu 开启 rewrite 模块
  10. js事件循环机制-宏任务微任务
  11. SpringBoot系列: Pebble模板引擎语法介绍
  12. (专升本)Excel(分页符的删除)
  13. 黑鲨重装计算机安装无法继续,黑鲨装机大师常见问题详解
  14. .net EF 新手教程
  15. java 时间格式 外语,java-如何使用ERA设置日语的英语日期格式
  16. 《快速掌握PyQt5》第二十三章 主窗口QMainWindow
  17. lib与dll的关系(详解静态链接库和动态链接库)
  18. 百度语音合成 java 教程_调用百度语音合成接口
  19. ssm框架外卖订餐系统
  20. 浅谈win10固定到任务栏别样方法

热门文章

  1. 第四章:Android灯光系统(3)-编写HAL
  2. 天融信防火墙保存配置_天融信防火墙配置备份 飞塔防火墙配置手册
  3. java关闭端口_使用java代码关闭指定端口的程序-windows
  4. Python爬取【京东商城】商品信息实例(末尾有关于价格的爬取)
  5. 【解读】Intel在hot chips上发布首款AI芯片
  6. 批量添加用户脚本--Linux bash
  7. 一个人到过的12个国家,45座城市
  8. ubuntu远程无法连接到服务器配置,解决ubuntu无法远程连接
  9. Multinomial Logit Model (MNL) 模型R语言nnet包multinom函数实现实例
  10. python创建工作簿_「总结篇」Python中所有的Excel操作技巧