3.3. Рекуррентные вычисления и обработка сигналов.
Приемы, характерные для обработки рекуррентных вычислений, как уже отмечалось, широко используются на практике. Рассмотрим несколько примеров из области обработки сигналов. Первый из них относится к обработке одномерных сигналов. Аналоговый сигнал какого-либо физического процесса после квантования и дискретизации часто представляется в виде одномерного массива значений (рис.3.1).
Массивы эффективно обрабатываются на ЭВМ:
- хорошо отображаются в одномерную память;
- есть прямой доступ к элементам;
- имеется аппаратная поддержка обработки (цепочечные и специализированные
машинные команды, способы адресации);
- эффективно обрабатываются циклами For.
Часто процедура обработки сигнала сводится к следующей вычислительной схеме. Имеется окно вычислений b (логически выделяется в массиве а или резервируется отдельно), которое сканируется вдоль массива а. Обычно m<<n. Для каждого положения окна вычисляются значения некоторой функции окна F(a,b), в соответствии с решаемой задачей, например:
- фильтрация сигнала;
- корреляция;
- определение совпадающих фрагментов;
- пороговое преобразование;
- и т. п.
Рассмотрим обработку сигнала усредняющим фильтром. Пусть результаты фильтрации записываются в массив r.
For i:= 0 To n - m Do Begin {цикл сканирования окном}
s := 0;
For j:= 0 To m-1 Do s:= s + a[ i + j ]; {накопление суммы в пределах окна}
r [ i + m Div 2 ] := s Div m; {запись среднего значения}
End;
Если не учитывать краевых эффектов (связанных с неопределенностью на концах массива r), то основное требование к алгоритму – максимальное быстродействие. Количество основных операций равно:
V = (n - m+1)*(m + 1),
где: (n - m+1) – количество повторений внешнего цикла;
(m+1) – количество повторений внутреннего цикла плюс операцияделения.
У
читывая,
что
m<<n
V ≈ n* m.
Однако, можно заметить, что одни и те же слагаемые входят в суммы для соседних положений окна. Поэтому можно применить, так называемый метод динамической модификации (MДМ), повышающий эффективность вычислений (рис.3.2.). Рекуррентная формула для получения значения следующей суммы выглядит следующим образом: si+1 = si + ai+m - ai.
Тогда МДМ – алгоритм можно представить в следующем виде:
s:=0;
For i := 0 To m -1 Do s := s + a [ i ]; {вычисление 1-ого значения}
r [ m Div 2 ] := s;
For i := 1 To n - m Do Begin
s := s + a [ i + m – 1] – a [ i –1] { MDM –
r [ i + m Div 2 ] := s Div m; вычисления }
End;
Объем вычислений V ≈ n и не зависит от n.
Подобные
приемы повышения эффективности вычислений
можно применять и для двумерных сигналов,
например изображений (рис. 3.3). «Лобовое»
решение задачи фильтрации на двумерном
изображении размером n×n
c
окном m×m
дает объем
вычислений порядка V
≈
n2∙m2.
При этом
объем
требуемой
оперативной памяти под изображение
составляет n×n
байт (в
предположении, что под пиксель отводится
один байт). Организация МДМ – вычислений
может быть реализована в двух вариантах.
1 вариант. Выделим буфер B (см. рис.3.3) размером m×n и вначале загрузим в него первые m строк изображения. Для фильтрации этого фрагмента изображения
окно m×m сканируется вдоль буфера B. Значение суммы для каждого положения окна вычисляется по формуле si+1 = si + dj - di , где dj - сумма элементов
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b1 |
b2 |
b3 |
|
|
|
|
|
b0 |
c |
b4 |
|
|
|
|
|
b7 |
b6 |
b5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Если
Рис.3.4.Пример алгоритма подавления шума |
||||||
u := (u +1) mod m;
Буфер называется кольцевым, поскольку значения индекса u изменяются по закону 0,1, …, m-1, 0, 1, ...
В данной схеме вычислений можно заметить, что элементы одного и того же столбца суммируются дважды: первый раз при вычислении величины di и второй раз – dj. Чтобы избежать двойного суммирования в структуру данных включается второй кольцевой буфер d (см. рис. 3.3) с указателем (индексом) h на выпадающий при сдвиге элемент буфера. Сдвигу буфера d соответствует изменение индекса h:
h := (h+1) mod m.
На практике применяются различные фильтры для подавления помех на изображениях. Выбор фильтра зависит от многих причин и во многом от вида помех. Изображение может повреждаться шумами и помехами различного происхождения, например шумом видеодатчика, шумом зернистости фотоматериалов и ошибками в канале передачи. Их влияние можно минимизировать, пользуясь классическими методами пространственной обработки изображений[12].
Шумы видеодатчиков или ошибки в канале передачи обычно проявляются на изображении как разрозненные изменения изолированных элементов, не обладающие пространственной корреляцией. Искаженные элементы часто весьма заметно отличаются от соседних элементов. Это наблюдение послужило основой для многих алгоритмов, обеспечивающих подавление шума [12]. Поскольку шум пространственно декоррелирован, в его спектре, как правило, содержатся более высокие пространственные частоты, чем в спектре обычного изображения. Следовательно, простая низкочастотная пространственная фильтрация может служить эффективным средством сглаживания шумов.
Рис. 3.4 поясняет простой пороговый метод подавления шума, при использовании которого последовательно измеряют яркость всех элементов изображения. Если яркость данного элемента превышает среднюю яркость группы ближайших элементов на некоторую пороговую величину p, яркость элемента заменяется на среднюю яркость. Рис. 3.5 иллюстрирует эффективность этого алгоритма применительно к различным изображениям.
В качестве примера рассмотрим применение МДМ-вычислений для фильтрации бинарного (черно-белого) и полутонового изображений. Эти изображения отличаются тем, что в первом пиксели могут принимать значения 0 или 1, а во втором – в некотором диапазоне кодирования уровня яркости, например, 0..255. Пусть на изображениях присутствуют точечные помехи, искажающие яркости отдельных пикселей ( шум типа «соль и перец»). Примеры таких изображений приведены на рис. 3.5. Реализации усредняющего фильтра для бинарного и полутоновых изображений несколько отличаются: в случае бинарных изображений суммарная яркость в окне m×m сравнивается с некоторым априорно заданным порогом p (обычно выбирают p = 0.5m2), для полутоновых изображений вычисления производятся по формуле на рис. 3.4.
Таким образом, алгоритм фильтрации состоит из следующих основных шагов:
-
Начальная загрузка буфера В первыми m строками изображения.
-
Цикл обработки всего изображения, состоящий из:
а) вычисления первой суммы для начального положения окна в буфере В, вычислений сумм столбцов и начального заполнения буфера d и запись первого отфильтрованного пикселя в результирующий буфер R;
б) сканирования окном m×m буфера В и запись результатов фильтрации в буфер R, при этом используются МДМ-вычисления и ротация значений сумм столбцов в кольцевом буфере d;
в) по завершению сканирования результат (т.е. строка отфильтрованного изображения) из буфера R выводится в выходной файл, а из входного файла в буфер B по индексу u считывается очередная строка исходного изображения.
Ниже приведен пример процедуры Filtr для обработки бинарного изображения с предварительным описанием необходимых структур данных. Результаты обработки бинарного и полутонового изображений приведены на рис. 3.5.
Const n = 250; { размер строки изображения }
m = 7; { m×m – размер окна фильтра }
m0 = m Div 2; {положение центра окна}
p = m*m0; {порог для фильтра}
Type Tstr = Array [0..n-1] Of Byte; {тип строки буфера}
TBuf = Array [0..m-1] Of Tstr; { тип буфера }
Var B :TBuf; { кольцевой буфер n×m для изображения }
d :Array[0..m-1] Of Integer; { кольцевой буфер для сумм столбцов окна }
fi, fo : File Of Tstr; {входной и выходной файлы изображения}
R :Tstr; { буфер вывода строки}
Procedure Filtr; {Процедура фильтрации бинарного изображения
усредняющим фильтром }
Var u, h , {u, h – указатели для буферов}
i, x, s, :Integer; { рабочие переменные}
Begin
For i:=0 To m-1 Do Read(fi,B[i]); {начальное заполнение буфера изобр-я}
u:=0; {при сдвиге буфера изобр-я строка с индексом u будет обновлена }
While Not Eof(fi) Do Begin { цикл обработки всего изображения }
s:=0; {вычисление первой суммы в окне mm
For x:=0 To m-1 Do Begin и сумм столбцов в этом же окне }
d[x]:=0; {в d[x] сумма
For i:=0 To m-1 Do Inc( d[x], B[i,x] ); x-го столбца}
s := s + d[x]; { в s общая сумма в окне}
End;
R[m0]:=Byte(s>p); {если сумма в окне ,больше порога, то на выходе 1 иначе 0}
h:=0; { h указывает на выпадающий при сдвиге элемент буфера d }
For x:=1 To n-m Do Begin { цикл сканирования окном вдоль буфера B }
s := s - d[h]; {коррекция суммы на значение выпадающего элемента}
d[h] := 0; {вычисление
For i:=0 To m-1 Do Inc( d[h], B[i, x+m-1] ); суммы нового столбца}
s := s + d[h]; {вычисление результирующей суммы элементов в окне}
R[m0+x] := Byte(s > p); {запись результата}
h := (h+1) Mod m; {продвижение индекса h по кольцу}
End;
Write(fo,R); {запись выходной строки изображения в файл}
Read(fi,B[u]); {чтение новой строки изображения в буфер}
u := (u + 1) Mod m; {продвижение индекса u по кольцу}
End;
End;

изображение с шумом отфильтрованное изображение
а)

изображение с шумом отфильтрованное изображение
б)
Рис. 3.5. Примеры двумерной фильтрации: а) бинарного изображения; б) полутонового
изображения с усредняющим фильтром.
Объем вычислений при этой схеме получается V ≈ n2∙m.
3
вариант – разработан
автором. Пусть окно вычислений m×m
занимает некоторое положение на
изображении. Положение окна характеризуется
координатами (
i,
j
),
причем эти координаты соответствуют
правому нижнему углу окна. Рассмотрим
еще три соседних положения окна с
координатами
( i - 1, j - 1 ), ( i - 1, j ), ( i, j - 1 ) (рис.3.6).
Суммы элементов в каждом окне обозначим Р1, … ,Р4 : Р1 = si-1,j-1; Р2 = si-1,j; Р3 = si,j-1; Р4 = si,j.
Можно доказать следующую рекуррентную формулу:
Р4 = Р2 + Р3 – Р1 + k + f – h – g,
где k, f, h, g – угловые элементы. Другими словами текущее значение суммы элементов окна можно вычислить по значению сумм соседних окон и угловых элементов. Действительно, если a,b,c,d,e,f,g,h,k – это площади соответствующих прямоугольников на фигуре, показанной на рис.3.6, то

Как видим, полученная рекуррентная формула очень похожа на те, которые обсуждались при создании алгоритмов вычисления треугольника Паскаля, поэтому схема вычислений в общих чертах может быть подобной:
Таким образом, для рекуррентных вычислений сумм элементов в окне требуется одномерный буфер P и буфер для хранения угловых элементов окон. К сожалению, для этого нужен буфер подобный буферу C. Тем не менее, объем необходимых вычислений сокращается и составляет приблизительно V ≈ n2.

,
то