Я пытаюсь преобразовать следующий код из MATLAB в C++Fast 7x7 медианный фильтр 2d 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, у него есть средний фильтр 5x5, который поддерживает 16 бит, но 7x7 поддерживает только байты.
http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=medianblur#medianblur
2.I есть также заглянуть в Intel IPP, но я могу видеть только 1D медианный фильтр https://software.intel.com/en-us/node/502283
Есть ли быстрая реализация для 2D-фильтр?
ищет somehthing как этот
http://ndevilla.free.fr/median/median.pdf с использованием параллельного программирования и векторизованного (/ SSE AVX) операций ...
или это
Существует быстрая медиану процедура фильтрации, разработанная TSHuang, она представлены в книге: Двумерная цифровая обработка сигналов II. Трансформации и медианные фильтры. Отредактировано T.S.Huang. Springer-Verlag. 1981.
также здесь есть некоторые примеры кода http://www.sergejusz.com/engineering_tips/median_filter.htm
Update: здесь быстрый алгоритм https://nomis80.org/ctmf.pdf
здесь оптимизированная версия исходного кода http://nomis80.org/ctmf.html
@SimonKraemer я не волнует, если это OpenCV или что-то другое. и нет решения для этого вопроса ... – Gilad
@Gilad: Не могли бы вы объяснить, почему связанное решение здесь не применяется? – Daniel
Эта реализация выполняется довольно медленно, но ее можно легко улучшить. Previosuly Я рекомендовал использовать [реализацию на основе гистограмм] (https://rosettacode.org/wiki/Median_filter#C), но для 16 бит это может быть очень медленным. – Miki