Применение симплекс-метода для оптимизации параметров ранговой фильтрации¶
В данной статье рассматривается реализация и сравнение алгоритмов обработки изображений на языках Julia и MATLAB. Основная задача — применение симплекс-метода для оптимизации параметров ранговой фильтрации с целью максимизации контраста изображения штрих-кода.
Алгоритм включает следующие этапы.
- Ранговая фильтрация — подавление шумов на изображении с адаптивными порогами.
- Расчёт контраста — оценка различий между чёрными и белыми элементами штрих-кода.
- Оптимизация методом симплекса — поиск параметров фильтра, обеспечивающих самое высокое из возможного качество изображения.
В статье представлен код на обоих языках, проведено визуальное сравнение результатов и проанализированы особенности реализации.
Pkg.add("Statistics")
Начнём с визуализации входных данных. На рисунке ниже представлено исходное изображение штрих-кода, с которым в дальнейшем мы будем работать.
using Images
Folder = @__DIR__
puth_to_photo = "$Folder/Img.bmp"
cdata = load(puth_to_photo) # Загружаем изображение
Детальное описание алгоритмов обработки изображений¶
1. Ранговая фильтрация (rangefilt)¶
Назначение: подавление импульсных шумов на изображении штрих-кода с использованием адаптивных пороговых значений.
Реализации:
- MATLAB:
rangefilt(Initial_Img, T, step)
- Julia:
rangefilt(Initial_Img, T, step=1)
Входные параметры:
Initial_Img
– входное изображение (матрица яркостей),T
– вектор пороговых значений,step
– шаг смещения фильтра (по умолчанию 1).
Выходные данные:
- Отфильтрованное изображение (матрица).
Принцип работы:
- для каждого пикселя анализируется его окрестность размером (2*length(T)+1);
- вычисляется медиана окрестности;
- пиксель заменяется на медиану, если разница с соседями превышает порог T.
Ключевые отличия реализаций:
Аспект | MATLAB | Julia |
---|---|---|
Типизация | Динамическая | Строгая с аннотациями типов |
Обработка границ | Неявная | Явный контроль размеров |
Векторизация | Встроенная | Использование broadcast (.+) |
Производительность | JIT-компиляция | LLVM-компиляция |
2. Расчет контраста (contrastBC)¶
Назначение: количественная оценка различий между черными и белыми элементами штрих-кода.
Реализации:
- MATLAB:
[contrast, MeanImg] = contrastBC(Initial_Img)
- Julia:
contrast, MeanImg = contrastBC(Initial_Img)
Входные параметры:
Initial_Img
– входное изображение после фильтрации.
Выходные данные:
contrast
– численная оценка контраста (скаляр),MeanImg
– изображение с усредненными уровнями яркости.
Алгоритм:
- вычисление среднего профиля яркости по столбцам,
- автоматическое определение порога AdaptiveLevel = (Min + Max)/2,
- разделение на черные (BElPos) и белые (WElPos) элементы,
- расчет контраста по формуле:
contrast = ((MeanW - MeanB)/255)*(Max - Min)/(Max + Min)
Особенности реализаций
- В MATLAB используется встроенная функция
mean
с особым форматом вывода. - В Julia применяется статистическая обработка с явным указанием размерности (
dims=1
). - Julia-версия требует явного приведения типов для арифметических операций.
3. Оптимизация методом симплекса¶
Назначение: поиск оптимальных параметров фильтрации, максимизирующих контраст.
Реализации:
- MATLAB:
[Xr, I1, MeanImg] = simplex(Xin, J, I)
- Julia:
Xr, I1, MeanImg = simplex(Xin, J, I)
Входные параметры:
Xin
– начальные значения факторов,J
– интервалы варьирования,I
– исходное изображение.
Выходные данные:
Xr
– матрица всех пробных точек и значений целевой функции,I1
– оптимальное отфильтрованное изображение,MeanImg
– изображение с выделенными черными/белыми элементами.
Ключевые этапы алгоритма:
- построение начального симплекса (правильного многогранника);
- циклическое выполнение операций:
- отражение худшей вершины,
- вычисление целевой функции (contrastBC),
- адаптация формы симплекса;
- Критерий останова – достижение 50 итераций.
Сравнение реализаций:
Компонент | MATLAB | Julia |
---|---|---|
Работа с матрицами | Встроенные операторы | Пакет LinearAlgebra |
Индексация | 1-based | 0-based для массивов |
Управление памятью | Неявное | Явное выделение (similar() ) |
Векторизация | Автоматическая | Требует . операций |
ООП подход | Процедурный | Мультиметоды |
Особенности Julia-реализации:
- явное указание типов для повышения производительности,
- использование broadcasting операций (.+, .*),
- модульная структура с выделением отдельных функций,
- поддержка многопоточности (не использовано в данной реализации).
Особенности MATLAB-реализации:
- компактная запись матричных операций,
- автоматическая обработка граничных условий,
- встроенная поддержка работы с изображениями,
- использование глобального workspace для обмена данными.
Сравнение алгоритмов¶
using MATLAB
mat"""cd($Folder)"""
@time mat"test_m"
@time include("$Folder/test_jl.jl")
Анализируя результаты работы кода, можно заметить разницу во времени работы примерно в два раза. А также видно, что, хотя общая логика алгоритмов сохраняется, выбор языка существенно влияет на:
- способ обработки граничных условий,
- методы оптимизации производительности,
- стиль организации кода,
- возможности расширения функционала.
Julia демонстрирует более современный подход с явной типизацией и лучшими возможностями для оптимизации, тогда как MATLAB предлагает более компактную запись для матричных операций.
Визуализация результатов¶
function center_text(text::String, width::Int)
padding = " " ^ div(width - length(text), 2)
println(padding * text)
end
# Загружаем изображения
Img_contrastBC_julia = load("$Folder/Img_contrastBC_julia.png")
Img_contrastBC_matlab = load("$Folder/Img_contrastBC_matlab.png")
Img_rangfilt_julia = load("$Folder/Img_rangfilt_julia.png")
Img_rangfilt_matlab = load("$Folder/Img_rangfilt_matlab.png")
# Объединяем изображения
center_text("Julia and MATLAB", 140)
println()
center_text("rangfilt", 140)
display(hcat(Img_rangfilt_julia, Img_rangfilt_matlab))
println()
center_text("contrastBC", 140)
display(hcat(Img_contrastBC_julia, Img_contrastBC_matlab))
Как мы можем заметить, изображения идентичные, что свидетельствует об однотипности реализованных алгоритмов.
Выводы¶
- Оба языка успешно справились с задачей, но MATLAB показал более лаконичный синтаксис при работе с матрицами.
- Реализованный симплекс-метод эффективно оптимизировал параметры фильтрации, что подтверждается визуальным улучшением контраста.
- Сравнение изображений после обработки (
rangfilt
иcontrastBC
) демонстрирует схожие результаты.
Дальнейшие исследования могут быть направлены на:
- ускорение вычислений в Julia за счет применения параллельных вычислений,
- тестирование на более сложных зашумленных изображениях,
- сравнение с другими методами оптимизации (градиентный спуск, генетические алгоритмы).