1

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

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

有了 C#、泛型、lambdas,甚至动态 IL /cringe 中可用的内容,人们认为设计库的一些可能方法是什么?

4

2 回答 2

0

Have you seen Aforge.NET, the way that's designed is pretty generic.

The author of that library solved a lot of the problems you are talking about through interfaces. Off the top of my head stuff like, IFilter, IFilterColourToAny etc

To do efficient image processing in .NET you'll need to go into unsafe code using Bitmap.LockData (I think), which could negate all the cool .NET stuff you're talking about...

于 2009-11-26T09:19:13.067 回答
0

尽管我的回答来得太晚了,但我希望它对其他人有用。

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

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

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

命名空间是 Microsoft Windows 映像组件 (WIC)库的System.Windows.Media.ImagingC# 对应项。因此,底层处理是在原生 C++ 中实现的,使其具有实际使用所需的速度。

由于在 WIC 中实现了广泛的像素格式支持,C# 对应版本也支持相同范围的像素格式


WIC(和 System.Windows.Media.Imaging)不提供任何高级图像处理功能(没有 Canny 边缘检测、霍夫变换、对象检测等)

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


在实现算法方面,有时很难使算法同样适用于单通道图像和多通道图像。这需要数年甚至数十年的多元数学研究。

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

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

如果算法类看到不是上述类型之一的输入位图句柄,它会尽力无损地将输入格式“提升”为上述格式之一。

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

于 2014-04-23T18:50:45.700 回答