Форум программистов, компьютерный форум, киберфорум
Наши страницы
arch_m
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Своими руками. Retinex на mathcad и mathematica.

Запись от arch_m размещена 04.08.2018 в 15:49
Обновил(-а) tezaurismosis 05.08.2018 в 11:25 (Теги)

Сначала немного теории.

...........модель регистрации изображения можно упростить как:

s (i, j, λ) ≈ R(i, j, λ)S (i, j, λ), (3)

Цель алгоритмов Retinex – разделить наблюдаемое изображение s (i, j, λ) на две компоненты: компоненту, отвечающую за отражение R(i, j, λ), и компоненту, отвечающую за яркость исходного изображения сцены S (i, j, λ), а затем компенсировать неоднородность освещения, т.е. осветлить слишком темные области и затемнить слишком светлые, чтобы визуально расширить
динамический диапазон яркостей изображения.
....................................................
.....................................................
........................................................
В одномасштабном
алгоритме (Signal-Scale Retinex [19]) выходное изображение для заданного спектрального
диапазона λ вычисляется следующим образом:

O (i, j, λ) = log (s (i, j, λ)) − log (s (i, j, λ) ∗ F(i, j))

где F(i, j) – нормализованная сглаживающая функция окружения, * – операция свертки,
⟨g(i, j)⟩ = g(i, j) ∗ F(i, j) – взвешенное усреднение по области определения скользящей сглаживающей
функции.


http://www.jip.ru/2016/152-161-2016.pdf

Как по мне, так тут очень много неясного. Для какой цели в алгоритме используется логарифм? И почему выбрано такое написание (log)? И что делать с отрицательными величинами возникающими при логарифмировании? Попробуем ответить на все эти вопросы, попутно реализовав метод retinex на Mathcad 15 и mathematica 9.

Итак к сути вопроса. Иногда есть необходимость выровнять общую освещенность изображения. Например вот такого.

Нажмите на изображение для увеличения
Название: Img_66.gif
Просмотров: 28
Размер:	167.8 Кб
ID:	4993

Ясно, что тени по краям совершенно не нужны и при попытке распечатать документ мы будем иметь серые разводы на листе. Вот тут-то нам и поможет retintx.

Идея состоит в том, что-бы с помощью очень сильного размытия изображения (например свертка по Гауссу) получить яркостную матрицу общей освещенности снимаемого объекта. Затем с помощью этой матрицы можно скомпенсировать грубые яркостные переходы в основном изображении.

Изначальная формула предполагает почленное деление элементов матрицы яркости на элементы матрицы с размытием. Но тут есть одна проблема, матричная алгебра не знает операции почленного деления матрицы на матрицу. Очевидное решение этой проблемы почленное логарифмирование обеих матриц и последующее вычитание второй матрицы из первой. Вот зачем нужно логарифмирование!

Из приведенных соображений вытекает и необходимость последующего потенциирования элементов полученной матрицы. Упс. Похоже автор попросту не понял существо метода и бездумно переписал (скопипастил) какой-то иностранный источник. Отсюда в этом тексте и log вместо например ln. Между тем практик должен иметь ввиду это обстоятельство, зная тот простой факт что mathcad, matlab и т.п. языки поддерживают операцию почленного деления матриц и значит при реализации алгоритма никакое логарифмирование не требуется.

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

Гистограмма исходного изображения.

Нажмите на изображение для увеличения
Название: гист1.jpg
Просмотров: 28
Размер:	7.4 Кб
ID:	4984

Гистограмма изображения после обработки.

Нажмите на изображение для увеличения
Название: гист2.jpg
Просмотров: 28
Размер:	6.2 Кб
ID:	4987

Для постобработки я использовал метод линейной коррекции.

Нажмите на изображение для увеличения
Название: гист.jpg
Просмотров: 30
Размер:	6.3 Кб
ID:	4985

Ну и собственно результат.

Нажмите на изображение для увеличения
Название: вывод.jpg
Просмотров: 29
Размер:	49.3 Кб
ID:	4988

Как видим картинка стала хоть и однородной но сероватой. Чтобы привести ее к товарному (черно-белому) виду нужно подкорректировать яркость и контрастность. Делать это на mathcad я считаю избыточным.

Фильтр SSR.rar

Ну и то-же самое на Mathematica 9.

Встроенные функции позволяют сразу обрабатывать изображения.

Код:
ImageApply[
        ((#1 + 0.1)/(#2 + 0.1))*
              (1/3) + ((#1 + 0.1)/
                 (#3 + 0.1))*(1/3) + 
            ((#1 + 0.1)/(#4 + 
                    0.1))*(1/3) & , 
        {img, GaussianFilter[
            img, 100], 
          GaussianFilter[img, 
            50], GaussianFilter[
            img, 150]}]; ]
Здесь нужно кое-что пояснить. 0,1 прибавлено к числителю и знаменателю для того чтобы избежать деления на 0.

Для более лучшего выравнивания рекомендуется взять несколько изображений с различными радиусами размытия.
В данном случае я остановился на 3-х.

Retinex_2.rar

В заключении. Метод размытия необязательно должен выполнятся по Гауссу.

ЗЫ. В предлагаемых файлах не используйте картинки с высоким разрешением. Система может зависнуть. Эти примеры предназначены прежде всего для иллюстрации метода.
Размещено в Без категории
Просмотров 162 Комментарии 3
Всего комментариев 3
Комментарии
  1. Старый комментарий
    arch_m
    Почти во всех языках программирования именно log обозначает ln (натуральный логарифм). Я к этому привык ... ну не вводить же специальную функцию вида ln() ... хотя можно, но зачем?
    Запись от нтч размещена 04.08.2018 в 16:13 нтч вне форума
  2. Старый комментарий
    Цитата:
    Сообщение от нтч Просмотреть комментарий
    arch_m
    Почти во всех языках программирования именно log обозначает ln (натуральный логарифм). Я к этому привык ... ну не вводить же специальную функцию вида ln() ... хотя можно, но зачем?
    Автор разбирает проблему с точки зрения математики, а не языков программирования.
    Кстати американцы пишут преспокойно log откуда это и попало в языки программирования.
    Запись от arch_m размещена 04.08.2018 в 16:34 arch_m вне форума
  3. Старый комментарий
    arch_m,
    я с вами полностью согласен. Однако Америка взяла лидерство. И остальные государства просто вынуждены повторять то, что делает великая держава. А как это выглядит с точки зрения математики? - это уже мало кого волнует. Ну не нравится вам (и мне тоже) - ничего с вами не случится. Создавайте свои программы ...
    Запись от нтч размещена 04.08.2018 в 17:38 нтч вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru