В работе реализована последовательная обработка изображений в градациях серого с использованием линейной свёртки и median filter.
Поддерживаются следующие фильтры:
identityblur3blur5gaussian3gaussian5gaussian3_exactmotion9edge_horizontal5edge_vertical5edge_45deg5edge_all3sharpen3sharpen5edge_excessive3emboss3emboss5mean3median3median5median7
Для сборки и запуска проекта должны быть установлены:
- Git
- Maven
- Java 24
Проект компилируется с настройкой source = 22, а замеры производительности выполнялись на Java 24.
Склонировать проект с GitHub:
git clone <repo_url>Перейти в каталог проекта:
cd <repo_name>Вместо
<repo_url>нужно подставить ссылку на репозиторий,
а вместо<repo_name>— имя папки проекта после клонирования.
Собрать проект с помощью Maven:
mvn clean packageПосле успешной сборки скомпилированные .class-файлы будут находиться в каталоге target/classes.
java -cp target/classes Main apply <input> <output> <filterName>Пример:
java -cp target/classes Main apply input.png output.png gaussian3java -cp target/classes Main benchmark <input> <filterName> <iterations>Пример:
java -cp target/classes Main benchmark input.png gaussian3 500Для запуска тестов используется команда:
mvn testidentityblur3blur5gaussian3gaussian5gaussian3_exactmotion9edge_horizontal5edge_vertical5edge_45deg5edge_all3sharpen3sharpen5edge_excessive3emboss3emboss5mean3median3median5median7
java -cp target/classes Main apply D:\temp\input.png D:\temp\output.png gaussian3Для проверки корректности реализации использовались следующие идеи:
identityне должен изменять изображение- нулевое ядро должно давать полностью чёрное изображение
- размеры выходного изображения должны совпадать с размерами входного
- значения пикселей после фильтрации должны оставаться в диапазоне
0..255 medianна константном изображении не должен менять результатmedianдолжен убирать одиночный импульсный шум- для части линейных фильтров использовалось сравнение с библиотечной реализацией свёртки для внутренних пикселей изображения
- расширение ядра нулевыми коэффициентами не должно менять результат
Замеры производительности выполнялись для последовательной реализации фильтрации изображений в градациях серого.
Конфигурация стенда:
- операционная система: Windows 11 Pro, версия 25H2, сборка 26200.8246
- процессор: 11th Gen Intel(R) Core(TM) i7-11370H @ 3.30 GHz
- оперативная память: 16 ГБ
- тип системы: 64-разрядная операционная система, процессор x64
- среда выполнения benchmark: Java 24 (
Java HotSpot(TM) 64-Bit Server VM) - версия компиляции проекта: Java 22
- количество запусков для каждого замера:
500 - размеры изображений:
256x256,512x512,1024x1024,2048x2048 - измеряемые фильтры:
gaussian3,gaussian5,blur5,sharpen3,motion9,median3,median5
Для каждого запуска использовался режим benchmark, который печатает время каждой итерации и итоговое среднее значение времени выполнения и пропускной способности.
| Фильтр | 256x256 | 512x512 | 1024x1024 | 2048x2048 |
|---|---|---|---|---|
gaussian3 |
2.647 | 9.689 | 38.156 | 150.786 |
gaussian5 |
5.726 | 22.419 | 89.901 | 352.558 |
blur5 |
5.712 | 26.983 | 90.336 | 355.390 |
sharpen3 |
2.874 | 10.193 | 39.846 | 150.532 |
motion9 |
16.424 | 66.375 | 257.531 | 1037.052 |
median3 |
5.268 | 19.512 | 68.944 | 275.658 |
median5 |
20.451 | 82.723 | 308.710 | 1217.208 |
| Фильтр | 256x256 | 512x512 | 1024x1024 | 2048x2048 |
|---|---|---|---|---|
gaussian3 |
24.759 | 27.057 | 27.481 | 27.816 |
gaussian5 |
11.446 | 11.693 | 11.664 | 11.897 |
blur5 |
11.472 | 9.715 | 11.608 | 11.802 |
sharpen3 |
22.804 | 25.718 | 26.316 | 27.863 |
motion9 |
3.990 | 3.949 | 4.072 | 4.044 |
median3 |
12.441 | 13.435 | 15.209 | 15.216 |
median5 |
3.204 | 3.169 | 3.397 | 3.446 |
По результатам замеров видно, что с увеличением размера изображения время выполнения растёт почти пропорционально числу пикселей.
Например, для gaussian3 время увеличилось с 2.647 мс на 256x256 до 150.786 мс на 2048x2048, а для motion9 — с 16.424 мс до 1037.052 мс.
Наиболее быстрыми среди протестированных фильтров оказались gaussian3 и sharpen3.
Их пропускная способность держится примерно на уровне 25–28 MPix/s, что заметно выше, чем у остальных фильтров.
Фильтры gaussian5 и blur5 работают медленнее, чем фильтры с окном 3x3, так как для каждого пикселя требуется обработать больше соседних значений.
На больших размерах изображения их пропускная способность держится примерно на уровне 11–12 MPix/s.
Фильтр motion9 оказался одним из самых тяжёлых.
Это объясняется тем, что используется окно 9x9, то есть на каждый пиксель приходится значительно больше операций.
median-фильтры также работают заметно медленнее обычной линейной свёртки.
Например, на размере 2048x2048:
median3=275.658 мсgaussian3=150.786 мсmedian5=1217.208 мсgaussian5=352.558 мс
То есть median3 примерно в 1.8 раза медленнее gaussian3, а median5 примерно в 3.5 раза медленнее gaussian5.
Это связано с тем, что median filter не просто суммирует значения по окну, а собирает значения окна и сортирует их для поиска медианы.
Последовательная реализация подходит как базовая референсная версия для дальнейших задач.
Однако уже на изображениях 1024x1024 и 2048x2048 видно, что фильтры с большими окнами и особенно median5 становятся достаточно дорогими по времени.
Это подтверждает, что для следующих задач имеет смысл переходить к параллельной реализации.

