在任何图像处理库中,始终存在必须为每种图像格式(颜色空间,通道,位深度,存储器布局等)提供每种算法的实现的问题。一个非常优雅的解决方案是Boost GIL。通过C ++的强大功能和出色的设计,所有这些问题都被抽象出来,您可以编写一个适用于任何类型图像的算法。
我想在C#中创建类似的东西,但是缺少许多必要的构造,例如模板和某些运算符重载(如unary *)。我愿意接受我能创造的东西不会像GIL那样强大和优雅,但我想尽可能地对这些概念进行建模。最终,抽象图像差异和编写通用处理算法将成为目标。
随着C#,泛型,lambdas,甚至动态IL / cringe的可用性,人们认为一些可能的方法是设计库吗?
答案 0 :(得分:0)
您是否见过Aforge.NET,其设计方式非常通用。
该库的作者通过接口解决了许多您正在讨论的问题。我最喜欢的东西,如IFilter,IFilterColourToAny等
要在.NET中进行高效的图像处理,你需要使用Bitmap.LockData(我认为)进入不安全的代码,这可能会否定你所讨论的所有酷.NET内容......
答案 1 :(得分:0)
虽然我的答案非常晚,但我希望它对其他人有用。
鉴于OP到目前为止已经确定的C#的局限性,这里列出了一些标准,这些标准在像素格式方面仍然给予程序员有限的自由。
考虑到标准,我建议使用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.WriteableBitmap
和System.Drawing.Bitmap
都是合适的。
在实现算法方面,有时很难使算法同样适用于单通道图像和多通道图像。这需要多年,如果不是几十年的多变量数学研究。
因此,图像处理算法类通常专注于支持窄像素格式子集:
如果算法类看到的输入位图句柄不是上述类型之一,那么它将尽可能无损地推广"输入格式为上述格式之一。
考虑到这种自动上转换,此算法类的用户对输出位图的像素格式失去了严格的控制权,但获得了输出的保证。 视觉外观将符合预期。