2009-11-26 59 views
1

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

我想在C#中创建类似的东西,但很多必要的构造如模板和某些运算符重载(如一元*)都缺失。我愿意接受我所能创造的东西不会像GIL那样稳健和优雅,但我希望尽可能地对这些概念进行建模。最终,抽象图像差异和编写通用处理算法将是目标。有了C#,泛型,lambda,甚至动态IL/cringe中有什么可用,人们认为一些可能的方法是设计库的方式是什么?

+0

我不确定你的意思,但我们必须在我们的项目中处理很多不同的图像格式,而我们只是通过使用托管扩展性框架来处理。 – TimothyP 2009-11-26 10:07:02

+0

MEF很酷,但我不确定它解决了我所说的问题。你可以看看GIL吗? http://www.boost.org/doc/libs/1_39_0/libs/gil/doc/index.html。它实际上可以让你编写一种算法来写入任何图像格式。图像是一个迭代器,可以枚举每个像素,而不管通道数量或位深度,甚至通道是按照交错还是平面顺序排列。这个和更多的是在GIL中完成的,但是由于模板的原因,它们的手动编码速度非常接近。 – Charles 2009-11-26 18:46:46

+0

我想更清楚:说我有一个算法来计算直方图。我不想为灰度,565RGB,24RGB,32RGB,RGBA,ARGB,BGRA,ABGR或甚至其他色彩空间(如CYMK和HSL)编写单独的灰度。通过软件的魔力,这些差异应该能够被抽象出来,因此图像处理例程的算法编写者只需要编写一种可以在所有格式上运行的算法。 – Charles 2009-11-26 18:51:59

回答

0

你见过Aforge.NET,设计的方式很通用。

该库的作者通过接口解决了许多您正在讨论的问题。关闭我的头顶上的东西,如IFilter,IFilterColourToAny等

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

+0

这是一个很棒的图书馆,但是他们没有将任何图像处理例程概括为与格式无关。他们所有的东西都可以用RGB位图或灰度图像。 我正在寻找一种方法来推广像GIL那样的像素和像素格式的迭代。例如,在GIL中,您可以编写一个算法来处理类似阈值的问题,并且可以在任何色彩空间中的任何图像上处理任意数量的通道,并且每个通道具有任意数量的位。这正是我想要完成的。 – Charles 2009-11-26 18:17:18

+0

@Charles:我希望这可以在C#中实现。我还没有找到办法。 C++模板远比C#泛型更强大。当涉及到通用数字运算时,C#真正落到了它的面前。 – 2013-08-07 21:33:30

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映射黑白(逻辑/判定的位图,例如,边缘地图或连接部件的blob成员)
  • 8bpp的灰色
  • 24 bpp的BGR
  • 32bpp的BGRA
  • 32bpp的灰色浮法
  • 96bp p BGR浮动
  • 128bpp BGRA浮法

如果算法类看到的输入位图处理的不是上述类型之一,它将尽力无损地“提升”的输入格式转换的一个以上格式。

有了这个自动升频转换,这种算法类的用户失去了对输出位图的像素格式严格控制,但涨幅在保证输出的外观将按照预期