C#通用图像处理库的设计指南

时间:2009-11-26 09:00:51

标签: c# c++ image-processing boost-gil

在任何图像处理库中,始终存在必须为每种图像格式(颜色空间,通道,位深度,存储器布局等)提供每种算法的实现的问题。一个非常优雅的解决方案是Boost GIL。通过C ++的强大功能和出色的设计,所有这些问题都被抽象出来,您可以编写一个适用于任何类型图像的算法。

我想在C#中创建类似的东西,但是缺少许多必要的构造,例如模板和某些运算符重载(如unary *)。我愿意接受我能创造的东西不会像GIL那样强大和优雅,但我想尽可能地对这些概念进行建模。最终,抽象图像差异和编写通用处理算法将成为目标。

随着C#,泛型,lambdas,甚至动态IL / cringe的可用性,人们认为一些可能的方法是设计库吗?

2 个答案:

答案 0 :(得分:0)

您是否见过Aforge.NET,其设计方式非常通用。

该库的作者通过接口解决了许多您正在讨论的问题。我最喜欢的东西,如IFilter,IFilterColourToAny等

要在.NET中进行高效的图像处理,你需要使用Bitmap.LockData(我认为)进入不安全的代码,这可能会否定你所讨论的所有酷.NET内容......

答案 1 :(得分:0)

虽然我的答案非常晚,但我希望它对其他人有用。

鉴于OP到目前为止已经确定的C#的局限性,这里列出了一些标准,这些标准在像素格式方面仍然给予程序员有限的自由。

  • 灵活的位图句柄C#类,它支持各种像素格式,而不是C#泛型类
    • 因为C#语言中的泛型类不会给图像处理用户带来任何好处。
  • 某些安全保证 - 位图句柄对象的某些特征应该是不可变的
    • 特别是,一旦创建,不应允许位图的像素格式和像素尺寸改变。要更改这些,必须创建一个新对象。
  • 提供可变接口(允许更改像素值)和不可变对象模型接口
    • 为任何API函数提供一个指示,表明不应该尝试写入特定的位图参数。
  • 一组接受并返回位图句柄类的图像处理算法类。
    • 在经济上可行的范围内,每种算法都尽力处理不同类型的像素格式。

考虑到标准,我建议使用System.Windows.Media.Imaging作为您正在构建的库的基础。

System.Windows.Media.Imaging命名空间是Microsoft Windows Imaging Component (WIC)库的C#副本。因此,底层处理在本机C ++中实现,使其具有实际使用所需的速度。

由于WIC实现了广泛的像素格式支持,C#版本也支持相同的range of pixel formats


WIC(和System.Windows.Media.Imaging)不提供任何高级图像处理功能(不包括Canny边缘检测,Hough变换,对象检测等)。

但是,就内存位图对象交换接口而言(用于将不同的图像库与C#接口或绑定集成),System.Windows.Media.Imaging.WriteableBitmapSystem.Drawing.Bitmap都是合适的。


在实现算法方面,有时很难使算法同样适用于单通道图像和多通道图像。这需要多年,如果不是几十年的多变量数学研究。

因此,图像处理算法类通常专注于支持窄像素格式子集:

  • 1bpp Black White(用于逻辑/决策位图,例如边缘图或连接组件blob成员资格)
  • 8bpp Gray
  • 24bpp BGR
  • 32bpp BGRA
  • 32bpp Gray Float
  • 96bpp BGR Float
  • 128bpp BGRA Float

如果算法类看到的输入位图句柄不是上述类型之一,那么它将尽可能无损地推广"输入格式为上述格式之一。

考虑到这种自动上转换,此算法类的用户对输出位图的像素格式失去了严格的控制权,但获得了输出的保证。 视觉外观将符合预期