Метод квантования изображения
К методам скрытия в пространственной области можно также отнести метод квантования изображения [3, 82], основанный на межпиксельной зависимости, которую можно описать некоторой функцией . В простейшем случае можно вычислить разницу
между смежными пикселями
; и
(или
и
) и задать ее как параметр функции
:
, где
— дискретная аппроксимация разницы сигналов
.
Поскольку — целое число, а реальная разница
— действительное число, то возникают ошибки квантования
. Для сильно коррелированных сигналов эта ошибка близка к нулю:
.
При данном методе скрытие информации производится путем корректировки разностного сигнала . Стеганоключ представляет собой таблицу, которая каждому возможному значению
ставит в соответствие определенный бит, например:
![]() | -4 | -3 | -2 | -1 | |||||
bi |
Для скрытия i-го бита сообщения вычисляется разница . Если при этом bi, не соответствует секретному биту, который необходимо скрыть, то значение
заменяется ближайшим
, для которого такое условие выполняется. При этом соответствующим образом корректируются значения интенсивностей пикселей, между которыми вычислялась разница
Извлечение секретного сообщения осуществляется согласно значению
, соответствующему разнице
.
Рассмотрим пример программы, реализующей метод квантования изображения
Шаг1
Исходные данные — стандартные.
Шаг 2
Стеганоключ вычисляем по модулям (М.28) и (М.29). При этом модуль (М.28) возвращает все возможные разницы сигналов (от -255 до +255), а модуль (М 29) — значения бит, соответствующие этим разницам.
Значения bi в данном случае рассчитываются на основании массива красной цветовой составляющей. При этом для каждой колонки массива R рассчитывается сумма по модулю 2 составляющих ее элементов с булевым прибавлением к результату суммирования единицы при каждом третьем элементе. В конце модуля полученной вектор b расширяется на длину вектора . Таким образом, элементы массива b носят псевдослучайный характер. Фрагменты сформированного стеганоключа показаны на рис. 5.15.
![]() | b= | ||||
-255 | |||||
-254 | |||||
-253 | |||||
-252 | |||||
![]() | ![]() | ![]() | ![]() | ||
-2 | |||||
-1 | |||||
![]() | ![]() | ![]() | ![]() | ||
Рис. 6.15. Фрагменты стеганоключа
Шаг3
Выполним развертывание массива контейнера С (массив синей цветовой составляющей) в вектор, используя модуль (М.16). Зададим стартовый индекс элемента полученного вектора, начиная с которого будет производиться встраивание бит , сообщения (например, ).
Для расчета величины шага (псевдослучайного интервала) используем модуль (М.15). Пусть при этом К := 8.
Шаг 4
Алгоритм встраивания реализует модуль (М.30). Формирование вектора двоичных данных из строки символов аналогично представленному в (М.21) (при этом, однако, необходимо заменить на
).
Для каждого -го бита сообщения выполняется вычисление индекса z элемента вектора контейнера Cv. Рассчитывается разница
между соседними пикселями Cvzи Cvz-1 Внутренним циклом
производится поиск соответствующего значения разницы в векторе
. В случае обнаружения, переменной
присваивается значение индекса i, который соответствует данной разнице в
.
Если значение не соответствует текущему биту скрываемого сообщения, то выполняется поиск ближайшего индекса, при котором biравняется биту сообщения. Поиск производится вниз (L) и вверх (Н) от индекса
.
Предварительное присвоение переменным и
значения ±1000 обеспечивает невозможность дублирования предыдущих значений
, если движение вниз или вверх от
не привело к выполнению поставленного условия (последнее возможно при нахождении индекса
слишком близко к нижней или верхней границе вектора b). После того как значения
и
найдены, выбирается то из них, которое ближе к начальному значению
.
Интенсивность пикселя контейнера Svz равна увеличенной на величину интенсивности смежного пикселя Svz-1. Если данное увеличение приводит к выходу значения интенсивности цвета за пределы диапазона [0; 255], то, наоборот, интенсивности смежного пикселя Svz-1 присваивается значение интенсивности пикселя Svz, уменьшенной на величину
). После встраивания последнего бита сообщения внешний цикл прерывается.
Проводим обратное свертывание вектора Sv в матрицу, имеющую размерность первичного массива С (М.7). Получаем массив S.
Шаг 5
При извлечении сообщения предварительно формируется стеганоключ — векторы и b*. Программные модули при этом .идентичны (М.28) и (М.29). Массив контейнера S* развертывается в лектор Sv* (подобно (М. 16)).
Шаг 6
Модуль извлечения (М.31) вычисляет разницу интенсивностей смежных пикселей Sv*z и Sv*z-1 и выполняет поиск соответствующей разницы в кодовой таблице .
Значение бита , соответствующее данной разнице, присваивается текущему элементу вектора М*. В конце модуля вектор двоичных данных преобразуется к символьную строку. Полученные при вычислении визуального искажения результаты сведены в табл. 5.1 (стр. 125).