用于`UINT16`二维阵列的C / C ++快速中值滤波器

时间:2012-04-26 18:01:54

标签: c++ c image-processing code-snippets median

有没有人知道c ++中16位(无符号短)数组的快速中值滤波算法?

http://nomis80.org/ctmf.html

这个看起来很有希望,但它似乎只适用于字节数组。有没有人知道如何修改它以使用短裤或替代算法?

6 个答案:

答案 0 :(得分:4)

本文中的技术依赖于为8位像素通道创建256个二进制位的直方图。每个通道转换为16位需要具有65536个bin的直方图,并且图像的每列需要直方图。将内存需求膨胀256使得整体算法效率降低,但仍可能适用于当今的硬件。

使用他们建议的优化将直方图分解为粗糙和精细部分应该进一步将运行时命中率降低到只有16倍。

对于小半径值,我认为你会发现传统的中值滤波方法会更有效。

答案 1 :(得分:3)

Fast Median Search - An ANSI C implementation(PDF)适用于C,它是一篇标题为“快速中值搜索:ANSI C实现”的论文。作者声称它是O(log(n)),他也提供了一些代码,也许它会帮助你。它并不比你建议的代码更好,但也许看起来值得。

答案 2 :(得分:1)

本文介绍了一种对每个像素的O(log r )时间运行的图像进行中值滤波的方法,其中 r 是滤波器半径,适用于任何数据类型(无论是8位整数还是双精度数):

Fast Median and Bilateral Filtering

答案 3 :(得分:1)

std::vector<unsigned short> v{4, 2, 5, 1, 3};
std::vector<unsigned short> h(v.size()/2+1);
std::partial_sort_copy(v.begin(), v.end(), h.begin(), h.end());
int median = h.back();

以 O(N·log(N/2+1)) 运行并且不会修改您的输入。

答案 4 :(得分:0)

参见以下论文中的等式4和5。复杂度为O(N * W),其中W是滤波器的宽度,N是样本数。

请参阅Noise Reduction by Vector Median Filtering

答案 5 :(得分:0)

我知道这个问题有些陈旧但我也对中值滤波感兴趣。如果正在处理信号或图像,则处理窗口的数据会有很大的重叠。这可以利用。

我在这里发布了一些基准代码:1D moving median filtering in C++

它是基于模板的,因此它应该适用于大多数POD数据类型。

根据我的结果std::nth_element对于移动中位数的效果不佳,因为它必须每次都对值窗口进行排序。

但是,使用保持排序的值池,可以执行3次操作的中位数。

  1. 从池中删除最旧的值(调用std :: lower_bound)
  2. 将新值插入池(调用std :: lower_bound)
  3. 在历史记录缓冲区中存储新值
  4. 中位数现在是池中的中间值。

    我希望有人发现这很有趣,并提出他们的想法!