Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 37 additions & 32 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,20 @@ __Цель данной работы__ - реализовать набор пр

__Основные задачи__

1. Разработать программную реализацию сглаживания посредством вычисления
среднего по окрестности. Границы обработать посредством зеркального
отображения пикселей (`gfedcb|abcdefgh|gfedcba`).
1. Реализовать линейный фильтр с произвольным ядром. Граница дополнена
нулевыми значениями.
нулевыми значениями. Ведущий элемент в центре ядра.
1. Разработать реализацию медианного фильтра. При вычислении использовать
только пиксели внутри изображения.
1. Реализовать горизонтальный фильтр Собеля. Границы обработать посредством
зеркального отображения пикселей (`gfedcb|abcdefgh|gfedcba`).
только пиксели внутри изображения. Размер ядра - нечетная величина, ведущий
элемент ядра находится в центре ядра.

__Дополнительные задачи__

1. Разработать программную реализацию сглаживания посредством вычисления
среднего по окрестности. Границы обработать посредством зеркального
отображения пикселей (`gfedcb|abcdefgh|gfedcba`). Угловые пиксели
отображаются зеркально вдоль главной и побочной диагоналей.
1. Реализовать горизонтальный фильтр Собеля. Границы обработать посредством
зеркального отображения пикселей (`gfedcb|abcdefgh|gfedcba`). Угловые
пиксели отображаются зеркально вдоль главной и побочной диагоналей.
1. Расширить реализацию класса матриц следующими операциями и тестами к ним:
1. Транспонирование матрицы.
1. Умножение матриц (в виде перегрузки операции).
Expand All @@ -55,17 +57,23 @@ __Дополнительные задачи__
1. Создать рабочую ветку для размещения реализаций фильтров (раздел
[Общие инструкции по работе с Git][git-intro]).
1. Создать собственного наследника `FiltersSurname` от абстрактного класса фильтров.
1. Реализовать последовательно все чисто виртуальные методы базового класса -
методы фильтрации, перечисленные в разделе [Основные задачи][tasks].
1. При реализации каждого фильтра следует пересобрать проект и проверить
работоспособность тестов. Изменения необходимо постоянно фиксировать,
выкладывая в рабочую ветку на сервер (раздел
[Общие инструкции по работе с Git][git-intro]).
1. Сделать Pull Request в upstream-репозиторий.
1. Выбрать и решить одну из задач списка [Дополнительные задачи][tasks].
Необходимо проконтролировать, чтобы задача не была выбрана другими
участниками школы. В противном случае, в основной репозиторий попадет
первая полностью готовая реализация.
1. Реализовать в наследнике последовательно чисто виртуальные методы
базового класса - методы фильтрации, перечисленные в разделе
[Основные задачи][tasks] (линейный и медианный фильтры).
1. При реализации каждого фильтра следует пересобрать проект и проверить
работоспособность тестов.
Рекомендации:
- Отключить тесты для фильтров, которые не реализованы в вашем классе
до настоящего момента (вставьте `DISABLED_` перед названием теста).
- Изменения необходимо постоянно фиксировать, выкладывая
в рабочую ветку на сервер (раздел
[Общие инструкции по работе с Git][git-intro]).
1. Сделать Pull Request в репозиторий upstream.
1. Выбрать и решить одну из задач списка
[Дополнительные задачи][tasks].
Начиная с третьей задачи, необходимо проконтролировать, чтобы задача
не была выбрана другими участниками школы. В противном случае,
в основной репозиторий попадет первая полностью готовая реализация.

## Общая структура проекта

Expand Down Expand Up @@ -471,22 +479,19 @@ __Примечание:__ генератор проекта должен сов
1. Создать собственного наследника `FiltersYourName` от абстрактного класса фильтров.
1. Создать файл `filters_YOUR_NAME.cpp` (файл с реализацией в файловой
системе) для собственных реализаций фильтров.
1. В качестве шаблона необходимо воспользоваться `filters_opencv.cpp`.
Можно скопировать класс без реализации методов из файла
`filters_opencv.cpp` в файл `filters_YOUR_NAME.cpp`, заменив
название класса `FiltersOpenCV` на `FiltersYourName` (ниже приведен
1. Добавьте в созданный файл класс `FiltersYourName` (ниже приведен
фрагмент кода).

```cpp
class FiltersYourName : public Filters
{
public:
virtual void boxFilter(const Matrix &src, Matrix& dst, const int kSize = 3)
{ }
public:
virtual void filter2d(const Matrix &src, Matrix& dst, const Matrix &kernel)
{ }
virtual void median(const Matrix &src, Matrix &dst, const int kSize = 3)
{ }
virtual void boxFilter(const Matrix &src, Matrix& dst, const int kSize = 3)
{ }
virtual void SobelOx(const Matrix &src, Matrix &dst)
{ }
};
Expand All @@ -504,7 +509,7 @@ __Примечание:__ генератор проекта должен сов
1. В функции `Filters* createFilters(FILTERS_IMPLEMENTATIONS impl)` (файл
`filters_factory.cpp`) необходимо добавить еще одну ветку у оператора-
переключателя `switch`, по которой будет проходить исполнение программы,
если создан объект класса фильтров `YOUR_NAME`.
если создается объект класса фильтров `YOUR_NAME`.
1. В файл `filters_YOUR_NAME.cpp` необходимо поместить реализацию функции
создания объекта класса фильтров с вашей реализацией
`Filters* createFiltersYourName()`. Указание: для примера можно
Expand All @@ -513,14 +518,14 @@ __Примечание:__ генератор проекта должен сов
```cpp
Filters* createFiltersYourName()
{
Filters* filters = new createFiltersYourName();
Filters* filters = new FiltersYourName();
return filters;
}
```

1. После выполнения перечисленных действий проект должен успешно
компилироваться, но тесты с вашей реализацией фильтров будут падать.
1. Реализовать последовательно все чисто виртуальные методы базового класса -
1. Реализовать последовательно чисто виртуальные методы базового класса -
методы фильтрации, перечисленные в разделе [Основные задачи][tasks].
Обратите внимание, что у каждого фильтра свой способ обработки краевых
пикселей на изображении.
Expand All @@ -540,9 +545,9 @@ __Примечание:__ генератор проекта должен сов
работоспособность тестов на Travis-CI и позволить преподавателям
сделать ревью Вашего кода.
1. Выбрать и решить одну из задач списка [Дополнительные задачи][tasks].
Необходимо проконтролировать, чтобы задача не была выбрана другими
участниками школы. В противном случае, в основной репозиторий попадет
первая полностью готовая реализация.
Начиная с третьей задачи, необходимо проконтролировать, чтобы задача
не была выбрана другими участниками школы. В противном случае,
в основной репозиторий попадет первая полностью готовая реализация.

<!-- LINKS -->

Expand Down
3 changes: 1 addition & 2 deletions include/filters.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ class Filters

enum FILTERS_IMPLEMENTATIONS {
OPENCV,
// Add your enum value here
// YOUR_NAME,
KUSTIKOVA,
NUM_IMPLS
};

Expand Down
8 changes: 3 additions & 5 deletions src/filters_factory.cpp
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
#include "filters.hpp"

Filters* createFiltersOpenCV();
// Declare your implementation here
// Filters* createFiltersYourName();
Filters* createFiltersKustikova();

Filters* createFilters(FILTERS_IMPLEMENTATIONS impl)
{
switch (impl) {
case OPENCV:
return createFiltersOpenCV();
// Add case for your implementation
// case YOUR_NAME:
// return createFiltersYourName();
case KUSTIKOVA:
return createFiltersKustikova();
default:
return 0;
}
Expand Down
Loading