C中最快的抖动/半色调库

我正在开发一个自定义瘦客户端服务器,为其客户端提供渲染的网页。 服务器在多核Linux机器上运行,Webkit提供了html渲染引擎。

唯一的问题是客户端显示受限于4位(16色)灰度调色板。 我目前正在使用LibGraphicsMagick抖动图像(RGB-> 4bit灰度),这是服务器性能的明显瓶颈。 分析表明,超过70%的时间用于运行GraphicsMagick抖动函数。

我已经探索了stackoverflow和Interwebs的高性能解决方案,但似乎没有人在各种图像处理库和抖动解决方案上做任何基准测试。

我会更乐意发现:

  1. 什么是关于抖动/半色调/量化RGB图像到4位灰度的最高性能库。
  2. 是否有任何特定的抖动库或任何可以指向我的公共域代码片段?
  3. 在高性能方面,您更喜欢哪些库来操作图形?

首选C语言库。

根据所选择的算法,抖动将花费相当多的时间。

实现Bayer(Matrix)和Floyd-Steinberg(Diffusion)抖动是相当简单的。

使用MMX / SSE编码处理并行像素时,可以非常快速地进行拜耳滤波。 您也可以使用GPU着色器进行抖动/转换。

FWIW,您已经在使用GraphicsMagick,但这里有一整套OSS图形库

从Adisak提供的列表中,我没有任何测试,我会打赌AfterImage 。 Afterstep人对速度很着迷,并且还描述了一种聪明的算法。

如果您的服务器可以配备具有OpenGL的体面的PCI-express显卡,您可以采取另一种方法。 以下是Nvidia的一些规格。 搜索“索引模式”。 您可以做的是选择16或256色显示模式,将图像渲染为平面多边形(如立方体侧面)上的纹理,然后再读取帧。

从OpenGL卡读取帧时,卡的带宽很重要,因此需要PCI-express。 正如文档所述,您还必须在索引模式中选择颜色以获得不错的效果。

我知道它不是一个C库,但是这让我很好奇.NET可以用来做错误扩散,这是我20年前在一个项目中使用的。 我发现了这个 ,特别是这个方法 。

但要尝试帮助:)我找到了这个C库 。

这是Floyd-Steinberg半色调方法的实现:

#include  using namespace cv; int main(){ uchar scale = 128; // change this parameter to 8, 32, 64, 128 to change the dot size Mat img = imread("../halftone/tom.jpg", CV_LOAD_IMAGE_GRAYSCALE); for (int r=1; r(r,c); uchar newPixel = oldPixel / scale * scale; img.at(r,c) = newPixel; int quantError = oldPixel - newPixel; img.at(r+1,c) += 7./16. * quantError; img.at(r-1,c+1) += 3./16. * quantError; img.at(r,c+1) += 5./16. * quantError; img.at(r+1,c+1) += 1./16. * quantError; } } imshow("halftone", img); waitKey(); }