C# 将图像16位灰度转换为位图16位灰度(构造函数错误)

C# 将图像16位灰度转换为位图16位灰度(构造函数错误),c#,image,bitmap,grayscale,opencvsharp,C#,Image,Bitmap,Grayscale,Opencvsharp,我尝试将图像(16位灰度)转换为位图(16位灰度) 此示例不起作用(异常:ArgumentException) 但这个例子是有效的: private Mat ToMat16bGrayscale(Image im) { //Cast obligatoire la création ou la copie d'une bitmap ne fonctionne pas ici... Bitmap bmp = (Bitmap)(im);

我尝试将图像(16位灰度)转换为位图(16位灰度)

此示例不起作用(异常:ArgumentException)

但这个例子是有效的:

 private Mat ToMat16bGrayscale(Image im)
 {

   //Cast obligatoire la création ou la copie d'une bitmap ne   fonctionne pas ici... 
                Bitmap bmp = (Bitmap)(im);
                Bitmap new_bmp = (Bitmap)bmp.Clone(); 
 }
我想知道为什么构造器位图不适用于16位灰度的图像,以及为什么将图像转换为位图可以工作


谢谢:)

像素格式。格式16bppgrayscale是一种白象图像格式。你可以在你的机器中找到的那种普通硬件,甚至远不能精确地渲染这样的位图。它是基于RGB的,每个颜色通道8位,产生1600万种不同的颜色。其中只有256个是灰色。更糟糕的是商品LCD显示器,它们通常只能使6位颜色信息与众不同,实际上只能呈现64种灰度。当然,将65536个灰度映射到256或64会丢失很多细节

它确实被用于非常专门的应用程序中。一种是放射成像,例如显示X射线图像。但他们也有非常昂贵的显示器来显示这样的图像。不平凡的电气元件是D/A转换器,一个可以运行在250兆赫左右的16位转换器需要很多钱。它们还使用专门的图像文件格式,DICOM是常见的,GDI+附带的编解码器不支持这种格式

在美国,当你在商品硬件上显示这样的医学图像时,无论谁看它,都无法看到足够的细节来正确诊断,比如说,正在演变的肿瘤,这是一个重大的问题。这本身足以阻止微软支持像素格式转换为像素格式,他们不想卷入这样的诉讼


GDI+支持存储这样的映像。您可以使用Bitmap.LockBits()获取像素数据。足够适合图像处理应用。但是,任何试图为此类图像创建图形对象或在此类图像上使用Graphics.DrawImage()的尝试都会导致异常。这就是位图(图像)构造函数所做的。寻找像LeadTools这样的供应商以获得库支持。

非常感谢您的回答。我使用X射线探测器(16位)。所以我使用OpenCVSharp打开并保存我的16位灰度图像。正如Hans解释的,普通硬件无法正确渲染16位灰度图像。还值得一提的是,根据显示设备和照明条件,人眼只能分辨100和500个灰度。然而,一些医学和科学图像可能包含人眼无法识别的重要数据,因此这些图像需要特殊技术来突出感兴趣的阴影,例如窗口调平。
 private Mat ToMat16bGrayscale(Image im)
 {

   //Cast obligatoire la création ou la copie d'une bitmap ne   fonctionne pas ici... 
                Bitmap bmp = (Bitmap)(im);
                Bitmap new_bmp = (Bitmap)bmp.Clone(); 
 }