C#加载16bit灰度图像
C#加载16bit灰度图像
- 起因
- OpenCvSharp
- 改进
起因
用C#写界面的时候发现Bitmap加载图像时,对于Format8bppIndexed
和Format16bppGrayScale
类型无法很好地支持,在微软的官方文档内也有相关说明
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灰度图像相关推荐
- python使用openCV图像加载(转化为灰度图像)、Canny边缘检测器检测图像的边缘(Detect Edges)
python使用openCV图像加载(转化为灰度图像).Canny边缘检测器检测图像的边缘(Detect Edges) 目录
- python使用openCV图像加载(转化为灰度图像)、使用filter2D函数对图像进行锐化(Sharpen Images)
python使用openCV图像加载(转化为灰度图像).使用filter2D函数对图像进行锐化(Sharpen Images) 目录
- python使用openCV图像加载(转化为灰度图像)、平滑图像处理就是将每个像素的值变换为其相邻元素的平均值、可视化平滑处理之后的图像(Blurring Images)
python使用openCV图像加载(转化为灰度图像).平滑图像处理就是将每个像素的值变换为其相邻元素的平均值.可视化平滑处理之后的图像(Blurring Images) 目录
- Cocos2d之Texture2D类详解之将文件加载成Texture2D对象
一.声明 笔者以cocos2d框架cocos2d-x-3.3rc0版本的源码做分析.本文为笔者原创,允许转载和分享,只要注明文章出处即可. 二.简介 Texture2D类简介 Texture2D类允许 ...
- opengl加载多个3ds模型失败记
VC6 下载 http://blog.csdn.net/bcbobo21cn/article/details/44200205 opengl环境配置 http://blog.csdn.net/bcbo ...
- 加载cv2调用摄像头_用Python获取摄像头并实时控制人脸
Python基础视频教程 入门免费观看-创客学院www.makeru.com.cn 实现流程 从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像 ...
- 【OpenCV的C++教程2】加载、修改、保存图像
颜色空间 颜色空间:也称彩色模型(又称彩色空间或彩色系统).本质上,彩色模型是坐标系统和子空间的阐述.位于系统的每种颜色都有单个点表示.RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,可表示大部分颜 ...
- 【OpenCV学习笔记之一】图像加载,修改及保存
加载图像(用cv::imread) imread功能是加载图像文件成为一个Mat对象 其中第一个参数表示图像文件名称 第二个参数 表示加载的图像是什么类型 支持常见的三个参数值 IMREAD_UNCH ...
- stm32怎么加载字库_收藏 | STM32单片机超详细学习汇总资料(二)
点击"蓝字"关注我们 3110月 收藏 | STM32单片机超详细学习汇总资料(一) ◆41.DMA仲裁器分为软件和硬件两种.软件部分分为4个等级,分别是很高优先级.高优先级.中等 ...
最新文章
- MySQL—相关子查询
- sql语句常见问题集锦
- [你必须知道的.NET]第二十五回:认识元数据和IL(中)
- SharePoint创建web application的时候报错
- [转载] 多线程详解java.util.concurrent
- 贪心——今年暑假不AC(hdu2037)
- Android开发学习笔记-GridView的动态显示
- Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- 一个介绍傅立叶变换的好文章
- P3819 松江1843路
- 计算机组成原理—数据的表示、运算与校验(思维导图)
- Problem 1036 四塔问题
- 数据结构_郝斌老师自学大纲
- jeff dean_Jeff Dean的构建大型分布式系统的软件工程建议
- 失意的企业家,排队和俞敏洪做直播
- Windows超级管理器-便携版
- python2代码转换python3(2018新)
- SWMM排水管网水力、水质建模及在海绵城市与水环境保护中的应用
- [Ant][StartWithAnt] 第七章 Ant扩展包ant-contrib的使用
- 世界淡水资源占水资源的多少_世界上可用淡水资源到底是多少