Вы находитесь на странице: 1из 30

Министерство образования Республики Беларусь

Учреждение образования
«БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ»

Факультет компьютерного проектирования


Кафедра проектирования информационно-компьютерных систем
Дисциплина «Основы программирования информационных систем»

К защите допустить:
Руководитель курсовой работы
канд. техн. наук, доцент

__________________О. Ч. Ролич

___.___. 20___

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
на тему

ПРОГРАММА ВОССТАНОВЛЕНИЯ РАСФОКУСИРОВАННОГО


ИЗОБРАЖЕНИЯ

БГУИР КР 1-40 05 01-10 №_1

Студент И.А. Скурко


(подпись студента)
Курсовая работа
представлена на проверку
___.___. 20___

(подпись студента)

Минск 2019
СОДЕРЖАНИЕ

2
РЕФЕРАТ

БГУИР КР 1-38 02 03 03 042 ПЗ ???????


Скурко, И.А. Программа восстановления расфокусированного
изображения / И.А. Скурко. – Минск: БГУИР, 2019. – 58 с.
Пояснительная записка 58 с., 11 рис., 7 табл., 12 источников, 2
приложения
ФИЛЬТРАЦИЯ ИЗОБРАЖЕНИЙ, ДИСКРЕТНОЕ ФУРЬЕ-
ПРЕОБРАЗОВАНИЕ, ОБРАБОТКА СПЕКТРОВ ИЗОБРАЖЕНИЙ,
АМПЛИТУДНО-ЧАСТОТНАЯ И ФАЗО-ЧАСТОТНАЯ
ХАРАТКЕРИСТИКА ИЗОБРАЖЕНИЙ

Предмет: расфокусированное изображение.


Объект: методы фильтрации изображений.
Цель: разработка прикладного приложения для фильтрации и
восстановления расфокусированного изображения.
Методология проведения работы: в процессе решения поставленных
задач использованы алгоритмы спектрального анализа двумерных массивов,
алгоритм быстрого дискретного Фурье-преобразования двумерных массивов
и математические методы обработки спектров изображений как двумерных
массивов.
Результаты работы: выполнен анализ литературно-патентных
исследований; рассмотрены математические методы обработки изображений
как двумерных массивов; в обработке и фильтрации изображений
использован алгоритм быстрого преобразования Фурье; осуществлено
моделирование процессов искажения изображения; спроектирован
графический пользовательский интерфейс для настройки наилучшей
резкости изображения; разработана графическая часть проекта.

3
ВВЕДЕНИЕ

В прикладных областях, связанных с цифровой обработкой


изображений, востребована задача восстановления искаженных
изображений. Проблема смазывания актуальна, как и для обычных,
любительских фотосъемок, так и для таких приложений, как системы
видеонаблюдения, в которых используются камеры низкого качества для
съемки последовательностей фотографий движущихся объектов. Считается,
что размытие – необратимая операция, и информация безвозвратно теряется,
так как каждый пиксель превращается в пятно, а при большом радиусе
размытия так и вовсе получается однородный цвет по всему
изображению. Но с помощью современных математических и программных
инструментов проблема искаженных изображений решается путем
нахождения функции размытия и применения соответствующих фильтров.
В курсовой работе поставлена цель: проектирование
графического пользовательского интерфейса для вычисления наилучшей
резкости расфокусированного изображения, загружаемого пользователем,
построения и анализа амплитудно-частотной и фазо-частотной характеристик
исходного и результирующего изображения.
Для достижения поставленной цели необходимо решить
следующие задачи:
1 Построение математической модели изображений.
2 Построение математической модели процесса искажения.
3 Математическое обоснование метода восстановления искаженного
изображения.
4 Написание алгоритма функционирования программного
обеспечения.
5 Программная реализация.

4
1 МАТЕМАТИЧЕСКОЕ ОБОСНОВАНИЕ МЕТОДА
ВОССТАНОВЛЕНИЯ ИСКАЖЕННОГО
ИЗОБРАЖЕНИЯ

1.1 Математическая модель изображений


95% всех изображений, получаемых после оцифровки, являются
двоичными (они же растровые, пиксельные, а также битовые карты). Битовая
карта представляет собой набор пикселей, расположенных в виде
прямоугольной матрицы. Минимальный неделимый элемент битовой
матрицы – пиксель. Совокупность пикселей образует изображение. Каждый
пиксель можно описать цветом и яркостью, и воздействуя на характеристики
каждого пикселя – элемента изображения, можно изменять качественные
характеристики изображения в зависимости от поставленной задачи.
С математической точки зрения, изображение можно представить как
вещественную функцию двух переменных Ϝ ( x , y ) .Для удобства исследований
в работе все изображения определяются прямоугольными областями, т.е. 𝑥 ∈
[0; 𝑊], а 𝑦 ∈ [0; 𝐻], где W – ширина изображения, H – высота изображения в
количестве пикселей.
Человеческий глаз воспринимает каждый из многочисленных цветов и
оттенков окружающего мира как сумму взятых в различных пропорциях трёх
базовых цветов - красного, зелёного и синего. В цифровых дисплеях цвет
формируется таким же образом, как и в глазах человека. Такая модель
цветопередачи называется RGB (red – красный, green – зеленый, blue –
синий). Современные цветные дисплеи используют RGB-схему, в которой
каждый пиксель состоит из трех субпикселей красного, зеленого и синего
цвета. За счет изменения интенсивности субпикселей можно смешивать три
основных цвета и получать миллионы различных оттенков. Каждый цвет в
цифровом виде определяется шестнадцатеричным кодом (hex-кодом). Числа,
образующие hex-код, могут принимать значения цифр от 0 до 9 и букв от A
до F. Каждая из трех пар цифр в hex-коде определяет цветовую комбинацию
красного, зеленого и синего цвета.
Так как в цветных изображениях присутствует три канала, то цветное
изображение состоит из трех матриц размером [ H ,W ] .
Полутоновое изображение – одномерная матрица, а множество
возможных полутонов называют уровнями серого. Уровни серого не
отличаются по спектральному составу (оттенку цвета), но отличаются
по яркости. Количество возможных полутонов есть глубина цвета, которую
часто передают не в количестве самих полутонов, а в количестве бит на
пиксель. Для полутоновых изображений значения элементов матрицы
находятся в промежутке [ 0 ; 255 ] .
1.2 Математическая модель процесса искажения
В данной работе мы будем рассматривать искажение изображения в
результате движения камеры или объекта в момент фотографирования или
вследствие неправильной настройки фокуса.
5
Процесс искажения изображения в общем виде можно описать
выражением (1.1), где g ( x , y )— искаженное изображение, f ( x , y ) – идеальное
(неискаженное) изображение, h ( x , y ) – искажающая функция, η(x , y) –
аддитивный шум.
g ( x , y )=h ( x , y )∗f (x , y )+ η( x , y ), (1.1)

Отметим, что все рассматриваемые функции являются непрерывными


функциями от непрерывных пространственных координат. Задача
восстановления искаженного изображения заключается в нахождении
наилучшего приближения  f ' (x , y) исходного изображения к f (x , y ).
В случае расфокусированного изображения каждый пиксель
«собирается» из пикселей некоторой его окрестности, превращаясь в пятно, в
случае смазанного – в отрезок. Закон, по которому смазывается пиксель, в
теории обработки цифровых изображений называется функцией
распределения точки или PSF (Point Spread Function).
Проанализируем оба вида искажающей PSF с помощью
математической программы MatLab. На рисунке 1 слева представлено
наглядное изображение того, как распределяется точка (пиксель) в случае
расфокусированного изображения, справа – гистограмма, визуализирующая
распределение яркости по пикселям. В случае расфокусированного
изображения аппроксимация происходит по окружности, так как PSF
представляет собой круг с нечеткими границами.

Рисунок 1 – PSF в случае расфокусированного изображения

На рисунке 2 представлено распределение точки (пикселя) в случае


смазанного изображения. Анализируя гистограмму распределения, можно
сделать вывод, что в случае смазанного изображения искажающая система
6
аппроксимируется в виде отрезка, который направлен вдоль движения
объекта.

Рисунок 2 – PSF в случае смазанного изображения

Таким образом, чтобы получить PSF, для первого случая необходимо


знать только радиус размытия, которым задается распределение точки. Для
второго случая необходимо учитывать длину и угол размытия, так как
распределение точки происходит по отрезку.
Операция применения искажающей функции к другой функции, в
данном случае функции h(x , y) к функции f (x , y ), называется сверткой.
Математически операция свертки выполняется следующим образом:
a b
g ( x , y )=h ( x , y )∗f ( x , y )=∑ ∑ h ( i, j ) f ( x +i , y + j )( 1.2 )
¿−a j =−b

Смысл операции свертки состоит в том, что в формировании значения


некоторой точки A с координатами ( x 0 , y 0 ), принадлежащей искаженному
изображению, принимают участие точки из некоторой окрестности δ точки B
с координатами ( x 0 , y 0 ), принадлежащей исходному изображению. Размер
окрестности δ и вклад точек из этой окрестности в формирование значения
точки A целиком определяет вид функции распределения точки.

1.3 Математическое обоснование метода восстановления


искаженного изображения

7
Для восстановления функции f (x , y ) необходимо обратить свертку.
Операция обратной свертки называется деконволюцией. С помощью
теоремы о свертке, которая гласит, что операция свертки в
пространственной области эквивалентна поэлементному умножению в
частотной области, можно выполнить деконволюцию, не прибегая к
решению системы уравнений. Преобразование функции из пространственной
области в частотную область происходит с помощью преобразования Фурье.
Суть преобразования Фурье состоит в том, что любая функция может
быть аппроксимирована в точности суммой бесконечных функций синуса и
косинуса. Оно позволяет существенно сократить объём передаваемой
информации, достаточной для восстановления изображения в прежнем виде.
Также преобразование Фурье облегчает процесс фильтрации.
Преобразование Фурье хорошо тем, что оно обратимо.
В обработке цифровых изображений следует использовать дискретное
преобразование Фурье, так как значения функции изображения находятся в
определенном диапазоне. Для полутоновых изображений – это диапазон от 0
до 255. Дискретное преобразование Фурье является линейным
преобразованием, которое переводит вектор временных отсчётов в вектор
спектральных отсчётов той же длины.
Простейший способ вычисления дискретного преобразования Фурье –
прямое суммирование, представленное выражением (1.3). Оно приводит к  N  
операциям на каждый коэффициент.
N−1 N−1 −i2 π ( kiN + Nlj )(
F ( k , l )= ∑ ∑ f (i , j) e 1.3 )
i=0 j=0
Однако существуют и более эффективные способы вычисления,
называемые быстрым дискретным преобразованием Фурье. Количество
операций, затрачиваемых на вычисление суммы, можно значительно
сократить, если количество элементов выборки представить произведением
целых чисел. Быстрое преобразование Фурье применяется только к
последовательностям, имеющим длину, кратную степени 2. Одним из самых
известных алгоритмов одномерного БПФ является алгоритм Кули-Тьюки. При
использовании данного алгоритма количество отсчетов в выборке функции
должно быть кратно степени 2. Двумерное разбиение по основанию 2 делит
выборку элементов на четыре выборки и так далее до тех пор, пока не останется
два элемента, Фурье-преобразование которых и следует выполнить.
Существует алгоритм быстрого дискретного Фурье-преобразования,
который заключается в том, что выборка разбивается на две
последовательности половинной длины. Первая последовательность
заполняется данными с четными номерами, а вторая - с нечетными. В
обработке изображений как двумерных массивов использование данного
алгоритма приведет к наиболее эффективному результату.
Алгоритм быстрого преобразования Фурье основывается на таком
математическом преобразовании, как свёртка функций. Из теоремы свертке

8
(1.4), где H ( u , v ) и F (u , v ) – это Фурье-образы искажающей функции и функции
исходного изображения, видно, что операция, обратная свертке,
эквивалентна делению в частотной области рассматриваемых функций.

h ( x , y )∗f ( x , y ) ↔ H ( u , v ) F (u , v ) (1.4)

На качество и точность полученного результата влияет функция


аддитивного шума η ( x , y ) . Один из самых известных подходов фильтрации
изображения, который учитывает величину аддитивного шума, –
использование фильтра Винера. В этом подходе изображение и шум
рассматриваются как случайные процессы, и находится такая приближенная
функция неискаженного изображения, чтобы среднеквадратическое
отклонение этих функций было минимальным. Минимум этого отклонения
достигается на функции именно в частотной области.
Так как предстоит работа с Фурье-образами функций, необходимо
представить уравнение (1.1) эквивалентно в частотной области. Используя
теорему о свертке, получаем выражение (1.5), где G ( u , v )−¿Фурье-образ
функции искаженного изображения, H ( u , v )−¿Фурье-образ искажающей
функции, F ' ( u , v ) −¿Фурье-образ восстановленного изображения, N ( u , v )−¿
Фурье-образ функции аддитивного шума.

G ( u , v )=H ( u , v ) F ' (u , v )+ N ( u , v ) ( 1.5 )

Задача сводится к выражению функции F ' ( x , y ) . В фильтрации Винера,


как было отмечено ранее, аддитивный шум рассматривается как случайный
процесс, поэтому устранение шума происходит внутри функции, полученной
Винером (1.6).
2
1 |H ( u , v )|
'
F ( u , v )=
(
H (u , v ) 2 S
|H ( u , v )| + η (u ,v )
Sf (u , v ) ) G ( u , v ) (1.6)

Функцией S в формуле (1.6) обозначаются энергетические спектры


шума и исходного изображения соответственно. Поскольку эти величины
S η (u , v )
редко бывают известны, то дробь   S (u , v)  заменяют на некоторую константу
f
K , которую можно приблизительно охарактеризовать как соотношение
сигнал-шум.

1.4 Физический смысл амплитудно-частотной (АЧХ) и фазо-


частотной (ФЧХ) характеристик

Для более полного математического описания объектов используются


частотные методы, обладающие рядом преимуществ по сравнения с другими
методами. При частотном методе анализа на вход объекта подается
9
синусоидальное колебание неизменной амплитуды и различных частот.
Диапазон частот и амплитуда входных колебаний зависят от физической
природы объекта. На выходе объекта фиксируются два параметра –
амплитуда и фаза выходных колебаний.
Отношение амплитуды выходного колебания к амплитуде входного
колебания в функции частоты представляет собой амплитудно-частотную
характеристику (АЧХ) объекта, которая позволяет определить изменение
объектом уровня входного воздействия на различных частотах. Фазо-
частотная характеристика (ФЧХ) объекта определяет фазовый сдвиг
выходных колебаний относительно входных в функции частоты, то есть
опережение или отставание во времени.
АЧХ является четной функцией, а ФЧХ – нечетной. Двумя названными
частотными характеристиками описываются установившиеся вынужденные
колебания на выходе системы, вызванные гармоническим воздействием на
входе.
Преимуществом прямых экспериментальных методов определения
частотных характеристик является то, что если известны АЧХ и ФЧХ
объекта, то можно найти реакцию объекта на воздействие любой формы.
Реакция объекта может быть представлена в виде различных гармоник на
основании разложения в гармонический ряд Фурье.

1.4 Математические методы обработки спектров изображений как


двумерных массивов

Для решения конкретных задач обработки изображений необходимо


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

10
Поскольку локальные гистограммы можно вычислять рекурсивно,
вычислительная сложность алгоритмов ранговой фильтрации также мало
зависит от размеров окрестности. При вычислении конкретных ранговых
статистик и производных от них возможны упрощения, связанные с
информационной избыточностью изображений. Наиболее известный
алгоритм этого класса — алгоритм медианной фильтрации. Другими
примерами ранговых алгоритмов могут служить алгоритмы экстремальной
фильтрации, которые заменяют анализируемый элемент изображения
максимумом или минимумом по окрестности. Еще одно свойство ранговых
алгоритмов - локальная адаптация к характеристикам обрабатываемого
изображения и потенциальные возможности их использования не только для
сглаживания и очистки от шумов, но и для выделения признаков при
препарировании и автоматическом распознавании изображений.
Под фильтрацией изображений понимают операцию, имеющую своим
результатом изображение того же размера, полученное из исходного по
некоторым правилам. Обычно интенсивность (цвет) каждого пикселя
результирующего изображения обусловлена интенсивностями (цветами)
пикселей, расположенных в некоторой его окрестности в исходном
изображении.
Правила фильтрации могут быть самыми разнообразными. Фильтрация
изображений является одной из самых фундаментальных операций
компьютерного зрения, распознавания образов и обработки изображений. С
той или иной фильтрации исходных изображений начинается работа
подавляющего большинства методов обработки изображений.
Естественно, что при обработке изображений широко используются
методы и способы обработки одномерных сигналов, если возможно их
обобщение на многомерные сигналы. При этом, однако, приходится
учитывать, что математические методы описания дискретных многомерных
систем не отличаются завершённостью. Многомерные дискретные системы
обладают большим числом степеней свободы, и их проектирование
приобретает гибкость, не свойственную одномерным системам.
Для представления графической информации на двумерной плоскости
(например, экране монитора) применяются два основных подхода: растровый
и векторный. При векторном подходе графическая информация описывается
как совокупность абстрактных геометрических объектов - прямые, отрезки,
кривые, прямоугольники и т.д. Векторное описание предполагает априорные
знания о структуре изображения.
Растровая графика оперирует с произвольными изображениями в виде
растров. Растр – это описание изображения на плоскости путем разбиения
(дискретизации) его на одинаковые элементы по регулярной сетке и
присвоение каждому элементу своего цветового и любых других атрибутов
(для многослойных изображений). Самый простой и распространенный растр
– прямоугольный, самый экономичный по количеству отсчетов для передачи
изображений – гексагональный. С математических позиций растр – это

11
кусочно-постоянная аппроксимация на плоскости непрерывной функции
изображения. Элемент растра называют пикселем.
Стандартная идентификация пикселей определяется выражением (1.7),
где A ( i, j ) – область пикселя, C ( i , j )−¿ атрибуты пикселя.

f ( i , j )=( A ( i , j ) C (i , j ) ) (1.7)

Существуют три основные группы алгоритмов обработки изображений


на компьютерах:
1. Первичная (предварительная) обработка изображений с целью
реставрации, очистки от случайных шумов, улучшения качества, коррекции
геометрических искажений оптических систем.
2. Описание изображений, распознавание образов. Выполняется для
определения параметров деталей изображения и включает: нахождение
однородных (по уровню освещённости, по цвету) областей изображения,
выделение признаков формы изображений, определение координат особых
точек объектов и их ориентации относительно остальных точек.
3. Кодирование изображения для уменьшения объема при передаче и
хранении.
Большинство методов первой группы (первичная обработка) основаны
на использовании линейных пространственно-инвариантных (ЛПИ)
фильтров. Линейные алгоритмы выполняются с помощью двумерных
аналогов одномерных фильтров с конечной импульсной характеристикой
(КИХ) и фильтров с бесконечной импульсной характеристикой (БИХ). Их
можно применять, например, при реализации фильтра Винера. Многие ЛПИ-
преобразования полезны также при эффективном кодировании и выделении
признаков в распознавании образов.
Вместе с тем, для реставрации изображений и улучшения их качества
могут потребоваться и нелинейные методы. Так, например, чтобы подавить
шум и при этом сохранить контурную часть изображений, приходится
применять нелинейные или линейные пространственно-неинвариантные
(ЛПНИ) фильтры, которые реализуются ранговыми алгоритмами. Все
ранговые нелинейные фильтры основаны на быстрых алгоритмах
вычисления локальных гистограмм. Локальной гистограммой называется
дискретное распределение числа уровней квантования по их номеру.
Одним из таких методов, популярных в обработке изображений,
является медианная фильтрация. Применение медианных фильтров
эффективно для подавления некоторых видов шума и периодических помех
без одновременного искажения сигнала, например, для подавления пачек
шумовых выбросов, включая выпадение строк. Этот метод может
применяться также при решении некоторых задач, связанных с
распознаванием, например, выделения тонких линий и небольших
изолированных объектов.

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

13
3 ОБЪЕКТНО-ОРИЕНТИРОВАННЫЕ ТЕХНОЛОГИИ
ПРОГРАММИРОВАНИЯ

3.1 Объектно-ориентированное программирование

Объектно-ориентированное программирование, ООП  – это парадигма


программирования, которая концентрирует основное внимание
программиста на связях между объектами, а не на деталях их реализации.
Объектно-ориентированная парадигма программирования разрабатывалась,
как попытка связать поведение сущности с её данными и спроецировать
объекты реального мира и бизнес-процессов в программный код. Язык
программирования Python является мультипарадигмальным. На практике в
Python наиболее часто используется именно объектно-ориентированное
программирование. Концепция ООП в языке Python направлена на создание
кода для многократного использования.
Основными принципами ООП являются следующие механизмы:
абстракция, инкапсуляция, наследование и полиморфизм. Для создания
программ, обрабатывающих информацию в виде объектов, необходимо
понимание, а также комплексное соблюдение всех четырех парадигм. 
По сравнению с другими языками в Python объектно-ориентированное
программирование обладает рядом особых черт. Python целиком состоит из
объектов: числа, строки, списки, функции, экземпляры класса, сами классы,
модули, – являются объектами. В Python отсутствуют типы данных, так как
все типы – это классы.

3.2 Классы, компоненты и объекты

Объект – это абстрактная сущность, наделенная характеристиками


объектов окружающего нас реального мира. Создание объектов и
манипулирование ими – результат методологии программирования,
воплощающей в кодовых конструкциях описания объектов и операции над
ними. Каждый объект программы, как и любой реальный объект, отличается
собственными атрибутами и характерным поведением.
Класс является шаблоном или формальным описанием объекта, объект
же является его реальным воплощением. Каждый класс занимает
определенное место в иерархии классов. Любой класс определяет некоторую
категорию объектов, а всякий объект есть экземпляр некоторого класса.
Обычно объект находится в некотором уникальном состоянии,
определяемом текущими значениями его атрибутов. Функциональность
объектного класса определяется возможными операциями над экземпляром
этого класса.
В объектно-ориентированном программировании придание объекту
характеристик, которые отличают его от всех других объектов, четко
14
определяя его концептуальные границы, называется абстракцией. Основная
идея абстракции состоит в том, чтобы работать с объектами, не вдаваясь в
особенности их реализации. Абстракция выполняет основную задачу ООП,
позволяя программисту формировать объекты определенного типа с
различными характеристиками и поведением, благодаря применению
классов.
То, как должен выглядеть класс, какие методы в себе содержать,
какими переменными и типами данных манипулировать, определяет
интерфейс.
Интерфейс описывает ссылочный тип, который не может иметь какой-
либо реализации. Это означает, что все его методы и свойства являются
абстрактными. Интерфейсы описывают формальный открытый контракт
между классами, которые реализуют интерфейс, и классами, которые
используют объекты класса, реализующего интерфейс.
Особенность интерфейса в том, что в описании интерфейса режим
доступа к методам не указывается – он всегда публичный. Интерфейсы не
могут иметь никакую реализацию методов, а абстрактные классы могут
включать реализованные методы. Также особенностью интерфейса является
то, что интерфейс не имеет конструктора и, соответственно, деструктора.
Реализация методов интерфейса выполняется в классах, которые их
наследуют, причем класс, наследующий интерфейс, должен описывать
реализацию всех методов интерфейса без исключения.

3.3 Инкапсуляция

Инкапсуляция - это механизм, который объединяет данные и код,


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

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

3.4 Наследование

Наследование позволяет, практически без ограничений,


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

3.5 Полиморфизм

Слово полиморфизм от греческих слов poly (много) и morphos (форма)


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

16
объект становится “самодостаточным”. Будучи доступным в некоторой точке
программы, даже при отсутствии полной информации о типе этого объекта,
он всегда может корректно вызвать свойственные ему методы. Таким
образом, полиморфная функция - это семейство функций с одним и тем же
именем, но выполняющих различные действия в зависимости от условий
вызова.
Для изменения метода необходимо перегрузить его в потомке, т.е.
объявить в потомке одноименный метод и реализовать в нем нужные
действия. В результате в объекте-родителе и объекте-потомке будут
действовать два одноименных метода, имеющие разную кодовую
реализацию и, следовательно, придающие объектам разное поведение.
Благодаря полиморфизму, потомки могут перегружать общие методы
родителя с тем, чтобы реагировать специфическим образом на одно и то же
событие.
Python – язык с динамической типизацией, полиморфизм в нем
проявляется повсюду. Фактически все операции в языке Python являются
полиморфическими: вывод, извлечение элемента и многие другие. В языке
Python именно объекты определяют синтаксический смысл операции.
Если функции будут переданы объекты, которые не поддерживают
ожидаемый интерфейс, интерпретатор Python обнаружит ошибку при
выполнении и автоматически вызовет исключение. Это важнейшее отличие
философии языка Python от языков программирования со статической
типизацией. Такая модель полиморфизма предполагает необходимость
тестирования программного кода на наличие ошибок, так как из-за
отсутствия объявлений типов нет возможности с помощью компилятора
выявить некоторые виды ошибок на ранней стадии. Однако в обмен на
незначительное увеличение объема отладки мы получаем существенное
уменьшение объема программного кода, который требуется написать, и
существенное увеличение его гибкости.

3.6 Разработка классов

Каждый класс должен создаваться для достижения определенных


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

3.7 Объявление базового класса

17
Объектно-ориентированные технологии программирования
предоставляют возможность объявить базовый класс, который
инкапсулирует имена своих свойств, данных, методов и событий. Помимо
способности выполнять свою непосредственную задачу объектные методы
получают определенные привилегии доступа к значениям свойств и данных
класса.
Все объекты в Python инкапсулируют внутри себя данные и методы
работы с ними, предоставляя публичные интерфейсы для взаимодействия.
Атрибут может быть объявлен приватным (внутренним) с помощью нижнего
подчеркивания перед именем, но настоящего скрытия на самом деле не
происходит – в языке Python все происходит на уровне соглашений.

3.8 Конструкторы и деструкторы

Среди компонент-функций класса важное место занимают


конструкторы и деструкторы. Конструкторы определяют то, как объект
создается и инициализируется, а деструктор - как объект разрушается. Если
конструкторы или деструктор класса не определены явно, Python генерирует
их самостоятельно. При определении и разрушении объектов интерпретатор
осуществляет вызов конструкторов и деструкторов автоматически.
Необходимость конструкторов связана с тем, что нередко объекты должны
приобретать некоторые свойства именно в момент создания. Явный вызов
деструкторов в Python используют редко, так как интерпретатор
автоматически избавляется от объектов. Деструктор может содержать некий
пользовательский код, сообщающий об успешном уничтожении объекта.
Конструкторы и деструкторы в языке Python отличаются от других
объектных методов следующими особенностями:
 конструктор и деструктор являются предопределенными методами;
 не имеют возвращаемого значения;
 не могут наследоваться, хотя производный класс может вызывать
конструкторы и деструкторы базового класса;
 автоматически вызываются компилятором, чтобы гарантировать
надлежащее создание и уничтожение объектов классов;
Конструкторы в языке Python не перегружаются. При попытке
перегрузки конструктора интерпретатор определит только последний
конструктор из описанных. Альтернатива перегрузке конструктора –
установление параметров по умолчанию. Если какой-то параметр в
конструктор не передается, то ставится параметр по умолчанию.

18
4 ПРОЕКТИРОВАНИЕ ГРАФИЧЕСКОГО
ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА
СРЕДСТВАМИ COM-ОБЪЕКТОВ

COM – это технологический стандарт от компании Microsoft,


предназначенный для создания программного обеспечения на основе
взаимодействующих компонентов объекта, каждый из которых может
использоваться во многих программах одновременно. Стандарт воплощает
в себе идеи полиморфизма и инкапсуляции объектно-ориентированного
программирования. Стандарт COM мог бы быть универсальным
и платформо-независимым, но закрепился в основном на операционных
системах семейства  Microsoft Windows. В современных версиях Windows
COM используется очень широко. На основе COM были реализованы
технологии:  Microsoft OLE Automation,  ActiveX, DCOM, COM+,  DirectX,
а также XPCOM.
Технология СОМ применяется при описании API и двоичного
стандарта для связи объектов различных языков и сред программирования.
СОМ предоставляет модель взаимодействия между компонентами
и приложениями.
Основным понятием, которым оперирует стандарт COM,
является COM-компонент. Программы, построенные на стандарте COM,
фактически не являются автономными программами, а представляют собой
набор взаимодействующих между собой COM-компонентов. Каждый
компонент имеет уникальный идентификатор (GUID) и может одновременно
использоваться многими программами. Компонент взаимодействует
с другими программами через COM-интерфейсы – наборы абстрактных
функций и свойств. Каждый COM-компонент должен, как минимум,
поддерживать стандартный интерфейс «IUnknown», который предоставляет
базовые средства для работы с компонентом. Интерфейс «IUnknown»
включает в себя три метода: QueryInterface, AddRef, Release. Windows
API предоставляет базовые функции, позволяющие использовать COM-
компоненты. Библиотеки MFC и, особенно, ATL/WTL предоставляют более
гибкие и удобные средства для работы с COM. Библиотека ATL от Microsoft
до сих пор остаётся самым популярным средством создания COM-
компонентов. Но зачастую COM-разработка остаётся ещё довольно сложным
делом, программистам приходится вручную выполнять многие рутинные
задачи, связанные с COM. Впоследствии (в технологиях COM+ и
особенно .NET) Microsoft попыталась упростить задачу разработки COM-
компонентов.
Пользовательский интерфейс программы разработан с помощью пакета
Tkinter – это стандартный интерфейс Python к набору инструментов Tk GUI.
Как Tk, так и tkinter доступны на большинстве Unix-платформ, так же как и в
системах Windows. Структура пользовательского графического интерфейса
представлена в приложении Б. или не Б 
19
Tk давно является неотъемлемой частью Python. Он предоставляет
надежный и независимый от платформы инструментарий управления
окнами, который доступен программистам Python, использующим данный
пакет. Пакет tkinter представляет собой высокоуровневый объектно-
ориентированный слой поверх Tk.
Tkinter – это набор оболочек, которые реализуют виджеты Tk как
классы Python. Кроме того, внутренний модуль _tkinter предоставляет
механизм безопасности потоков, который позволяет Python и Tk
взаимодействовать.
Главные достоинства tkinter в том, что он быстрый и обычно
поставляется в комплекте с Python. Интерфейс Tk находится в двоичном
модуле с именем _tkinter. Этот модуль содержит низкоуровневый интерфейс
Tk, он не используется непосредственно в ходе разработке приложений.
Обычно это общая, или DLL, библиотека, но в некоторых случаях она может
быть статически связана с интерпретатором Python.
Главное окно программы – экземпляр класса Tk, так же, как и любой
виджет. Каждый класс виджет имеет определенные свойства, значения
которых можно задавать при их создании, а также программировать их
изменение при действии пользователя и в результате выполнения
программы. Большинство виджетов имеют одинаковые свойства,
определяющие их размеры, цвет, конфигурацию, скрытость и т. д. Пример
окна Tk с виджетами представлен на рисунке 3.
Виджеты, примененные при проектировании пользовательского
графического интерфейса:
Button (кнопка) используется для создания в приложении различных
прямоугольных кнопок с текстовой надписью. Является интерактивным
виджетом, при нажатии на который программа реагирует на событие и
выполняет определенные команды и операции.
Frame (рамка) – это контейнерный виджет. Рамка имеет очерченную
границу и фон и используется для группировки других виджетов при
создании приложения или диалогового макета.
LabelFrame (рамка с подписью) – контейнерный виджет, который также
используется для группировки виджетов. Отличительная особенность
состоит в том, что рамка имеет подпись.
Label (метка) отображает текст или изображение. Не является
интерактивным элементом.
Radiobutton (переключатель) представляет одно из значений
переменной. Нажатие на переключатель устанавливает переменную в
определенное значение и очищает все другие радиокнопки, связанные с этой
же переменной.
Scale (шкала) – это виджет, который позволяет пользователю
графически выбирать значение переменной, перемещая определенный
ползунок по ограниченной линии. 
Взаимодействие GUI с пользователем происходит благодаря

20
Рисунок 3 – Пример главного окна с виджетами

привязанным к виджетам событиям. Событие – это один из объектов tkinter.


У событий есть атрибуты, как и у многих других объектов.  Привязка
событий к виджету в tkinter осуществляется с помощью специального
метода. Существует три типа событий: производимые мышью, нажатиями
клавиш на клавиатуре, а также события, возникающие в результате
изменения виджетов.
По умолчанию виджеты располагаются на главном окне с помощью
упаковщика – метода, размещающего виджеты блоками в порядке их
объявления. С помощью различных методов можно располагать виджеты
относительно друг друга либо относительно главного окна.
Согласно поставленной задаче и её математической модели, в
пользовательском интерфейсе программы восстановления
расфокусированного изображения выделяются виджеты, позволяющие
выбирать один из двух типов искажения, изменять радиус, угол смаза для
функции распределения точки, настраивать резкость изображения,
отображать графики и гистограммы, выбирать и сохранять изображения с
помощью диалоговых окон, отображать исходное и восстановленное
изображения для их сравнения.
Интерфейс программы восстановления расфокусированного
изображения содержит 7 кнопок, которые пользователем могут применяться.
Для каждой кнопки программа содержит обработчики событий. Также для
взаимодействия с пользователем предусмотрены такие виджеты, как

21
«RadioButton» для выбора типа искажения, «Scale» для настройки угла смаза,
радиуса PSF и резкости изображения. Все параметры изменяются с шагом 1.
Для отображения результатов настойки параметров предусмотрены
отдельные области пользовательского интерфейса, включающие, в том
числе, компоненты визуализации изображения, функции распределения
точки, просмотра информации о программе, построения графиков на основе
имеющихся данных.
Используется виджет «Canvas» для загрузки и отображения
изображения и PSF, «Label» для вывода на экран информации о программе.
Все виджеты группируются с помощью «LabelFrame».
Для отображения графиков и характеристик используется отдельный
модуль Python Matplotlib, созданный на основе Matlab. Модуль имеет
иерархическую структуру и разделяется на несколько уровней. Самый
верхний из них – подмодуль Matplotlib.pyplot, содержащий самые
высокоуровневые функции. Интерфейс pyplot позволяет сосредоточиться на
выборе готовых решений и настройке базовых параметров рисунка. 
Главной единицей (объектом самого высокого уровня) при работе с
Matplotlib является рисунок (Figure), на котором располагаются одна или
несколько областей рисования (Axes), элементы рисунка Artisits (заголовки,
легенда) и основа-холст (Canvas). Область рисования является объектом
среднего уровня, который является, наверное, главным объектом работы с
графикой Matplotlib в объектно-ориентированом стиле. Каждая область
рисования Axes содержит две (или три в случае трёхмерных данных)
координатных оси, которые упорядочивают отображение данных.
Координатная ось являются объектом среднего уровня, которые определяют
область изменения данных, на них наносятся деления и подписи к делениям.
Пример двумерного графика (гистограммы), построенного с помощью
Matplotlib.pyplot, приведен на рисунке (4).
Многообразие и удобство создания графики в Matplotlib
обеспечивается не только за счёт созданных графических команд, но и за
счёт богатого арсенала по конфигурации типовых форм. Эта настройка
включает в себя работу с цветом, формой, типом линии или маркера,
толщиной линий, степенью прозрачности элементов, размером и типом
шрифта и другими свойствами.
Параметры, которые определяют эти свойства в различных
графических командах, обычно имеют одинаковый синтаксис. При создании
функций или методов классов, особенно в случае наследования, параметры
часто передают в виде объединений последовательностей: кортежа или
словаря. 
Matprotlib.pyplot по умолчанию создает окно, на котором расположены
различные инструменты для удобства работы с графическим материалом.
Это кнопки для перемещения по двумерной области, масштабирования
графика, кнопки «назад» и «повторить действие», кнопка для сохранения
полученного графика.

22
Рисунок 4 – Пример двумерного графика, построенного с помощью
подмодуля Matplotlib.pyplot

Графический интерфейс программы восстановления


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

23
5 ПРОГРАММНАЯ РЕАЛИЗАЦИЯ АЛГОРИТМА
ВОССТАНОВЛЕНИЯ РАСФОКУСИРОВАННОГО
ИЗОБРАЖЕНИЯ
Программная реализация алгоритма восстановления
расфокусированного изображения выполнена с помощью таких
библиотечных модулей Python, как OpenCV и NumPy.
OpenCV (англ. Open Source Computer Vision Library, библиотека
компьютерного зрения с открытым исходным кодом) — библиотека
компьютерного зрения и машинного обучения с открытым исходным кодом.
В неё входят более 2500 алгоритмов, в которых есть как классические, так и
современные алгоритмы для компьютерного зрения и машинного обучения.
Эта библиотека имеет интерфейсы на различных языках, в том числе и на
Python.
NumPy – это модуль для python, который предоставляет общие
математические и числовые операции в виде пре-скомпилированных,
быстрых функций. Они объединяются в высокоуровневые пакеты. Они
обеспечивают функционал, который можно сравнить с функционалом
MatLab. NumPy (Numeric Python) предоставляет базовые методы для
манипуляции с большими массивами и матрицами. 
С помощью модулей OpenCV и NumPy программная реализация
алгоритма восстановления расфокусированного изображения выполнена
эффективно и качественно.
В программе реализуется восстановление полутонового
изображения, поэтому после загрузки с помощью диалогового окна
изображение необходимо из RGB конвертировать в соответствующий
формат. Для этого используется метод из модуля NumPy convert(‘L’),
возвращающий преобразованное полутоновое изображение.
Следующий шаг в обработке изображения – предусмотрение появления
«краевых эффектов». Причина их появления в том, что когда делается
деконволюция для тех точек, которые расположены на краях, то при сборке
изображения не хватает пикселей, которые находятся за краями, и они
принимаются либо равным нулю, либо берутся с противоположной стороны
(зависит от реализации фильтра Винера и преобразования Фурье). От этого
возникает искажение на краях изображения. Чем интенсивнее примененный
фильтр, тем ярче будут выражены «краевые эффекты».
Чтобы избежать этого, необходимо предобработать края изображения.
В начале края размываются с помощью PSF. На практике это реализуется
следующем образом: входное изображение F ( x , y ) размывается по краям с
помощью размытия по Гауссу, образуя рамку вокруг фотографии. Для этого
используется специальный метод из библиотеки OpenCV. В дальнейшем,
при деконволюции края подвергнутся восстановлению вместе со всем
изображением, и краевые эффекты не возникнут.

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

25
4. 6??? Алгоритм ПО

Программа восстановления расфокусированного изображения,


написанная с применением объектно-ориентированных технологий, состоит
из двух классов: одного родительского класса MainWindow и производного
от него класса Deconvolution. В классе MainWindow происходит
инициализация виджетов, объявление переменных и их изменение
посредством взаимодействия пользователя с виджетами. Дочерний класс
Deconvolution содержит методы для непосредственной работы с
изображением. При создании объекта класса MainWindow вызывается
конструктор, инициализирующий виджеты и атрибуты класса.
После загрузки изображения, которое требуется восстановить, первое,
что необходимо сделать пользователю программы – это выбрать тип
размытия. Выбор происходит посредством виджета RadioButton, который
устанавливает значение атрибута blur_type.

6 АНАЛИЗ РЕЗУЛЬТАТОВ РЕШЕНИЯ ПОСТАВЛЕННОЙ


ЗАДАЧИ

26
ЗАКЛЮЧЕНИЕ

27
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

28
ПРИЛОЖЕНИЕ А
Листинг кода

29
ПРИЛОЖЕНИЕ Б

Структура пользовательского графического интерфейса

30

Вам также может понравиться