Признаюсь, я был заинтригован до тех пор, пока не увидел результат - 260+ секунд на двухъядерном процессоре, и это не предполагает накладных расходов на язык сценариев, а это для фильтра оптимизированных блочных нелокальных средств.
Позвольте мне разобрать для вас математику. Моя идея псевдокода заключается в написании на Ruby.
Фильтрация не локальных средств
Предположим, что изображение размером 200 x 100 пикселей (всего 20000 пикселей) является довольно маленьким изображением. Нам нужно пройти через 20 000 пикселей и оценить каждый из них по средневзвешенному значению других 19 999 пикселей: [Извините за интервал, но уравнение интерпретируется как ссылка без него]
NL [v] (i) = & sum; w (i, j) v (j) [j & isin; I]
, где 0 ≤ w (i, j) ≤ 1 и & sum; j w (i, j) = 1
Понятно, что эта последняя часть может немного сбивать с толку, но на самом деле это не более чем сверточный фильтр размером всего изображения, применяемого к каждому пикселю.
Блочная фильтрация нелокальных средств
Блочная реализация принимает перекрывающиеся наборы вокселей (объемные пиксели - реализация, на которую вы указали, предназначена для трехмерного пространства). Предположительно, используя аналогичный подход, вы можете применить это к 2D-пространству, принимая наборы перекрывающихся пикселей. Посмотрим, сможем ли мы описать это ...
NL [v] (i j k ) = 1 / | A i | & sum; w (i j k , i) v (i)
Где A - вектор пикселей, подлежащих оценке, и применяются те же обстоятельства, что и выше.
[NB: я могу быть немного не в себе; Прошло несколько лет с тех пор, как я много занимался обработкой изображений]
Алгоритм
По всей вероятности, мы говорим о снижении сложности алгоритма при минимальных затратах для снижения качества. Чем больше вектор выборки, тем выше качество и сложность. Наложением, а затем усреднением векторов выборки из изображения и последующим применением этого взвешенного среднего к каждому пикселю, мы зацикливаемся на изображении гораздо реже.
- Переберите изображение, чтобы собрать векторы выборки и сохранить их средневзвешенное значение в массиве.
- Применять каждое взвешенное среднее (число от 0 до 1) к каждому пикселю, умноженному на значение пикселей.
Довольно просто, но время обработки будет большим с большими изображениями.
Заключительные мысли
Тебе придется принять несколько трудных решений. Если вы собираетесь использовать язык сценариев, вы уже столкнулись со значительными накладными расходами на интерпретацию. Далеко не оптимально использовать язык сценариев для обработки тяжелых изображений. Если вы не обрабатываете медицинские изображения, по всей вероятности, есть гораздо лучшие алгоритмы, которые можно использовать с меньшими O.
Надеюсь, что это полезно ... Я не очень хорош в четком и кратком изложении, поэтому, если я смогу что-то прояснить, дайте мне знать.