Введение
Медианный фильтр — один из видов цифровых фильтров, широко используемый в цифровой обработке сигналов и изображений для
уменьшения уровня шума.
Реализуется с помощью окна, состоящего из нечётного количества отсчётов. Значения отсчётов внутри окна сортируются по порядку; и
среднее значение, то есть значение находящееся в середине упорядоченного списка, принимается выходным значением. На следующем шаге окно
передвигается на один отсчёт вперёд и вычисления повторяются. Крайние значения массива мыслим продублированными столько раз, чтобы можно
было применить окно к первому и к последнему значению.
Медианная фильтрация — обычная процедура обработки изображений. Она особенно часто используется для уменьшения шума в
изображении.
Постановка задачи
Дана матрица NxN. Необходимо реализовать параллельный алгоритм медианной фильтрации этой матрицы.
Метод решения
(Примечание: для простоты был реализован фильтр 3x3)
Последовательный алгоритм:
Фильтрация проводится построчно – для первого элемента строки заполняется массив окрестности (с учетом того, что искусственно
добавляются три значения-соседи слева), этот массив сортируется быстрой сортировкой, затем среднее значение записывается в выходную
матрицу. Для каждого следующего элемента строки массив окрестности не заполняется заново – в него лишь добавляются новые три элемента,
замещая старые три. Для того, чтобы это было возможно сделать за один проход (по массиву окрестности и новым трем элементам) введен
специальный массив с «количеством жизней» элемента. Жизней может быть 1, 2 и 3. Добавляемые 3 элемента предварительно сортируются и
добавление производится слиянием: во время него элементы с 1й жизнью затираются, элементы, имевшие 2 и 3 жизни получают 1 и 2
соответственно, а добавляемые элементы становятся обладателями 3х жизней. Средний элемент записывается в выходной массив. Обработка
последнего элемента производится повторением итерации предпоследнего шага. На практике данный метод по сравнению с полной выборкой
окрестности и ее сортировкой показывает превосходство по скорости в 3 раза.
Параллельный алгоритм:
(Примечание: размерность матрицы была ограничена значениями кратными двойке)
Т.к. в данной задаче наблюдается независимость по данным, параллелизм производится на основе деления матрицы на части (по
несколько строк, а именно N/p, где p –количество процессов). Если учесть что в персональных компьютерах обычно 1, 2, 4 или 8 ядер у
процессора, то деление будет производиться без остатка. После деления матрицы на части по высоте – они обрабатываются последовательным
алгоритмом, но необходимо учесть, то при этом невозможно обработать граничные строки (за исключением первой и последней в матрице) –
после завершения параллельных вычислений, части собираются обратно в одну матрицу, а оставшиеся строки необходимо отфильтровать
отдельно.
Анализ эффективности
Время фильтрации 1го элемента строки:
(2*9+9*ln(9)*2+1)*t , где t - время выполнения одной операции.
- (2*9 операций – заполнение массива окрестности и соответствующего массива «жизней»
- 9*ln(9)*2 – быстрая сортировка массивов
- 1 – выборка и присваивание медианы выходному элементу
Фильтрация последующих элементов строки:
(9+3+18+1)*t
- 9+3 – проход по массиву окрестности с добавлением новых элементов и удалением старых
- 18 – копирование массива окрестности и массива «жизней» из вспомогательных массивов
- 1 – выборка и присваивание медианы выходному элементу
Итого на требующееся на фильтрацию строки время:
((2*9+9*ln(9)*2)+1+(N-1)*(9+3+18+1))*t ≈(21N+37)*t
Время на фильтрацию всей матрицы:
Tp = (α+ω/β*N^2/p)+(21N+37)*t*(N/p+2*(p-1))
- α – латентность
- β - пропускная способность среды передачи
- ω - размер элемента матрицы
- 2*(p-1) – количество строк, оставшихся неотфильтрованными при делении матрицы на части)
T1 = (21N+37)*t*N
Тогда:
Ускорение: Sp = (T1 )/(Tp ) = ((21N+37)*t*N)/((21N+37)*t*(N/p+2*(p-1) )+α+ω/β*N^2/p) = βp/
(β+ω/21) ,при N→∞
Эффективность: Ep = (Sp )/p = β/(β+ω/21) ,при N→∞
Демонстрация
Ширина матрицы
|
Время выполнения (сек)
|
1
|
2
|
4
|
8
|
Tт
|
Tп
|
Tт
|
Tп
|
Tт
|
Tп
|
Tт
|
Tп
|
512
|
0.027134
|
0.032746
|
0.013678
|
0.021245
|
0.0071519
|
0.017787
|
0.004184
|
0.016893
|
1024
|
0.108349
|
0.132294
|
0.054436
|
0.073122
|
0.027772
|
0.047679
|
0.0150759
|
0.058709
|
2048
|
0.433023
|
0.528755
|
0.216984
|
0.300326
|
0.109574
|
0.217646
|
0.0571389
|
0.212924
|
4096
|
1.731348
|
2.104721
|
0.866569
|
1.414157
|
0.435423
|
1.063785
|
0.222386
|
1.063785
|
8192
|
6.923902
|
8.393932
|
3.463692
|
8.237934
|
1.736097
|
8.139418
|
0.877371
|
8.139418
|
Сравнение теоретических оценок ускорения с практическими:
Ширина матрицы
|
2
|
4
|
8
|
Sт
|
Sп
|
Sт
|
Sп
|
Sт
|
Sп
|
512
|
1.977266
|
1.541351
|
3.794181
|
1.841007
|
6.485653
|
1.938436
|
1024
|
1.990388
|
1.809223
|
3.901360
|
2.774681
|
7.187350
|
2.9253385
|
2048
|
1.995641
|
1.760603
|
3.951864
|
2.429427
|
7.578548
|
2.483304
|
4096
|
1.997933
|
1.488322
|
3.976242
|
1.978521
|
7.785321
|
2.299073
|
8192
|
1.998995
|
1.018936
|
3.988201
|
1.031269
|
7.891650
|
1.026975
|
Характеристики машины:
Intеl Core i7 920 @ 2.80GHz 2.00ГБ ОЗУ
латентность: a = 0,00005 cек
пропускная способность: b = 25,6 ГБ/с
время выполнения стандартной операции: t = 0,000000004912 сек
размер элемента набора : w = 4
Об авторах
Работу выполнили студенты группы 8411: Муравьев Владимир и Соловьев Павел