【发布时间】:2016-06-05 05:10:31
【问题描述】:
我正在尝试将以下代码从 matlab 转换为 c++
function data = process(data)
data = medfilt2(data, [7 7], 'symmetric');
mask = fspecial('gaussian', [35 35], 12);
data = imfilter(data, mask, 'replicate', 'same');
maximum = max(data(:));
data = 1 ./ ( data/maximum );
data(data > 10) = 16;
end
我在 medfilt2 中的问题 - 这是一个 2D 中值滤波器,我需要它来支持每像素 10 位和更多图像。
1.我研究过openCV,它有一个支持16位的5x5中值滤波器,但7x7只支持字节。
http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=medianblur#medianblur
2.我也看过英特尔 IPP,但我只能看到一维中值滤波器 https://software.intel.com/en-us/node/502283
二维过滤器是否有快速实现?
寻找类似的东西:
- Fast Median Search: An ANSI C Implementation 使用并行编程和矢量化 (AVX/SSE) 操作...
- 二维数字信号处理 II。变换和中值滤波器。 由 T.S.Huang 编辑。施普林格出版社。 1981 年。
FAST MEDIAN FILTERING WITH IMPLEMENTATIONS IN C/C++/C#/VB.NET/Delphi中有更多代码示例。
【问题讨论】:
-
@Gilad:你能解释一下为什么链接的解决方案在这里不适用吗?
-
该实现相当缓慢,但可以轻松增强。以前我建议使用implementation based on histograms,但对于 16 位可能会很慢。
-
@Gilad 对于每个位置,您可以根据您的 7x7 窗口构建一个包含 49 个元素的数组,并在其上使用 IPP 进行一维案例。
-
考虑在您的问题中添加
SSE和AVX标签。 -
它必须是一个严格正确的中位数运算,还是可以接受非常接近它的东西?
标签: c++ c opencv image-processing simd