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

时间:2015-05-29 07:16:25

标签: c# image bitmap grayscale opencvsharp

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

此示例不起作用(例外:ArgumentException)

    private Mat ToMat16bGrayscale(Image im)
    {

        Bitmap bmp2 = new Bitmap(im); 

    }

但是这个例子有效:

 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(); 
 }

我想知道为什么构造函数Bitmap不适用于Image 16bits灰度以及为什么转换为Image to Bitmap。

谢谢:)

1 个答案:

答案 0 :(得分:1)

PixelFormat.Format16bppGrayscale是一种白象图像格式。商品硬件,即您在机器中找到的那种,甚至远程接近能够准确呈现这样的位图。这是基于RGB的,每个颜色通道有8位,产生1600万种不同的颜色。其中只有256个是灰色阴影。更糟糕的是商品LCD显示器,它们通常不能比6位颜色信息更好,实际上渲染不超过64种灰度。将65,536个灰色阴影映射到256或64当然会导致 lot 的细节丢失。

它确实用于非常专业的应用程序。一种是放射成像,例如显示X射线图像。但他们也有非常昂贵的显示器来显示这样的图像。非平凡的电子元件是D / A转换器,一个16位转换器,可以在~250 MHz的频率下运行,需要大量的资金。它们还使用专门的图像文件格式,DICOM很常见,GDI +附带的编解码器不支持这些格式。

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

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