Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
RecPosl_Lec.doc
Скачиваний:
6
Добавлен:
12.03.2015
Размер:
2 Мб
Скачать
☆

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.Пример алгоритма

подавления шума

поступающего в окно столбца и di - сумма эле­ментов первого столбца окна в предыдущем положении. После прохождения окном всего буфера B последний сдвигается на одну строку вниз и дополняется снизу новой строкой изображения и процесс сканирования окном повторяется. Сдвиг изображения в буфере B достаточно трудоемкая операция, связанная с перемеще­нием большого объема информации, поэтому желательно не перемещать ин­формацию, а свести сдвиг к манипуляциям с указателями и индексами, так как это обычно применяют к структурам типа «очередь» (см. п. 5.8). Таким образом, прихо­дим к идее кольцевого буфера, в котором используются индекс u для указания началь­ной строки фрагмента изображения, помещенного в данный момент в буфер. В этом случае сдвигу изображения будет соответствовать изменение этого индекса по закону:

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.

Таким образом, алгоритм фильтрации состоит из следующих основных шагов:

  1. Начальная загрузка буфера В первыми m строками изображения.

  2. Цикл обработки всего изображения, состоящий из:

а) вычисления первой суммы для начального положения окна в буфере В, вычислений сумм столбцов и начального заполнения буфера 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]