Документация Engee
Notebook

Применение симплекс-метода для оптимизации параметров ранговой фильтрации

В данной статье рассматривается реализация и сравнение алгоритмов обработки изображений на языках Julia и MATLAB. Основная задача — применение симплекс-метода для оптимизации параметров ранговой фильтрации с целью максимизации контраста изображения штрих-кода.

Алгоритм включает следующие этапы.

  1. Ранговая фильтрация — подавление шумов на изображении с адаптивными порогами.
  2. Расчёт контраста — оценка различий между чёрными и белыми элементами штрих-кода.
  3. Оптимизация методом симплекса — поиск параметров фильтра, обеспечивающих самое высокое из возможного качество изображения.

В статье представлен код на обоих языках, проведено визуальное сравнение результатов и проанализированы особенности реализации.

In [ ]:
Pkg.add("Statistics")

Начнём с визуализации входных данных. На рисунке ниже представлено исходное изображение штрих-кода, с которым в дальнейшем мы будем работать.

In [ ]:
using Images
Folder = @__DIR__
puth_to_photo = "$Folder/Img.bmp"
cdata = load(puth_to_photo)  # Загружаем изображение
Out[0]:
No description has been provided for this image

Детальное описание алгоритмов обработки изображений

1. Ранговая фильтрация (rangefilt)

Назначение: подавление импульсных шумов на изображении штрих-кода с использованием адаптивных пороговых значений.

Реализации:

  • MATLAB: rangefilt(Initial_Img, T, step)
  • Julia: rangefilt(Initial_Img, T, step=1)

Входные параметры:

  • Initial_Img – входное изображение (матрица яркостей),
  • T – вектор пороговых значений,
  • step – шаг смещения фильтра (по умолчанию 1).

Выходные данные:

  • Отфильтрованное изображение (матрица).

Принцип работы:

  1. для каждого пикселя анализируется его окрестность размером (2*length(T)+1);
  2. вычисляется медиана окрестности;
  3. пиксель заменяется на медиану, если разница с соседями превышает порог T.

Ключевые отличия реализаций:

Аспект MATLAB Julia
Типизация Динамическая Строгая с аннотациями типов
Обработка границ Неявная Явный контроль размеров
Векторизация Встроенная Использование broadcast (.+)
Производительность JIT-компиляция LLVM-компиляция

2. Расчет контраста (contrastBC)

Назначение: количественная оценка различий между черными и белыми элементами штрих-кода.

Реализации:

  • MATLAB: [contrast, MeanImg] = contrastBC(Initial_Img)
  • Julia: contrast, MeanImg = contrastBC(Initial_Img)

Входные параметры:

  • Initial_Img – входное изображение после фильтрации.

Выходные данные:

  • contrast – численная оценка контраста (скаляр),
  • MeanImg – изображение с усредненными уровнями яркости.

Алгоритм:

  1. вычисление среднего профиля яркости по столбцам,
  2. автоматическое определение порога AdaptiveLevel = (Min + Max)/2,
  3. разделение на черные (BElPos) и белые (WElPos) элементы,
  4. расчет контраста по формуле:
    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 – изображение с выделенными черными/белыми элементами.

Ключевые этапы алгоритма:

  1. построение начального симплекса (правильного многогранника);
  2. циклическое выполнение операций:
    • отражение худшей вершины,
    • вычисление целевой функции (contrastBC),
    • адаптация формы симплекса;
  3. Критерий останова – достижение 50 итераций.

Сравнение реализаций:

Компонент MATLAB Julia
Работа с матрицами Встроенные операторы Пакет LinearAlgebra
Индексация 1-based 0-based для массивов
Управление памятью Неявное Явное выделение (similar())
Векторизация Автоматическая Требует . операций
ООП подход Процедурный Мультиметоды

Особенности Julia-реализации:

  • явное указание типов для повышения производительности,
  • использование broadcasting операций (.+, .*),
  • модульная структура с выделением отдельных функций,
  • поддержка многопоточности (не использовано в данной реализации).

Особенности MATLAB-реализации:

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

Сравнение алгоритмов

In [ ]:
using MATLAB
mat"""cd($Folder)"""
@time mat"test_m"
>> >> >>     "X = 8"    "X = 18"    "X = 28"

    "S = 0.73263"    "S = 0.73263"    "S = 0.73263"

  7.044407 seconds (72 allocations: 3.586 KiB)
In [ ]:
@time include("$Folder/test_jl.jl")
X = [8.0 18.0 28.0]
S = [0.7326267443914503 0.7326267443914503 0.7326267443914503]
  3.121629 seconds (27.54 M allocations: 1.824 GiB, 8.88% gc time, 47.39% compilation time)

Анализируя результаты работы кода, можно заметить разницу во времени работы примерно в два раза. А также видно, что, хотя общая логика алгоритмов сохраняется, выбор языка существенно влияет на:

  1. способ обработки граничных условий,
  2. методы оптимизации производительности,
  3. стиль организации кода,
  4. возможности расширения функционала.

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

Визуализация результатов

In [ ]:
function center_text(text::String, width::Int)
    padding = " " ^ div(width - length(text), 2)
    println(padding * text)
end
Out[0]:
center_text (generic function with 1 method)
In [ ]:
# Загружаем изображения
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))
                                                              Julia and MATLAB

                                                                  rangfilt
No description has been provided for this image
                                                                 contrastBC
No description has been provided for this image

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

Выводы

  1. Оба языка успешно справились с задачей, но MATLAB показал более лаконичный синтаксис при работе с матрицами.
  2. Реализованный симплекс-метод эффективно оптимизировал параметры фильтрации, что подтверждается визуальным улучшением контраста.
  3. Сравнение изображений после обработки (rangfilt и contrastBC) демонстрирует схожие результаты.

Дальнейшие исследования могут быть направлены на:

  1. ускорение вычислений в Julia за счет применения параллельных вычислений,
  2. тестирование на более сложных зашумленных изображениях,
  3. сравнение с другими методами оптимизации (градиентный спуск, генетические алгоритмы).