Фурье-обработка цифровых изображений. Дискретные изображения

Замену непрерывного изображения дискретным можно выполнить различными способами. Можно, например, выбрать какую-либо систему ортогональных функций и, вычислив коэффициенты представления изображения по этой системе (по этому базису), заменить ими изображение. Многообразие базисов дает возможность образования различных дискретных представлений непрерывного изображения. Однако наиболее употребительной является периодическая дискретизация, в частности, как упоминалось выше, дискретизация с прямоугольным растром. Такой способ дискретизации может рассматриваться как один из вариантов применения ортогонального базиса, использующего в качестве своих элементов сдвинутые -функции. Далее, следуя, в основном, , подробно рассмотрим основные особенности прямоугольной дискретизации.

Пусть - непрерывное изображение, а - соответствующее ему дискретное, полученное из непрерывного путем прямоугольной дискретизации. Это означает, что связь между ними определяется выражением:

где - соответственно вертикальный и горизонтальный шаги или интервалы дискретизации. Рис.1.1 иллюстрирует расположение отсчетов на плоскости при прямоугольной дискретизации.

Основной вопрос, который возникает при замене непрерывного изображения дискретным, состоит в определении условий, при которых такая замена является полноценной, т.е. не сопровождается потерей информации, содержащейся в непрерывном сигнале. Потери отсутствуют, если, располагая дискретным сигналом, можно восстановить непрерывный. С математической точки зрения вопрос, таким образом, заключается в восстановлении непрерывного сигнала в двумерных промежутках между узлами, в которых его значения известны или, иными словами, в осуществлении двумерной интерполяции. Ответить на этот вопрос можно, анализируя спектральные свойства непрерывного и дискретного изображений.

Двумерный непрерывный частотный спектр непрерывного сигнала определяется двумерным прямым преобразованием Фурье:

которому отвечает двумерное обратное непрерывное преобразование Фурье:

Последнее соотношение верно при любых значениях , в том числе и в узлах прямоугольной решетки . Поэтому для значений сигнала в узлах, учитывая (1.1), соотношение (1.3) можно записать в виде:

Обозначим для краткости через прямоугольный участок в двумерной частотной области . Вычисление интеграла в (1.4) по всей частотной области можно заменить интегрированием по отдельным участкам и суммированием результатов:

Выполняя замену переменных по правилу , добиваемся независимости области интегрирования от номеров и :

Здесь учтено, что при любых целых значениях и . Данное выражение по своей форме очень близко к обратному преобразованию Фурье. Отличие состоит лишь в неправильном виде экспоненциального множителя. Для придания ему необходимого вида введем нормированные частоты и выполним в соответствии с этим замену переменных. В результате получим:

Теперь выражение (1.5) имеет форму обратного преобразования Фурье, следовательно, стоящая под знаком интеграла функция

(1.6)

является двумерным спектром дискретного изображения. В плоскости ненормированных частот выражение (1.6) имеет вид:

(1.7)

Из (1.7) следует, что двумерный спектр дискретного изображения является прямоугольно периодическим с периодами и по осям частот и соответственно. Спектр дискретного изображения образуется в результате суммирования бесконечного количества спектров непрерывного изображения, отличающихся друг от друга частотными сдвигами и . Рис.1.2 качественно показывает соотношение между двумерными спектрами непрерывного (рис.1.2.а) и дискретного (рис.1.2.б) изображений.

Рис. 1.2. Частотные спектры непрерывного и дискретного изображений

Сам результат суммирования существенно зависит от значений этих частотных сдвигов, или, иными словами, от выбора интервалов дискретизации . Допустим, что спектр непрерывного изображения отличен от нуля в некоторой двумерной области в окрестности нулевой частоты, т. е. описывается двумерной финитной функцией. Если при этом интервалы дискретизации выбраны так, что при , , то наложения отдельных ветвей при формировании суммы (1.7) происходить не будет. Следовательно, в пределах каждого прямоугольного участка от нуля будет отличаться лишь одно слагаемое. В частности, при имеем:

при , . (1.8)

Таким образом, в пределах частотной области спектры непрерывного и дискретного изображений с точностью до постоянного множителя совпадают. При этом спектр дискретного изображения в этой частотной области содержит полную информацию о спектре непрерывного изображения. Подчеркнем, что данное совпадение имеет место лишь при оговоренных условиях, определяемых удачным выбором интервалов дискретизации. Отметим, что выполнение этих условий, согласно (1.8), достигается при достаточно малых значениях интервалов дискретизации , которые должны удовлетворять требованиям:

в которых - граничные частоты двумерного спектра.

Соотношение (1.8) определяет способ получения непрерывного изображения из дискретного . Для этого достаточно выполнить двумерную фильтрацию дискретного изображения низкочастотным фильтром с частотной характеристикой

Спектр изображения на его выходе содержит ненулевые компоненты лишь в частотной области и равняется, согласно (1.8), спектру непрерывного изображения . Это означает, что изображение на выходе идеального фильтра низких частот совпадает с .

Таким образом, идеальное интерполяционное восстановление непрерывного изображения выполняется при помощи двумерного фильтра с прямоугольной частотной характеристикой (1.10). Нетрудно записать в явном виде алгоритм восстановления непрерывного изображения. Двумерная импульсная характеристика восстанавливающего фильтра, которую легко получить при помощи обратного преобразования Фурье от (1.10), имеет вид:

.

Продукт фильтрации может быть определен при помощи двумерной свертки входного изображения и данной импульсной характеристики. Представив входное изображение в виде двумерной последовательности -функций

после выполнения свертки находим:

Полученное соотношение указывает способ точного интерполяционного восстановления непрерывного изображения по известной последовательности его двумерных отсчетов. Согласно этому выражению для точного восстановления в роли интерполирующих функций должны использоваться двумерные функции вида . Соотношение (1.11) представляет собой двумерный вариант теоремы Котельникова-Найквиста.

Подчеркнем еще раз, что эти результаты справедливы, если двумерный спектр сигнала является финитным, а интервалы дискретизации достаточно малы. Справедливость сделанных выводов нарушается, если хотя бы одно из этих условий не выполняется. Реальные изображения редко имеют спектры с ярко выраженными граничными частотами. Одной из причин, приводящих к неограниченности спектра, является ограниченность размеров изображения. Из-за этого при суммировании в (1.7) в каждой из зон проявляется действие слагаемых из соседних спектральных зон. При этом точное восстановление непрерывного изображения становится вообще невозможным. В частности, не приводит к точному восстановлению и использование фильтра с прямоугольной частотной характеристикой.

Особенностью оптимального восстановления изображения в промежутках между отсчетами является использование всех отсчетов дискретного изображения, как это предписывается процедурой (1.11). Это не всегда удобно, часто требуется восстанавливать сигнал в локальной области, опираясь на некоторое небольшое количество имеющихся дискретных значений. В этих случаях целесообразно применять квазиоптимальное восстановление при помощи различных интерполирующих функций. Такого рода задача возникает, например, при решении проблемы привязки двух изображений, когда из-за геометрических расстроек этих изображений имеющиеся отсчеты одного из них могут соответствовать некоторым точкам, находящимся в промежутках между узлами другого. Решение этой задачи более подробно обсуждается в последующих разделах данного пособия.

Рис. 1.3. Влияние интервала дискретизации на восстановление изображения

«Отпечаток пальца»

Рис. 1.3 иллюстрирует влияние интервалов дискретизации на восстановление изображений. Исходное изображение, представляющее собой отпечаток пальца, приведено на рис. 1.3, а, а одно из сечений его нормированного спектра - на рис. 1.3, б. Данное изображение является дискретным, а в качестве граничной частоты использовано значение . Как следует из рис. 1.3, б, значение спектра на этой частоте пренебрежимо мало, что гарантирует качественное восстановление. По сути дела, наблюдаемая на рис. 1.3.а картина и является результатом восстановления непрерывного изображения, а роль восстанавливающего фильтра выполняет устройство визуализации - монитор или принтер. В этом смысле изображение рис. 1.3.а может рассматриваться как непрерывное.

Рис. 1.3, в, г показывают последствия от неправильного выбора интервалов дискретизации. При их получении осуществлялась “дискретизация непрерывного” изображения рис. 1.3.а путем прореживания его отсчетов. Рис. 1.3, в соответствует увеличению шага дискретизации по каждой координате в три, а рис. 1.3, г - в четыре раза. Это было бы допустимо, если бы значения граничных частот были ниже в такое же число раз. В действительности, как видно из рис. 1.3, б, происходит нарушение требований (1.9), особенно грубое при четырехкратном прореживании отсчетов. Поэтому восстановленные при помощи алгоритма (1.11) изображения оказываются не только расфокусированными, но и сильно искажают текстуру отпечатка.

Рис. 1.4. Влияние интервала дискретизации на восстановление изображения «Портрет»

На рис. 1.4 приведена аналогичная серия результатов, полученных для изображения типа “портрет”. Последствия более сильного прореживания (в четыре раза на рис. 1.4.в и в шесть раз на рис. 1.4.г) проявляются в основном в потере четкости. Субъективно потери качества представляются менее значительными, чем на рис. 1.3. Это находит свое объяснение в значительно меньшей ширине спектра, чем у изображения отпечатка пальца. Дискретизация исходного изображения соответствует граничной частоте . Как видно из рис. 1.4.б, это значение намного превышает истинное значение . Поэтому увеличение интервала дискретизации, иллюстрируемое рис. 1.3, в, г, хотя и ухудшает картину, все же не приводит к таким разрушительным последствиям, как в предыдущем примере.

Рассказать и показать на примере Паскаль: 1) Что такое absolute и для чего нужна? 2) Что такое asm и для чего нужна? 3) Что такое

constructor и destructor и для чего нужна?

4) Что такое implementation и для чего нужна?

5) Назовите модули Паскаль (в строке Uses, например crt) и какие возможности этот модуль дает?

6) Что за тип переменной: указательный (Pointer)

7) И на последок: что означает символ @ , #, $ , ^

1. Что такое объект?2. Что такое система?3. Что такое общее имя объекта? Приведите пример.4. Что такое единичное имя объекта? Приведите пример.5.

Приведите пример природной системы.6. Приведите пример технической системы.7. Приведите пример смешанной системы.8. Приведите пример нематериальной системы.9. Что такое классификация?10. Что такое класс объектов?

1. 23 вопрос - перечислите режимы работы субд access:

Создание таблицы в режиме конструктора;
-создание таблицы с помощью мастера;
-создание таблицы путем ввода данных.

2. что такое векторный формат?

3. можно ли отнести к сервисным программам следующее:
а) программы обслуживания дисков (копирование, лечение, форматирование и прочее)
б) сжатие файлов на дисках (архиваторы)
в) борьбы с комп-ми вирусами и многое другое.
сам думаю что тут ответ Б - прав или нет?

4. что относится к свойства алгоритма (а. дискретность, б. результативность в. массовость, г. определенность, г. выполнимость и понятность) - тут думаю, что все варианты правильные. Прав или нет?

тест 7 леких вопросов с выбором ответа

13. Тактовая частота процессора – это:

A. число двоичных операций, совершаемых процессором в единицу времени

B. число вырабатываемых за одну секунду импульсов, синхронизирующих работу узлов компьютера

C. число возможных обращений процессора к оперативной памяти в единицу времени

D. скорость обмена информацией между процессором и устройствами ввода/вывода

14.Укажите минимально необходимый набор устройств, предназначенных для работы компьютера:

A. принтер, системный блок, клавиатура

B. процессор, ОЗУ, монитор, клавиатура

C. процессор, стриммер, винчестер

D. монитор, системный блок, клавиатура

15. Что такое микропроцессор?

A. интегральная микросхема, которая выполняет поступающие на ее вход команды и управляет

Работой компьютера

B. устройство для хранения тех данных, которые часто используются в работе

C. устройство для вывода текстовой или графической информации

D. устройство для вывода алфавитно-цифровых данных

16.Взаимодействие пользователя с программной средой осуществляется с помощью:

A. операционной системы

B. файловой системы

C. приложения

D. файлового менеджера

17.Непосредственное управление программными средствами пользователь может осуществлять с

Помощью:

A. операционной системы

B. графического интерфейса

C. пользовательского интерфейса

D. файлового менеджера

18. Способы хранения данных на физическом носителе определяет:

A. операционная система

B. прикладное программное обеспечение

C. файловая система

D. файловый менеджер

19. Графическая среда, на которой отображаются объекты и элементы управления системы Windows,

Созданная для удобства пользователя:

A. аппаратный интерфейс

B. пользовательский интерфейс

C. рабочий стол

D. программный интерфейс

20. Скорость работы компьютера зависит от:

A. тактовой частоты процессора

B. наличия или отсутствия подключенного принтера

C. организации интерфейса операционной системы

D. объема внешнего запоминающего устройства

Цифровая фотография или иное растровое изображение представляет собой массив чисел, зафиксированных сенсорами уровней яркости, в двумерной плоскости. Зная что с математической точки зрения тонкая линза выполняет преобразование Фурье изображений, размещённых в фокальных плоскостях, можно создать алгоритмы обработки изображений, являющихся аналогами обработки изображений классической оптической системой.

Формула таких алгоритмов будет выглядеть следующим образом:

  1. Z=FFT(X) – прямое двухмерное преобразование Фурье
  2. Z′=T(Z) – применение функции или транспаранта к Фурье-образу изображения
  3. Y=BFT(Z′) – обратное двухмерное преобразование Фурье
Для вычисления преобразований Фурье используются алгоритмы быстрого дискретного преобразования Фурье. Хотя оптическая система линз осуществляет преобразование Фурье на непрерывном диапазоне аргумента и для непрерывного спектра, но при переходе к цифровой обработке данных формулы преобразования Фурье могут быть заменены на формулы дискретного преобразования Фурье.

Примеры реализации

  • Алгоритм размытия изображения
Реализованные алгоритмы являются частью библиотеки с открытым исходным кодом FFTTools. Интернет-адрес: github.com/dprotopopov/FFTTools

Алгоритм размытия изображения

В оптических системах диафрагма, размещённая в фокальной плоскости, представляет собой простое отверстие в экране. В результате прохождения светового потока через диафрагму, волны высоких частот (с более короткими длинами волн) проходят через препятствие, а волны низких частот (с более длинными длинами волн) отсекаются экраном. Таким образом повышается резкость получаемого изображения. Если заменить отверстие в экране на препятствие в экране, то в результате будет получено размытое изображение, поскольку оно будет сформировано из частот волн больших длин.

Алгоритм:

  1. Вычислить массив Z′=T(Z), где T – обнуление строк и столбцов, находящихся в заданных внутренних областях матрицы-аргумента соответствующих высоким 5. частотам (то есть обнуление коэффициентов Фурье-разложения, соответствующих высоким частотам)

Алгоритм повышения резкости изображения

В оптических системах диафрагма, размещённая в фокальной плоскости, представляет собой простое отверстие в экране. В результате прохождения светового потока через диафрагму, волны высоких частот (с более короткими длинами волн) проходят через препятствие, а волны низких частот (с более длинными длинами волн) отсекаются экраном. Таким образом повышается резкость получаемого изображения.

Алгоритм:

  1. Пусть X(N1,N2) – массив яркостей пикселей изображения.
  2. Вычислить Px = средняя (среднеквадратичная) яркость пикселей в массиве X
  3. Вычислить массив Z=FT(X) – прямое двухмерное дискретное преобразование Фурье
  4. Сохранить значение L=Z(0,0) – соответствующее средней яркости пикселей исходного изображения
  5. Вычислить массив Z′=T(Z), где T – обнуление строк и столбцов, находящихся в заданных внешних областях матрицы-аргумента, соответствующих низким 6. частотам (то есть обнуление коэффициентов Фурье-разложения, соответствующих низким частотам)
  6. Восстановить значение Z’(0,0)=L – соответствующее средней яркости пикселей исходного изображения
  7. Вычислить массив Y=RFT(Z′) – обратное двухмерное дискретное преобразование Фурье
  8. Вычислить Py = средняя (среднеквадратичная) яркость пикселей в массиве Y
  9. Нормировать массив Y(N1,N2) по среднему уровню яркости Px/Py

Алгоритм масштабирования изображения

В оптических системах световой поток в фокальной плоскости системы представляет собой Фурье-преобразование исходного изображения. Размер получаемого на выходе оптической системы изображения определяется соотношением фокальных расстояний объектива и окуляра.

Алгоритм:

  1. Пусть X(N1,N2) – массив яркостей пикселей изображения.
  2. Вычислить Px = средняя (среднеквадратичная) яркость пикселей в массиве X
  3. Вычислить массив Z=FT(X) – прямое двухмерное дискретное преобразование Фурье
  4. Вычислить массив Z′=T(Z), где T – либо добавление нулевых строк и столбцов матрицы соответствующих высоким частотам, либо удаление строк и столбцов матрицы соответствующих высоким частотам для получения требуемого размера итогового изображения
  5. Вычислить массив Y=RFT(Z′) – обратное двухмерное дискретное преобразование Фурье
  6. Вычислить Py = средняя (среднеквадратичная) яркость пикселей в массиве Y
  7. Нормировать массив Y(M1,M2) по среднему уровню яркости Px/Py
Используемое программное обеспечение
  • Microsoft Visual Studio 2013 C# - среда и язык программирования
  • EmguCV/OpenCV – C++ библиотека структур и алгоритмов для обработки изображений
  • FFTWSharp/FFTW – C++ библиотека реализующая алгоритмы быстрого дискретного преобразования Фурье

Алгоритм размытия изображения

Код алгоритма

///

/// Clear internal region of array /// /// Array of values /// Internal blind region size private static void Blind(Complex[,] data, Size size) { int n0 = data.GetLength(0); int n1 = data.GetLength(1); int n2 = data.GetLength(2); int s0 = Math.Max(0, (n0 - size.Height)/2); int s1 = Math.Max(0, (n1 - size.Width)/2); int e0 = Math.Min((n0 + size.Height)/2, n0); int e1 = Math.Min((n1 + size.Width)/2, n1); for (int i = s0; i < e0; i++) { Array.Clear(data, i*n1*n2, n1*n2); } for (int i = 0; i < s0; i++) { Array.Clear(data, i*n1*n2 + s1*n2, (e1 - s1)*n2); } for (int i = e0; i < n0; i++) { Array.Clear(data, i*n1*n2 + s1*n2, (e1 - s1)*n2); } } /// /// Blur bitmap with the Fastest Fourier Transform /// /// Blured bitmap public Bitmap Blur(Bitmap bitmap) { using (var image = new Image(bitmap)) { int length = image.Data.Length; int n0 = image.Data.GetLength(0); int n1 = image.Data.GetLength(1); int n2 = image.Data.GetLength(2); var doubles = new double; Buffer.BlockCopy(image.Data, 0, doubles, 0, length*sizeof (double)); double power = Math.Sqrt(doubles.Average(x => x*x)); var input = new fftw_complexarray(doubles.Select(x => new Complex(x, 0)).ToArray()); var output = new fftw_complexarray(length); fftw_plan.dft_3d(n0, n1, n2, input, output, fftw_direction.Forward, fftw_flags.Estimate).Execute(); Complex complex = output.GetData_Complex(); var data = new Complex; var buffer = new double; GCHandle complexHandle = GCHandle.Alloc(complex, GCHandleType.Pinned); GCHandle dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr complexPtr = complexHandle.AddrOfPinnedObject(); IntPtr dataPtr = dataHandle.AddrOfPinnedObject(); Marshal.Copy(complexPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, dataPtr, buffer.Length); Blind(data, _blinderSize); Marshal.Copy(dataPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, complexPtr, buffer.Length); complexHandle.Free(); dataHandle.Free(); input.SetData(complex); fftw_plan.dft_3d(n0, n1, n2, input, output, fftw_direction.Backward, fftw_flags.Estimate).Execute(); double array2 = output.GetData_Complex().Select(x => x.Magnitude).ToArray(); double power2 = Math.Sqrt(array2.Average(x => x*x)); doubles = array2.Select(x =>

Алгоритм повышения резкости изображения

Код алгоритма

///

/// Clear external region of array /// /// Array of values /// External blind region size private static void Blind(Complex[,] data, Size size) { int n0 = data.GetLength(0); int n1 = data.GetLength(1); int n2 = data.GetLength(2); int s0 = Math.Max(0, (n0 - size.Height)/2); int s1 = Math.Max(0, (n1 - size.Width)/2); int e0 = Math.Min((n0 + size.Height)/2, n0); int e1 = Math.Min((n1 + size.Width)/2, n1); for (int i = 0; i < s0; i++) { Array.Clear(data, i*n1*n2, s1*n2); Array.Clear(data, i*n1*n2 + e1*n2, (n1 - e1)*n2); } for (int i = e0; i < n0; i++) { Array.Clear(data, i*n1*n2, s1*n2); Array.Clear(data, i*n1*n2 + e1*n2, (n1 - e1)*n2); } } /// /// Sharp bitmap with the Fastest Fourier Transform /// /// Sharped bitmap public Bitmap Sharp(Bitmap bitmap) { using (var image = new Image(bitmap)) { int length = image.Data.Length; int n0 = image.Data.GetLength(0); int n1 = image.Data.GetLength(1); int n2 = image.Data.GetLength(2); var doubles = new double; Buffer.BlockCopy(image.Data, 0, doubles, 0, length*sizeof (double)); double power = Math.Sqrt(doubles.Average(x => x*x)); var input = new fftw_complexarray(doubles.Select(x => new Complex(x, 0)).ToArray()); var output = new fftw_complexarray(length); fftw_plan.dft_3d(n0, n1, n2, input, output, fftw_direction.Forward, fftw_flags.Estimate).Execute(); Complex complex = output.GetData_Complex(); Complex level = complex; var data = new Complex; var buffer = new double; GCHandle complexHandle = GCHandle.Alloc(complex, GCHandleType.Pinned); GCHandle dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr complexPtr = complexHandle.AddrOfPinnedObject(); IntPtr dataPtr = dataHandle.AddrOfPinnedObject(); Marshal.Copy(complexPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, dataPtr, buffer.Length); Blind(data, _blinderSize); Marshal.Copy(dataPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, complexPtr, buffer.Length); complexHandle.Free(); dataHandle.Free(); complex = level; input.SetData(complex); fftw_plan.dft_3d(n0, n1, n2, input, output, fftw_direction.Backward, fftw_flags.Estimate).Execute(); double array2 = output.GetData_Complex().Select(x => x.Magnitude).ToArray(); double power2 = Math.Sqrt(array2.Average(x => x*x)); doubles = array2.Select(x => x*power/power2).ToArray(); Buffer.BlockCopy(doubles, 0, image.Data, 0, length*sizeof (double)); return image.Bitmap; } }

Алгоритм масштабирования изображения

Код алгоритма

///

/// Copy arrays /// /// Input array /// Output array private static void Copy(Complex[,] input, Complex[,] output) { int n0 = input.GetLength(0); int n1 = input.GetLength(1); int n2 = input.GetLength(2); int m0 = output.GetLength(0); int m1 = output.GetLength(1); int m2 = output.GetLength(2); int ex0 = Math.Min(n0, m0)/2; int ex1 = Math.Min(n1, m1)/2; int ex2 = Math.Min(n2, m2); Debug.Assert(n2 == m2); for (int k = 0; k < ex2; k++) { for (int i = 0; i <= ex0; i++) { for (int j = 0; j <= ex1; j++) { int ni = n0 - i - 1; int nj = n1 - j - 1; int mi = m0 - i - 1; int mj = m1 - j - 1; output = input; output = input; output = input; output = input; } } } } /// /// Resize bitmap with the Fastest Fourier Transform /// /// Resized bitmap public Bitmap Stretch(Bitmap bitmap) { using (var image = new Image(bitmap)) { int length = image.Data.Length; int n0 = image.Data.GetLength(0); int n1 = image.Data.GetLength(1); int n2 = image.Data.GetLength(2); var doubles = new double; Buffer.BlockCopy(image.Data, 0, doubles, 0, length*sizeof (double)); double power = Math.Sqrt(doubles.Average(x => x*x)); var input = new fftw_complexarray(doubles.Select(x => new Complex(x, 0)).ToArray()); var output = new fftw_complexarray(length); fftw_plan.dft_3d(n0, n1, n2, input, output, fftw_direction.Forward, fftw_flags.Estimate).Execute(); Complex complex = output.GetData_Complex(); using (var image2 = new Image(_newSize)) { int length2 = image2.Data.Length; int m0 = image2.Data.GetLength(0); int m1 = image2.Data.GetLength(1); int m2 = image2.Data.GetLength(2); var complex2 = new Complex; var data = new Complex; var data2 = new Complex; var buffer = new double; GCHandle complexHandle = GCHandle.Alloc(complex, GCHandleType.Pinned); GCHandle dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr complexPtr = complexHandle.AddrOfPinnedObject(); IntPtr dataPtr = dataHandle.AddrOfPinnedObject(); Marshal.Copy(complexPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, dataPtr, buffer.Length); complexHandle.Free(); dataHandle.Free(); Copy(data, data2); buffer = new double; complexHandle = GCHandle.Alloc(complex2, GCHandleType.Pinned); dataHandle = GCHandle.Alloc(data2, GCHandleType.Pinned); complexPtr = complexHandle.AddrOfPinnedObject(); dataPtr = dataHandle.AddrOfPinnedObject(); Marshal.Copy(dataPtr, buffer, 0, buffer.Length); Marshal.Copy(buffer, 0, complexPtr, buffer.Length); complexHandle.Free(); dataHandle.Free(); var input2 = new fftw_complexarray(complex2); var output2 = new fftw_complexarray(length2); fftw_plan.dft_3d(m0, m1, m2, input2, output2, fftw_direction.Backward, fftw_flags.Estimate).Execute(); double array2 = output2.GetData_Complex().Select(x => x.Magnitude).ToArray(); double power2 = Math.Sqrt(array2.Average(x => x*x)); double doubles2 = array2.Select(x => x*power/power2).ToArray(); Buffer.BlockCopy(doubles2, 0, image2.Data, 0, length2*sizeof (double)); return image2.Bitmap; } } }

В предыдущей главе мы изучали линейные пространственно-инвариантные системы в непрерывной двумерной области. На практике мы имеем дело с изображениями, которые имеют ограниченные размеры и в то же время отсчитываются в дискретном наборе точек. Поэтому методы, разработанные до сих пор, необходимо приспособить, расширить и модифицировать так, чтобы их можно было применить и в такой области. Возникает также и несколько новых моментов, требующих аккуратного рассмотрения.

Теорема отсчетов говорит о том, при каких условиях по дискретному набору значений можно точно восстановить непрерывное изображение. Мы также узнаем, что происходит, когда условия ее применимости не выполняются. Все это имеет прямое отношение к разработке зрительных систем.

Методы, требующие перехода к частотной области, стали популярными частично благодаря алгоритмам быстрого вычисления дискретного преобразования Фурье. Однако нужно соблюдать осторожность, поскольку эти методы предполагают наличие периодического сигнала. Мы обсудим, как можно удовлетворить этому требованию и к чему приводит его нарушение.

7.1. Ограничение размеров изображения

На практике изображения всегда имеют конечные размеры. Рассмотрим прямоугольное изображение шириной и высотой Я. Теперь нет необходимости брать интегралы в преобразовании Фурье в бесконечных пределах:

Любопытно, что для восстановления функции нам необязательно знать на всех частотах. Знание того, что при представляет собой жесткое ограничение. Иными словами, функция, отличная от нуля только в ограниченной области плоскости изображения, содержит гораздо меньше информации, чем функция, не обладающая этим свойством.

Чтобы в этом убедиться, представим, что плоскость экрана покрыта копиями заданного изображения. Иными словами, мы расширяем наше изображение до периодической в обоих направлениях функции

Здесь - наибольшее целое число, не превосходящее х. Преобразование Фурье такого размноженного изображения имеет вид

С помощью подходящим образом подобранных множителей сходимости в упр. 7.1 доказывается, что

Следовательно,

откуда мы видим, что равна нулю всюду, кроме дискретного набора частот Таким образом, чтобы найти нам достаточно знать в этих точках. Однако функция получается из простым отсечением участка, для которого . Поэтому, чтобы восстановить нам достаточно знать лишь для всех Это - счетное множество чисел.

Обратите внимание на то, что преобразование периодической функции оказывается дискретным. Обратное преобразование можно представить в виде ряда, поскольку

Дискретизация изображения.

Рассмотрим непрерывное изображение – функцию двух пространственных переменных x 1 и x 2 f (x 1 , x 2) на ограниченной прямоугольной области (рисунок 3.1).

Рисунок 3.1 – Переход от непрерывного изображения к дискретному

Введем понятие шага дискретизации Δ 1 по пространственной переменной x 1 и Δ 2 по переменной x 2 . Например, можно представить, что в точках, удаленных друг от друга на расстояние Δ 1 по оси x 1 расположены точечные видеодатчики. Если такие видеодатчики установить по всей прямоугольной области, то изображение окажется заданным на двумерной решетке

Для сокращения записи обозначим

Функция f (n 1 , n 2) является функцией двух дискретных переменных и называется двумерной последовательностью. То есть дискретизация изображения по пространственным переменным переводит его в таблицу выборочных значений. Размерность таблицы (число строк и столбцов) определяется геометрическими размерами исходной прямоугольной области и выбором шага дискретизации по формуле

Где квадратные скобки […] обозначают целую часть числа.

Если область определения непрерывного изображения - квадрат L 1 = L 2 = L, и шаг дискретизации выбран одинаковым по осям x 1 и x 2 (Δ 1 = Δ 2 = Δ), то

и размерность таблицы составляет N 2 .

Элемент таблицы, полученной путем дискретизации изображения, называют «пиксель» или «отсчет» . Рассмотрим пиксель f (n 1 , n 2). Это число принимает непрерывные значения. Память компьютера способна хранить только дискретные числа. Поэтому для записи в памяти непрерывная величина f должна быть подвергнута аналогово-цифровому преобразованию с шагом Df (см. рисунок 3.2).

Рисунок 3.2 – Квантование непрерывной величины

Операцию аналого-цифрового преобразования (дискретизации непрерывной величины по уровню) часто называют квантованием . Число уровней квантования, при условии, что значения функции яркости лежат в интервале _____ _ ____ ___, равно

В практических задачах обработки изображений величина Q варьируется в широких пределах от Q = 2 («бинарные» или «черно-белые» изображения) до Q = 210 и более (практически непрерывные значения яркости). Наиболее часто выбираются Q = 28, при этом пиксель изображения кодируется одним байтом цифровых данных. Из всего вышеуказанного делаем вывод, что пиксели, хранящиеся в памяти компьютера, представляют собой результат дискретизации исходного непрерывного изображения по аргументам (координатам?) и по уровням. (Где и сколько, и всё дискретно) Ясно, что шаги дискретизации Δ 1 , Δ 2 должны выбираться достаточно малыми, для того, чтобы погрешность дискретизации была незначительна, и цифровое представление сохраняло основную информацию об изображении.

При этом следует помнить, что чем меньше шаг дискретизации и квантования, тем больший объем данных об изображении должен быть записан в память компьютера. Рассмотрим в качестве иллюстрации этого утверждения изображение на слайде размером 50×50 мм, которое вводится в память с помощью цифрового измерителя оптической плотности (микроденситометра). Если при вводе линейное разрешение микроденситометра (шаг дискретизации по пространственным переменным) составляет 100 микрон, то в память записывается двумерный массив пикселей размерности N 2 = 500×500 = 25∙10 4 . Если же шаг уменьшить до 25 микрон, то размеры массива возрастут в 16 раз и составят N 2 = 2000×2000 = 4∙10 6 . Используя квантование по 256 уровням, то есть кодируя найденный пиксель байтом, получаем, что в первом случае для записи необходим объем 0,25 мегабайт памяти, а во втором случае 4 мегабайта.