Задание посвящено применению полученных вами знаний
по обработке и анализу изображений для решения модельной задачи -
распознавание циферблата аналоговых часов. Для успешного
выполнения задания требуется реализовать несколько функций по обработке
изображений, а также суметь воспользоваться этими функциями для успешного
решения задачи распознавания.
На изображениях для обработки находятся 3 типа объектов
интереса: круги на циферблате, соответствующие 1-11 часам, вытянутый
прямоугольник, соответствующий 12 часам, и стрелки часов. Все остальное -
шум, нас не интересующий. Для облегчения задания центр циферблата
(место соединения стрелок) также отмечено кругом, что существенно облегчает
задачу распознавания (позже объясню, почему).
В чем состоит задание? Задание формулируется
следующим образом: на входном изображении нужно обнаружить циферблат часов
(размер, положение и поворот заранее неизвестны), найти его ориентацию
(где верх, где низ), найти направление стрелок и вычислить, сколько на часах
времени.
Правила отображения результатов:
- Нарисовать окружность с центром, совпадающим с циферблатом, и радиусом,
равным расстоянию от центра до середины прямоугольника, соответствующего "12 часам";
- Нарисовать отрезок соединяющий "6 часов" и "12 часов";
- Поверх стрелок нарисовать прямые, указывающие их направление;
- Поверх всего циферблата (не закрывая его слишком сильно) напечатать
время, которое показывают часы;
Исходная картинка (слева) и результат работы (справа)
Требуется написать программу, выполняющую следующие операции над изображениями из
категории "simple" (отсутствие шума, центр отмечен кругом):
- Загрузка и отображение BMP-файла.
Достаточно сделать поддержку только RGB
(непалитровых) форматов изображений;
- Преобразование изображения в бинарное
с помощью алгоритма k-средних (другие алгоритмы
не принимаются);
- Выделение связных областей любым из алгоритмов,
рассказаных на лекции;
- Вычисление инвариантных характеристик областей и
их классификация - (стрелки, указатель 12 часов, указатели 1-11 часов);
- Реализация операций математической морфологии
(cужение, расширение, открытие, закрытие);
- Распознавание направления стрелок;
- Распознавние и отображение времени, показываемого часами
. Отображние должно быть оформлено, как написано выше,
все 4 пункта правил отображения обязательны.
Программа должна реализовывать универсальный алгоритм,
одинаково (правильно) работающий на всех изображениях из категории
"simple". За реализация минимального задания
дается 8 баллов.
Для тех, кто хотел бы самостоятельно придумать алгоритм распознавания
времени для картинок "simple", я здесь ничего не пишу. Те, кому нужна
подсказка, найдут ее здесь.
За быструю работу алгоритмов, удобный и красивый (не путать с вычурным)
интерфейс и аккуратно и грамотно оформленный код (в соотвествии с рекомендациями)
будут начисляться призовые баллы (всего не более +3 баллов).
Также дополнительно поощряются:
- Реализация медианной фильтрации с задаваемым размером окрестности
(+2 балла)
- Реализация выделения связных областей путем последовательного сканирования
(+2 балла)
Для каждой категории изображений "simple" дается набор
аналогичных зашумленных изображений. За успешное обработку с применением шумоподавления
известными вам способами (фильтр Гаусса, медианный фильтр, математическая морфология)
зашумленных изображений
дается дополнительно до +4 баллов (в зависимости от того, с какими картинками
справитесь). Имейте ввиду, что шумоподавление можно применять
как до перевода изображения в бинарное, так и после - выбор алгоритма за вами.
В файле readme обязательно должно быть описано, как именно подавляется
шум (последовательность фильтров, их параметры). Если не удается найти
универсальную последовательность фильтров для шумоподавления для всех
изображений с шумом, можно сделать свою последовательность для каждого шумного
изображения, вызываемую из меню программы.
Советы: Пробуйте разные фильтры, морфологию с разными структурными элементами.
Для одной из картинок из раздела "шумных" требуется разделение на 3 кластера яркости,
а не на два (в k-средних k=3). Пробуйте применять различные предобработки для
разных задач. Скажем, для нахождения указателей 1-11 и 12 часов - одна последовательность
фильтров, после этого, опираясь на полученные знания, можно применить к исходному
изображдению другую последовательность фильтров для нахождения стрелок.
Крайне желательно, чтобы программа была под Windows.
Архив с изображениями "simple"
Архив с зашумленными изображениями
Обязательное требование - выполнить обязательную часть задания.
Еще одно обязательное требование - разбираться в материале. В спорных
ситуациях оценка выставляется после личной беседы, выявляющей понимание
принципа действия основных алгоритмов.
К программе должны прилагаться все необходимые для ее запуска библиотеки
(опускать можно только слишком большие библиотеки, если они явлются
стандартными). Отсутствие библиотек создает неудобства при проверке,
однако не фатально. У нас есть набор из наиболее часто недостающих
библиотек для Borland C++ Builder и MS Visual C++.
Оформление не отличается от обычного.
ZIP-архив с исходными текстами и исполняемыми файлами, названный
по схеме GZV_nnnnnnnn.zip (где G - последняя цифра номера группы, Z - номер задания, V - номер версии задания, nnnnnnnn
- номер студенческого билета) присылайте на assign3@graphics.cs.msu.su
Например, студент 206 группы с номером студенческого билета 06529042, сдающий обновленную (вторую) версию программы по
второму заданию, должен прислать архив с именем 622_06529042.zip.
Также смотрите здесь, какие
файлы нам присылать и как их оформить Советуем очень внимательно
прочитать весь FAQ
Не забудьте положить в архив файл readme.txt. В файле описать интерфейс програмы (алгоритм
работы с программой, пункты меню, управляющие клавиши)
Результаты смотрите в интернете и/или на стенде около комнаты 703.
Примечания
- Задание выполняется строго индивидуально. За совместную работу
или обмен кусками кода ставится ноль баллов всем участникам,
если факт командной работы не был указан в readme.txt заданий.
- Рекомендуется написание программы под семейство ОС Windows.
Написание под другие операционные системы нежелательно и может
вызвать задержки с проверкой таких работ.
ЧаВо по заданию
Почему иногда не работает алгоритм k-средних?
В алгоритме k-средних используется элемент случайности при выборе
первого приближения средних значений кластеров. В некоторых случаях,
при сегментации изображений, где число присутствующих яркостей мало,
может возникнуть ситуация, когда к одному из средних не будет приписано
ни одного пикселя.
Пример: изображения с яркостями от 0 до 130. Если при первом шаге
разделения выпадут случайные средние 128 и 200, то получится,
что к среднему яркости 200 не окажется приписанным ни одного пикселя.
И в результате получится один кластер вместо двух.
Чтобы избежать этой ситуации нужно иметь ввиду такую возможность
и предпринимать некие действия для решения проблемы, например:
случайным образом вычислять средние исходя из реального диапазона
яркостей изображения (в нашем примере от 0 до 130), и/или при
обнаружении среднего с нулем приписанных к нему пикселей заново
инициализировать его случайным образом.
Если разметку связных областей проводить рекурсивным методом, то на 5 и 6 картинках переполняется стек. Как этого избежать?
Этого можно избежать использую некоторую предобработку изображения или
выделяя оболасти нерекурсивно, но поскольку это не входит в
минимальную часть задания, мы выкладываем изображения, на которых это
происходить не будет. Можно пользоваться как изображениями 5, 6 из
предыдущего архива так и из поправленного.
Архив с поправленными изображениями 5 и 6.
Какие функции нужно обязательно выносить в пользовательский интерфейс?
Нужно предусмотреть возможность вызвать (кнопкой или меню):
- Цикл полной обработки изображения для вычисления времени на часах
- Операции математической морфологии (все 4)
- Медианный фильтр, с возможностью задать размер окрестности (если реализован)
Все остальные функции также желательно вынести в интерфейс, но перечисленное
выше - обязательно.
Я придумал хитрый алгоритм распознавания, отличающийся от данного в задании. Я молодец?
Если алгоритм работает - то да. Не забудьте только реализовать вещи, перечисленные
в обязательной части. И еще не забудьте описать в readme ваш алгоритм (четко,
кратко и понятно). Оригинальные идеи будут премироваться дополнительными баллами.
Что будет с теми кто пришлет плагиат?
Мы подумываем о том, чтобы ужесточить меры, принимаемые к плагиатчикам.
Вполне вероятно за третье задание будут ставиться отрицательные баллы
всем владельцам одинаковых работ. Берегите ваши работы от нечистоплотных
любителей халявы.
|