Дискретизация изображения. Лекция "аналоговый и дискретный способы представления изображений и звука". Кодирование растровых изображений

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

Рассмотрим непрерывное изображение – функцию двух пространственных переменных 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 мегабайта.

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

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

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


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

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

Дискретизация - это преобразование непрерывных изображений и звука в набор дискретных значений в форме кодов.

Звук в памяти компьютера

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

Физическая природа звука – колебания в определенном диапазоне частот, передаваемые звуковой волной через воздух (или другую упругую среду). Процесс преобразования звуковых волн в двоичный код в памяти компьютера: звуковая волна -> микрофон -> переменный электрический ток -> аудиоадаптер -> двоичный код-> память ЭВМ .

Процесс воспроизведения звуковой информации, сохраненной в памяти ЭВМ:
память ЭВМ -> двоичный код -> аудиоадаптер -> переменный электрический ток -> динамик -> звуковая волна.

Аудиоадаптер (звуковая плата) – специальное устройство, подключаемое к компьютеру, предназначенное для преобразования электрических колебаний звуковой частоты в числовой двоичный код при вводе звука и для обратного преобразования (из числового кода в электрические колебания) при воспроизведении звука.

В процессе записи звука аудиоадаптер с определенным периодом измеряет амплитуду электрического тока и заносит в регистр двоичный код полученной величины. Затем полученный код из регистра переписывается в оперативную память компьютера. Качество компьютерного звука определяется характеристиками аудиоадаптера: частотой дискретизации и разрядностью.

Частота дискретизации – это количество измерений входного сигнала за 1 секунду. Частота измеряется в герцах (Гц). Одно измерение за одну секунду соответствует частоте 1 Гц. 1000 измерений за одну секунду -1 килогерц (кГц). Характерные частоты дискетизации аудиоадаптеров: 11 кГц, 22 кГц, 44,1 кГц и др.

Разрядность регистра – число бит в регистре аудиоадаптера. Разрядность определяет точность измерения входного сигнала. Чем больше разрядность, тем меньше погрешность каждого отдельного преобразования величины электрического сигнала в число и обратно. Если разрядность равна 8(16), то при измерении входного сигнала может быть получено 2 8 =256 (2 16 =65536) различных значений. Очевидно, 16-разрядный аудиоадаптер точнее кодирует и воспроизводит звук, чем 8-разрядный.

Звуковой файл – файл, хранящий звуковую информацию в числовой двоичной форме. Как правило, информация в звуковых файлах подвергается сжатию.

Примеры решенных задач.

Пример №1.
Определить размер (в байтах) цифрового аудиофайла, время звучания которого составляет 10 секунд при частоте дискретизации 22,05 кГц и разрешении 8 бит. Файл сжатию не подвержен.

Решение.
Формула для расчета размера (в байтах) цифрового аудиофайла (монофоническое звучание): (частота дискретизации в Гц)*(время записи в секундах)*(разрешение в битах)/8.

Таким образом файл вычисляется так: 22050*10*8/8 = 220500 байт.

Задания для самостоятельной работы

№1. Определить объем памяти для хранения цифрового аудиофайла, время звучания которого составляет две минуты при частоте дискретизации 44,1 кГц и разрешении 16 бит.

№2. В распоряжении пользователя имеется память объемом 2,6 Мб. Необходимо записать цифровой аудиофайл с длительностью звучания 1 минута. Какой должна быть частота дискретизации и разрядность?

№3. Объем свободной памяти на диске – 5,25 Мб, разрядность звучания платы – 16. Какова длительность звучания цифрового аудиофайла, записанного с частотой дискретизации 22,05 кГц?

№4. Одна минута цифрового аудиофайла занимает на диске 1,3 Мб, разрядность звуковой платы – 8. С какой частотой дискретизации записан звук?

№5. Две минуты записи цифрового аудиофайла занимает на диске 5,1 Мб. Частота дискретизации – 22050 Гц. Какова разрядность аудиоадаптера? №6. Объем свободой памяти на диске – 0,01 Гб, разрядность звуковой платы – 16. Какова длительность звучания цифрового аудиофайла, записанного с частотой дискретизации 44100 Гц?

Представление графической информации.

Растровое представление.

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

Компьютерная графика – раздел информатики, предметом которого является работа на компьютере с графическими изображениями (рисунками, чертежами, фотографиями, видеокадрами и пр.).

Пиксель – наименьший элемент изображения на экране (точка на экране).

Растр – прямоугольная сетка пикселей на экране.

Разрешающая способность экрана – размер сетки растра, задаваемого в виде произведения M*N, где M – число точек по горизонтали, N – число точек по вертикали (число строк).

Видеоинформация – информация об изображении, воспроизводимом на экране компьютера, хранящаяся в компьютерной памяти.

Видеопамять – оперативная память, хранящая видеоинформацию во время ее воспроизведения в изображение на экране.

Графический файл – файл, хранящий информацию о графическом изображении.

Число цветов, воспроизводимых на экране дисплея (K), и число бит, отводимых в видеопамяти под каждый пиксель (N), связаны формулой: K=2 N

Величину N называют битовой глубиной .

Страница – раздел видеопамяти, вмещающий информацию об одном образе экрана (одной «картинке» на экране). В видеопамяти могут размещаться одновременно несколько страниц.

Все многообразие красок на экране получается путем смешивания трех базовых цветов: красного, синего и зеленого. Каждый пиксель на экране состоит из трех близко расположенных элементов, светящихся этими цветами. Цветные дисплеи, использующие такой принцип, называются RGB (Red-Green-Blue)-мониторами.

Код цвета пикселя содержит информацию о доле каждого базового цвета.
Если все три составляющие имеют одинаковую интенсивность (яркость), то из их сочетаний можно получить 8 различных цветов (2 3). Следующая таблица показывает кодировку 8-цветной палитры с помощью трехразрядного двоичного кода. В ней наличие базового цвета обозначено единицей, а отсутствие нулем.

Двоичный код


К З С Цвет
0 0
0
Черный
0 0
1
Синий
0 1 0 Зеленый
0 1 1 Голубой
1 0
0
Красный
1 0
1
Розовый
1 1
0
Коричневый
1 1
1
Белый

Шестнадцатицветная палитра получается при использовании 4-разрядной кодировки пикселя: к трем битам базовых цветов добавляется один бит интенсивности. Этот бит управляет яркостью всех трех цветов одновременно. Например, если в 8-цветной палитре код 100 обозначает красный цвет, то в 16-цветной палитре: 0100 – красный, 1100 – ярко-красный цвет; 0110 – коричневый, 1110 – ярко-коричневый (желтый).

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

При использовании битовой глубины 8 бит/пиксель количество цветов: 2 8 =256. Биты такого кода распределены следующим образом: КККЗЗСС.

Это значит, что под красную и зеленую компоненты выделяется по 3 бита, под синюю – 2 бита. Следовательно, красная и зеленая компоненты имеют по 2 3 =8 уровней яркости, а синяя – 4 уровня.

Векторное представление.

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

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

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

Команда

Действие

Линия к X1,Y1

Нарисовать линию от текущей позиции в позицию (X1, Y1).

Линия X1, Y1, X2, Y2

Нарисовать линию с координатами начала X1, Y1 и координатами конца X2, Y2. Текущая позиция не устанавливается.

Окружность X, Y, R

Нарисовать окружность: X, Y – координаты центра, R – длина радиуса в шагах растровой сетки.

Эллипс X1, Y1, X2, Y2

Нарисовать эллипс, ограниченный прямоугольником; (X1, Y1) – координаты левого верхнего, а (X2, Y2) – правого нижнего угла этого прямоугольника.

Прямоугольник X1, Y1, X2, Y2

Нарисовать прямоугольник; (X1, Y1) – координаты левого верхнего угла, а (X2, Y2) – правого нижнего угла этого прямоугольника.

Цвет рисования ЦВЕТ

Установить текущий цвет рисования.

Цвет закраски ЦВЕТ

Установить текущий цвет закраски.

Закрасить X, Y, ЦВЕТ ГРАНИЦЫ

Закрасить произвольную замкнутую фигуру; X, Y – координаты любой точки внутри замкнутой фигуры, ЦВЕТ ГРАНИЦЫ – цвет граничной линии.

Примеры решенных задач.

Пример №1.
Для формирования цвета используются 256 оттенков красного, 256 оттенков зеленого и 256 оттенков синего. Какое количество цветов может быть отображено на экране в этом случае?

Решение:
256*256*256=16777216.

Пример №2.
На экране с разрешающей способностью 640*200 высвечиваются только двухцветные изображения. Какой минимальный объем видеопамяти необходим для хранения изображения?

Решение.
Так как битовая глубина двухцветного изображения равна 1, а видеопамять, как минимум, должна вмещать одну страницу изображения, то объем видеопамяти равен: 640*200*1=128000 бит =16000 байт.

Пример №3.
Какой объем видеопамяти необходимы для хранения четырех страниц изображения, если битовая глубина равна 24, а разрешающая способность дисплея – 800*600 пикселей?

Решение.
Для хранения одной страницы необходимо

800*600*24 = 11 520 000 бит = 1 440 000 байт. Для 4 соответственно 1 440 000 * 4 = 5 760 000 байт.

Пример №4.
Битовая глубин равна 24. Сколько различных оттенков серого цвета может быть отображено на экране?
Замечание: Оттенок серого цвета получается при равных значениях уровней яркости всех трех составляющих. Если все три составляющие имеют максимальный уровень яркости, то получается белый цвет; отсутствие всех трех составляющих представляет черный цвет.

Решение.
Так как для получения серых оттенков составляющие RGB одинаковы, то глубина равна 24/3=8. Получаем количество цветов 2 8 =256.

Пример №5.
Дана растровая сетка 10*10. Описать буку «К» последовательностью векторных команд.

Решение:
В векторном представлении буква «К» - это три линии. Всякая линия описывается указанием координат ее концов в виде: ЛИНИЯ (X1,Y1,X2,Y2). Изображение буквы «К» будет описываться следующим образом:

ЛИНИЯ (4,2,4,8)
ЛИНИЯ (5,5,8,2)
ЛИНИЯ (5,5,8,8)

Задачи для самостоятельной работы.

№1. Какой объем видеопамяти необходим для хранения двух страниц изображения при условии, что разрешающая способность дисплея равна 640*350 пикселей, а количество используемых цветов – 16?

№2. Объем видеопамяти равен 1 Мб. Разрешающая способность дисплея – 800*600. Какое максимальное количество цветов можно использовать при условии, что видеопамять делится на две страницы?

№3. Битовая глубина равна 24. Опишите несколько вариантов двоичного представления светло-серых и темно-серых оттенков.

№4. На экране компьютера необходимо получить 1024 оттенка серого цвета. Какой должна быть битовая глубина?

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

№6. Воспроизвести на бумаге рисунки, используя векторные команды. Разрешающая способность 64*48.

А)
Цвет рисования Красный
Цвет закраски Желтый
Окружность 16, 10, 2
Закрасить 16, 10, Красный
Установить 16, 12
Линия к 16, 23
Линия к 19, 29
Линия к 21, 29
Линия 16, 23, 13, 29
Линия 13, 29, 11, 29
Линия 16, 16, 11, 12
Линия 16, 16, 21, 12

Б)
Цвет рисования Красный
Цвет закраски Красный
Окружность 20, 10, 5
Окружность 20, 10, 10
Закрасить 25, 15, Красный
Окружность 20, 30, 5
Окружность 20, 30, 10
Закрасить 28, 32, Красный

Рассказать и показать на примере Паскаль: 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; } } }