有谁知道 C++ 中 16 位(无符号短)数组的快速中值滤波算法?
这似乎很有希望,但它似乎只适用于字节数组。有谁知道如何修改它以使用短裤或替代算法?
有谁知道 C++ 中 16 位(无符号短)数组的快速中值滤波算法?
这似乎很有希望,但它似乎只适用于字节数组。有谁知道如何修改它以使用短裤或替代算法?
本文中的技术依赖于为 8 位像素通道创建具有 256 个 bin 的直方图。转换为每通道 16 位需要一个具有 65536 个 bin 的直方图,并且图像的每一列都需要一个直方图。将内存需求增加 256 会使这个算法总体上效率较低,但对于今天的硬件来说仍然可能是可行的。
使用他们提出的将直方图分解为粗略和精细部分的优化应该进一步将运行时命中率降低到仅 16 倍。
对于小半径值,我认为您会发现传统的中值滤波方法会更高效。
Fast Median Search - An ANSI C implementation (PDF) 是 C 的东西,它是一篇标题为“Fast median search: an ANSI C implementation”的论文。作者声称它是 O(log(n)),他还提供了一些代码,也许它会对你有所帮助。它并不比您建议的代码好,但也许值得一看。
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)) 中运行并且不会修改您的输入。
本文描述了一种对图像进行中值滤波的方法,该方法在每个像素的 O(log r ) 时间内运行,其中r是滤波器半径,适用于任何数据类型(无论是 8 位整数还是双精度数):
参见下一篇论文中的等式 4 和 5。复杂度为 O(N*W),其中 W 是滤波器的宽度,N 是样本数。
请参阅矢量中值滤波降噪。
我知道这个问题有点老了,但我也对中值过滤感兴趣。如果一个人正在处理信号或图像,那么处理窗口中的数据会有很大的重叠。可以利用这一点。
我在这里发布了一些基准代码:C++ 中的一维移动中值过滤
它是基于模板的,因此它应该适用于大多数 POD 数据类型。
根据我的结果std::nth_element
,移动中位数的性能很差,因为它每次都必须对值窗口进行排序。
但是,使用一个保持排序的值池,可以使用 3 操作执行中值。
中位数现在是池中的中间值。
我希望有人觉得这很有趣并贡献他们的想法!