C#加载16bit灰度图像

  • 起因
  • OpenCvSharp
  • 改进

起因

用C#写界面的时候发现Bitmap加载图像时,对于Format8bppIndexedFormat16bppGrayScale类型无法很好地支持,在微软的官方文档内也有相关说明

https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.graphics.fromimage?view=dotnet-plat-ext-5.0

OpenCvSharp

偷懒直接使用了openCv在C#上的封装,在VS里直接安装Nuget包后就能调用OpenCVSharp了。

using OpenCvSharp;

Mat转Bitmap提供了一个方法,但是仅能够给CV_8U系的图像使用,对于CV_16UC1的图像会报错:

src = new Mat(filename, ImreadModes.Unchanged);
Bitmap dst = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);

最后通过抽出Mat里的数据,作为图像数据给到Bitmap的构建函数。Bitmap的类型也需要同时指定:

src = new Mat(filename, ImreadModes.Unchanged);
Mat dst = null;if (depth == MatType.CV_8UC1)dst = new Bitmap(MATSrc.Width, MATSrc.Height, (int)(MATSrc.Step()), PixelFormat.Format8bppIndexed, MATSrc.Data);
else if (depth == MatType.CV_16UC1)dst = new Bitmap(MATSrc.Width, MATSrc.Height, (int)(MATSrc.Step()), PixelFormat.Format16bppGrayScale, MATSrc.Data);
...
src.Dispose();
dst.Dispose();

虽然Bitmap和Mat都属于非托管型资源,需要手动释放。但是src释放资源后,图像数据可能被一并回收,此时调用dst时会报尝试访问被保护的内存的错误。

最后没有探究Marshal.Copy将数据备份出来的方法,而是索性在运行过程中不再释放,每次加载前先检查并释放src和dst变量。

最后结束前回收一下垃圾:

GC.Collect();

改进

上述方法在测试时遇到了某些图像加载不了的情况,排查后发现是由于没有考虑到windows系统对图像数据的4字节整数倍对齐的影响。

因此,上述方法只适合于图像宽度所占字节数是4的整数倍的情况下使用。对于16bit位深图像,图像宽度需要是偶数才行。

C#加载16bit灰度图像相关推荐

  1. python使用openCV图像加载(转化为灰度图像)、Canny边缘检测器检测图像的边缘(Detect Edges)

    python使用openCV图像加载(转化为灰度图像).Canny边缘检测器检测图像的边缘(Detect Edges) 目录

  2. python使用openCV图像加载(转化为灰度图像)、使用filter2D函数对图像进行锐化(Sharpen Images)

    python使用openCV图像加载(转化为灰度图像).使用filter2D函数对图像进行锐化(Sharpen Images) 目录

  3. python使用openCV图像加载(转化为灰度图像)、平滑图像处理就是将每个像素的值变换为其相邻元素的平均值、可视化平滑处理之后的图像(Blurring Images)

    python使用openCV图像加载(转化为灰度图像).平滑图像处理就是将每个像素的值变换为其相邻元素的平均值.可视化平滑处理之后的图像(Blurring Images) 目录

  4. Cocos2d之Texture2D类详解之将文件加载成Texture2D对象

    一.声明 笔者以cocos2d框架cocos2d-x-3.3rc0版本的源码做分析.本文为笔者原创,允许转载和分享,只要注明文章出处即可. 二.简介 Texture2D类简介 Texture2D类允许 ...

  5. opengl加载多个3ds模型失败记

    VC6 下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 opengl环境配置 http://blog.csdn.net/bcbo ...

  6. 加载cv2调用摄像头_用Python获取摄像头并实时控制人脸

    Python基础视频教程 入门免费观看-创客学院​www.makeru.com.cn 实现流程 从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像 ...

  7. 【OpenCV的C++教程2】加载、修改、保存图像

    颜色空间 颜色空间:也称彩色模型(又称彩色空间或彩色系统).本质上,彩色模型是坐标系统和子空间的阐述.位于系统的每种颜色都有单个点表示.RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜 ...

  8. 【OpenCV学习笔记之一】图像加载,修改及保存

    加载图像(用cv::imread) imread功能是加载图像文件成为一个Mat对象 其中第一个参数表示图像文件名称 第二个参数 表示加载的图像是什么类型 支持常见的三个参数值 IMREAD_UNCH ...

  9. stm32怎么加载字库_收藏 | STM32单片机超详细学习汇总资料(二)

    点击"蓝字"关注我们 3110月 收藏 | STM32单片机超详细学习汇总资料(一) ◆41.DMA仲裁器分为软件和硬件两种.软件部分分为4个等级,分别是很高优先级.高优先级.中等 ...

最新文章

  1. MySQL—相关子查询
  2. sql语句常见问题集锦
  3. [你必须知道的.NET]第二十五回:认识元数据和IL(中)
  4. SharePoint创建web application的时候报错
  5. [转载] 多线程详解java.util.concurrent
  6. 贪心——今年暑假不AC(hdu2037)
  7. Android开发学习笔记-GridView的动态显示
  8. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
  9. 一个介绍傅立叶变换的好文章
  10. P3819 松江1843路
  11. 计算机组成原理—数据的表示、运算与校验(思维导图)
  12. Problem 1036 四塔问题
  13. 数据结构_郝斌老师自学大纲
  14. jeff dean_Jeff Dean的构建大型分布式系统的软件工程建议
  15. 失意的企业家,排队和俞敏洪做直播
  16. Windows超级管理器-便携版
  17. python2代码转换python3(2018新)
  18. SWMM排水管网水力、水质建模及在海绵城市与水环境保护中的应用
  19. [Ant][StartWithAnt] 第七章 Ant扩展包ant-contrib的使用
  20. 世界淡水资源占水资源的多少_世界上可用淡水资源到底是多少

热门文章

  1. 扫盲帖:聊聊微服务与分布式系统
  2. 修改AD域ladp连接数
  3. 一个十年JAVA老程序员成长之路分享
  4. Laya Mouse
  5. Android多层嵌套Fragment中调用系统相机拍照以及裁剪的相关问题解决
  6. Google Sites开始向所有人免费开放 可自由建个人主页
  7. Python面试经验总结,面试一时爽,一直面试一直爽!
  8. Merriam-Webster's Vocabulary Builder 学习笔记 Unit 2
  9. 一、OCR-docker部署最新版PaddleServing和PaddleOCR,服务端,客户端,dockerfile部署
  10. 没有问题,本身就是问题!