Извлечение встроенной информации
Извлечение встроенной информации из контейнера требует наличия сведений о размерности блоков, на которые разбивается изображение, а Также о конфигурации масок, которые использовались при встраивании. Процесс извлечения состоит из -следующих этапов:
1. Разбиение изображения на блоки размерностью NxN.
2. Классификация пикселей отдельного блока на зоны.
3. Деление каждой зоны на категории.
4. Сопоставление средних значений яркости для определения значения встроенного бита данных.
Первые три этапа идентичны соответствующим этапам алгоритма встраивания. Четвёртый этап заслуживает более подробного рассмотрения.
Пусть и — значения, полученные путем сравнения средних значений яркости:
(5.13 a)
(5.13 б)
Знак вычисленных и позволяет сделать предположение относительно истинного значения скрытого бита. Кроме того, абсолютные значения и несут информацию об уровне достоверности такого предположения.
Возможны три случая: -
• . При этом b*= 1, если , и b*=0,если .
Уровень достоверности: ]
- очень высокий, если , и ;
- очень высокий, если , или ;
- низкий, если и ;
- высокий во всех остальных случаях.
• Дополнительно вычисляется следующий параметр:
При этом b*=1, если , и b*=0, если . Уровень достоверности при этом низкий.
• . Вычисляется параметр . При этом b*=1, если , и b*= 0, если . Уровень достоверности при этом низкий. Если , то значение бита неопределенное.
Для повышения помехоустойчивости авторы предлагают использовать циклический код коррекции ошибок БЧХ.
Рассмотрим реализацию описанного выше метода в программной среде MathCAD.
Шаг1
Выделим массивы цветовых компонентов изображения:
R:=READ_RED("C.bmp"); G:=READ_GREEN("C.bmp"); В:=READ_BLUE("C.bmp").
Аналогично предыдущим методам, встраивание будем выполнять в массив синей цветовой составляющей (В).
Шаг 2
Определяем размерность массива контейнерах X и Y, а также задаем размерность сегментов (блоков), на которые он будет разбиваться: X:=rows(B), X=128; Y:=cols(B), Y=128; N=8. При этом общее количество сегментов , Ns = 256 сегментов.
ШагЗ
С помощью программного модуля (М.34) разбиваем общий массив В на отдельные блоки. При этом последние выделяются из массива с помощью функции submatrix( )и сохраняются как элементы вектора S.
На начальном этапе, столбцы, которые ограничивают выделенный из массива сегмент, имеют индексы . Участок, ограниченный столбцами с1 и с2, полностью проходится путем постепенного наращивания значения индексов строк r1 и r2. В случае, когда индекс r2 совпадает с индексом последней строки, индексы столбцов увеличиваются на ширину выделяемых сегментов Nи т.д.
Отметим, что данный модуль не рассчитан на разбиение изображения на сегменты, размерность которых не кратна размерности изображения (данную возможность можно учесть путем введения в тело программного модуля соответствующих ограничивающих условий). В данном же случае, в результате вычисления программного модуля возвращается вектор S из 266 элементов, каждый из которых представляет собой матрицу размерностью 8x8.
Каждый сегмент S предназначен для скрытия одного бита секретного сообщения М, поэтому желательно предварительно проверить достаточность количества сегментов для этой операции. В нашем случае сообщение идентично используемому при рассмотрении предыдущих методов; его длина LM = 200 бит. Таким образом, количество сегментов вполне достаточно, поскольку Ns=256.
Шаг 4
Выполним классификацию пикселей каждого из блоков на зоны 1 и 2 (М.35). Во внимание принимается только количество сегментов, достаточное для встраивания данного сообщения М.
В начале цикла изменения s переменной Бприсваивается значение s-го сегмента S. Полученный массив Б разворачивается в вектор f, который в отсортированном виде присваивается переменной F. Таким образом, вектор Fимеет N2 элементов, расположенных по возрастанию.
Для существования возможности принятия одинаковых решений как на передающей стороне при встраивании, так и на принимающей стороне при извлечении относительно точки, при которой функция F имеет наибольшую крутизну (см. рис. 5.17), последнюю желательно сгладить, используя в качестве узловых точек лишь некоторую часть (г)от общего их количества (N2). Очевидно, что абсцисса первой узловой точки должна равняться единице , а последней — . Абсциссы промежуточных узловых точек формируются по выражению, смысл которого очевиден. В массив заносятся соответствующие ординаты узловых точек.
Пользуясь встроенной функцией ispline( ), формируем вектор кубических сплайн-коэффициентов вторых производных при приближении к опорным точкам (при этом предельные точки линейные). Для проведения сплайн-аппроксимации используем функцию interp(spline, ), которая для каждой искомой абсциссы вычисляет значение аппроксимированной функции.
Из основ дифференциального исчисления известно [101], что угол наклона касательной в заданной точке к графику функции равен арктангенсу от производной этой функции при данном значении аргумента. Следовательно, абсциссу точки максимальной крутизны сплайн-аппроксимированной функции можно найти по максимуму первой производной (d/d ) данной функции среди всех возможных значений .
В случае нахождения максимального значения крутизны, переменной присваивается соответствующее значение . Если для любого не найдено производной больше Smax (все пиксели сегмента имеют одинаковую интенсивность), то переменной присваивается значение N2/2. Если точка максимальной крутизны является предельной (то есть, равна 1 или N2), то она сдвигается на один шаг вправо или влево соответственно (при отсутствии такой поправки будут отсутствовать пиксели, которые принадлежат соответственно к первой или второй зоне).
В том случае, если полученное значение крутизны будет меньше порога (T1), пиксели делятся между двумя зонами 1 и 2 поровну в шахматном порядке. Если выполняется поиск абсцисс и . При значении интенсивности пикселя последний относится к зоне 1; при .— к зоне 2; при — к переходной зоне ("- -").
В результате вычисления модуля возвращается вектор Zone, каждый элемент которого представляет собой матрицу идентичной размерности с соответствующим сегментом изображения (NxN). В свою очередь, каждый элемент такой матрицы может принимать три значения: 1, 2 или ("- -")., что определяет, к какой из возможных зон принадлежит пиксель сегмента S с соответствующими координатами.
Представим результаты разбиения изображения на сегменты и классификации пикселей по зонам для некоторых из этих сегментов (рис. 5.19).
Нумерация сегментов следующая: в первом столбце — с 1-га по 16-й, во втором — с 17-го по 32-й и т.д. Предварительно были установлены! следующие значения порогов: T1:=6, T2:=3.
Шаг 5
Разбиваем каждую зону на категории "А"и "Z" в соответствии с индивидуальной маской. Простой программный модуль генерирования псевдослучайных масок изображен ниже (М.36).
Рис. 5.19. Схема разбиения изображения на сегменты (а) и примеры классификации пикселей 3-го (б), 7-го (в) и 40-го (г) сегментов по зонам
Для каждого из Ns сегментов изображения генерируется массив размерностью NxN. В начале такого генерирования создается вектор нулевых элементов размерностью N2. Половине этих элементов присваивается символьное значение "А", причем это происходит с псевдослучайным шагом, который определяется заданным значением параметра Ко и текущими значениями переменных цикла i и j (для того чтобы не выйти за рамки размерности вектора, используется функция возвращения остатка от деления). Всем остальным элементам присваивается значение "Z". После заполнения, вектор ' сворачивается в матрицу .
Примеры некоторых масок, полученных для Ко:= 123, изображены на рис. 5.20.
Рис. 5.20. Примеры масок разбиения по категориям для сегментов 1-3
Шаг 6
Модуль встраивания бит сообщения (М.37) построен на основе выражений (5.10)—(5.12). В начале модуля создается вектор двоичных данных на основе скрываемого сообщения М. Циклом изменения s выполняется встраивание отдельного бита , в блок с учетом соответствующего массива зон и маски .
Рассмотрим процедуру встраивания подробнее. На основе данных о принадлежности пикселей s-го блока к зоне 1 или 2, а также к категории "А"или "Z", подсчитывается количество, пикселей, удовлетворяющих одной из возможных комбинаций зон и категорий (1А, 12, 2А, 2Z). Результаты заносятся в соответствующий элемент массива n (рис. 5.21), который в начале подсчета имел нулевое значение.
Аналогично подсчитывается общая яркость пикселей, принадлежащих той или иной паре зон и категорий (конфигурация заполненного при этом массива соответствует предыдущему случаю — рис. 5.21).
По полученным результатам вычисляется массив средних значений яркости каждой из четырех групп пикселей. Для сокращения программных строк данное вычисление происходит с использованием операции векторизации — одновременного выполнения некоторой скалярной математической операции (в нашем случае — деления) над всеми элементами массива(-ов), помеченными знаком векторизации " ". Конечно, такая параллельность вычисления относится не к самим вычислениям, а только к их алгоритмической записи. Поэтому кардинального изменения времени выполнения операции ждать при этом не приходится.
Рис. 6.21. Конфигурация массивов n и
Далее для каждой зоны рассчитываются средние значения яркости (формулы (5.11)), которые необходимо сохранить и после встраивания бита в сегмент изображения. Для решения системы уравнений (5.10), (5.I I) с двумя неизвестными или используется встроенная функция MathCAD решения линейной системы из n уравнений при n неизвестных — isolve(H,V), где H — квадратная несингулярная матрица; V— вектор, который имеет то же количество строк, что и матрица Н.
Для удобства изложения, перепишем данные системы в соответствии с принятыми в программном модуле (М.37) обозначениями:
• при b=1:
• при b=0:
где x — номер зоны.
При любом значении бита b, функция isolve( ) вычисляется дважды (для каждой из зон). Результатом ее вычисления является вектор из двух элементов, значения которых соответствуют искомым неизвестным. Полученные два вектора объединяем столбец к столбцу, а результат объединения транспонируем (чтобы перейти к конфигурации, изображенной на рис. 5.21).
На заключительном этапе вычисляется разница (5.12). Результат вычисления (который, разумеется, также имеет конфигурацию, соответствующую рис.5.21) присваивается s-му элементу вектора .
Шаг 7
Модифицируем блоки изображения, используя программный модуль (М.38). При этом, если номер блока превышает общее количество бит в сообщении (LM), то модификация блока не проводится
Шаг 8
Возвращаем блоки на соответствующие им места в изображении, используя модуль (М.39). На первом этапе первые X/N блоков (в нашем случае —16) объединяются в один общий массив путем объединения последней строки предыдущего блока с первой строкой последующего (функция stack( )). В дальнейшем с помощью цикла подобная операция повторяется над каждой следующей группой из X/N блоков. Сгруппированные таким образом блоки параллельно объединяются между собой столбец к столбцу (функция augment()).
Воссозданное на основе массива ВМ изображение в большинстве случаев будет слишком искаженным (рис. 5.22) из-за уже упомянутого выше выхода значений интенсивностей пикселей за пределы диапазона [0; 255]. Поэтому данный массив необходимо дополнительно пронормировать, для чего, например, можно восползоваться программным модулем (М 40).
Рис. 6.22. Сравнение первичного (В), модифицированного (ВМ) (при значении Е=35) и дополнительного нормированного (ВМnorm) изображений
Шаг 9
Перейдем к извлечению скрытого сообщения. Принятые обозначения:
• ВМ* — заполненный контейнер;
• X* и Y" — соответственно, размеры контейнера по вертикали (количество строк пикселей) и горизонтали (количество столбцов);
• N* — размерность выделяемого блока контейнера;
• N*s — общее количество блоков;
• T*1 ,T*2 — значения первого и второго порогов сравнения;
• * — массив секретных масок.
Программные модули разбиения изображения на блоки (SM*) и классификации пикселей блока на зоны (Zone*) аналогичны, соответственно, модулям (М.34) и (М.35).
В отличие от операции встраивания, когда вычисление количества пикселей п, удовлетворяющих одной из возможных комбинаций зон и категорий, а также средних значений яркости каждой из четырех групп пикселей выполнялось непосредственно в программном модуле (см. (М.37)), при извлечении указанные массивы необходимо сформировать отдельно — (М,41), (М.42).
Сравнение средних значений яркости для каждой из зон (формула (5.13)) выполняем, используя модуль (М.43).
Непосредственно модуль извлечения — (М.44), в котором реализована проверка условий, изложенных в теоретическом описании данного метода. Параметр выбирается достаточно близким к нулю (~ 0,05).
Вектор двоичных данных, возвращаемый модулем (М.44), преобразуется в строку символов аналогично тому, как это было при моделировании предыдущих методов.
Результаты, полученные при вычислении параметров визуального искажения занесены в табл. 5.1 (стр. 125).