包含下采样的去马赛克算法

Nej*_*ejc 15 c++ algorithm signal-processing image-processing computer-vision

简介:我在做什么.

大家好!我正在研究一种去马赛克算法,我用它将具有拜耳模式的图像转换为代表红色,绿色和蓝色通道的图像.我希望该算法具有以下属性:

  1. 它保留尽可能多的原始信息.

  2. 它不会模糊图像中的细节,即使这意味着没有去噪.

  3. 它产生尽可能少的工件.
  4. 如果马赛克图像的尺寸是N×N,则三个彩色图像应各自具有N/2×N/2的尺寸.
  5. 算法应该很快.为了将"快速"放入上下文中,让我这样说:我会满足于使用双线性插值的OpenCV算法至少两倍的速度.

到目前为止我取得了什么.

到目前为止,我已经提出了使用双线性插值的算法,并生成了三幅图像,这些图像具有马赛克图像的一半大小.该算法比执行CV_BayerBG2BGR转换(双线性插值)的OpenCV的cvtColor算法3-4倍.

请参阅下面的拜耳模式草图,了解它的工作原理.我在圆圈标记的点处执行插值.数字代表我乘以下面的像素的系数,以便在由黑色圆圈标记的点中获得内插值.

在此输入图像描述

您可以在下面观察我的算法的结果.我还添加了OpenCV中可用的两种去马赛克算法的结果(双线性插值和可变数量的梯度).请注意,虽然我的算法结果看起来相当差,但如果我对它们进行下采样,OpenCV的双线性插值结果看起来几乎完全相同.这当然是预期的,因为基础算法是相同的.

在此输入图像描述

......所以最后:问题.

我目前的解决方案为我的项目提供了可接受的结果,而且速度也可以接受.但是,如果能够改进上面列出的5个标准中的任何一个,我愿意使用速度最快两倍的算法.那么问题是:如何在不显着阻碍性能的情况下改进算法?

我有足够的编程经验来完成这项任务,所以我并不是特别要求代码片段 - 任何类型的答案(代码,链接,建议 - 尤其是基于过去经验的答案)都是受欢迎的.

一些其他信息:

  • 我在C++工作.
  • 该算法经过高度优化,使用SSE指令并且是非并行的.
  • 我使用大图像(几MB); 缓存感知和避免多次通过图像非常重要.

我不是在寻找一般的编程建议(例如一般的优化等),但另一方面,一些特定于任务的答案非常受欢迎.先感谢您.

cJ *_*oub 1

我对你的算法有点困惑,不会对此发表评论......但要正确看待一些事情......

\n\n

OpenCV 是一个库,其中包含许多通用的东西来完成工作,有时故意不进行性能过度优化,存在成本可维护性权衡,\xe2\x80\x9c足够好比更好\xe2\更好x80\x9d。\n有很多人在销售实现 OpenCV 某些功能的性能优化库,有时使用完全相同的 API。\n我没有使用过它,但 OpenCV 有一个cv::gpu::cvtColor()可以实现您的目标的库,开箱即用,假设它是为了去马赛克而实现的,并且您有合适的 GPU。

\n\n

考虑到双线性去马赛克,一种维护性较差但更优化的 CPU 实现可以比 OpenCV 的运行速度快得多,我估计在一个主流 CPU 内核上的速度超过 250 Mpx/s。

\n\n

现在详细说明优化路径...

\n\n

首先,因为去马赛克是本地操作,所以缓存感知实际上并不是一个重大问题。

\n\n

性能优化的实现将具有不同的代码路径,具体取决于图像尺寸、拜耳模式类型、CPU 支持的指令集(及其速度/延迟),对于这样一个简单的算法,它将变成大量代码。

\n\n

有一些 SIMD 指令可以执行洗牌、算术(包括平均)、流式内存写入,您会发现这些指令很有用。英特尔的摘要还不错,而且Agner Fog 的网站对于任何类型的实施优化也很有价值。AVX 和 AVX2 提供了一些有趣的像素处理指令。

\n\n

如果您是 80/20 类型的人(对您有好处!),您会喜欢使用像Halide这样的工具,它可以轻松生成优化的模板代码(以学习曲线为模,这已经让您退缩了) 1 小时的简单实现或使用 OpenCV 的 10 分钟的几天),特别是处理边界条件(图像边界)。

\n\n

您可以通过使用编译器内在函数来访问特定的 CPU 指令来更进一步(或采取替代方法),此时您的代码现在成本要高 4 倍(就开发成本而言),并且可能会为您带来 99% 的回报手工组装(再次$$$ x4)。

\n\n

如果您想挤掉最后一滴(通常不建议),您肯定需要执行数天的实施基准测试,以查看哪种指令序列可以获得最佳性能。

\n\n

而且,GPU...您可以使用集成 GPU 来执行去马赛克,它可能比 CPU 快一点并且可以访问主内存...当然您必须关心预分配共享缓冲区。在这些填充率下,独立 GPU 的传输开销会更大。

\n