Как настроить смартфоны и ПК. Информационный портал
  • Главная
  • Новости
  • Аналоговый и дискретный способ кодирования. Фурье-обработка цифровых изображений

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

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

Как было показано в первой главе, сетчатка передает в высшие отделы зрительного анализатора дискретные изображения.

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

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

Центральная часть сетчатки (фовеа) занята только колбочками, на периферии вне фовеа имеются как колбочки, так и палочки. В условиях ночного зрения колбочковые поля в центральной части сетчатки имеют приблизительно одинаковую величину (порядка 5" в угловой мере). Число таких полей в фовеа, угловые размеры которой порядка 90", около 200. Основную роль в условиях ночного зрения играют палочковые поля, занимающие всю остальную поверхность сетчатки. Они имеют угловой размер порядка 1° по всей поверхности сетчатки. Число таких полей в сетчатке около 3 тыс. Не только обнаружение, но и рассматривание слабо освещенных объектов в этих условиях производится периферийными участками сетчатки.

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

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

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

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

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

Если заменить изображения реальных непрерывных объектов внешнего мира такими дискретными изображениями, глаз не заметит подмены.* Следовательно, дискретные изображения такого рода содержат по крайней мере не меньше информации, чем воспринимает зрительная система. **

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

Рассказать и показать на примере Паскаль: 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. объема внешнего запоминающего устройства

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

Слайд 11 из презентации «Кодирование и обработка информации» . Размер архива с презентацией 445 КБ.

Информатика 9 класс

краткое содержание других презентаций

«Алгоритмы разветвляющейся структуры» - ЕСЛИ условие, ТО действие. Что мы знаем. Структура урока. Разветвляющийся алгоритм. Выполните алгоритм и заполните таблицу. Во второй тур конкурса проходит обучающийся, набравший от 85 до 100 баллов включительно. Ввести количество баллов и определить, прошел ли он во второй тур. Найти наибольшее число между а и b. Составить программу на языке программирования. Разветвляющийся алгоритм – это алгоритм, в котором в зависимости от условия выполняется либо одна, либо другая последовательность действий.

«Создание искусственного интеллекта» - Имитационный подход. Подходы к построению систем искусственного интеллекта. Эволюционный подход. Искусственный интеллект. Может сожительствовать со многими людьми, помогая справляться с личными проблемами. Структурный подход. Логический подход. Проблемы при разработке. Перспективы развития и области применения.

«Циклические программы» - Цифра. Цикл с предусловием. Найти сумму. Цикл с постусловием. Цикл с параметром. Алгоритм Евклида. Циклические программы. Найти сумму натуральных чисел. Понятие цикла. Первоначальный взнос. Табулирование функции. Вычислить. Пример. Делители. Информатика. Найти количество чисел. Найти. Найти количество трехзначных натуральных чисел. Трехзначные числа. Найти множество значений функции. Таблица перевода долларов.

«Что такое электронная почта» - Отправитель. Адрес электронной почты. История электронной почты. Вопрос появления электронной почты. Структура письма. Маршутизация почты. Письмо. Электронное письмо. Копия. Дата. X-mailer. Электронная почта. Как работает электронная почта.

«Работа с электронной почтой» - Адрес электронной почты. Почтовый ящик. Протокол электронной почты. Файлообменная сеть. Разделение адресов. Преимущества электронной почты. Почтовые клиенты. Изобретатель электронной почты. Адрес. Электронная почта. ПО для работы с электронной почтой. Как работает электронная почта. Телеконференция. Почтовый сервер. Обмен файлами.

«Обработка в Photoshop» - Крутые ребята. Как отличить подделку. Растровые и векторные изображения. Введение. Призовые места. Программа Adobe Photoshop. Ретуширование. Конкурсы по работе с «фотошопом». Корректирование яркости. Мои друзья. Практическая часть. Похожие программы. Основная часть. Дизайн. Необычные животные. Монтаж нескольких изображений.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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; } } }

Лучшие статьи по теме