Формирование стегосообщения, представляющего собой контейнер с занесенной цифровой Фурье-голограммой методом LSB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:37, 1 июня 2017.
Open book.svg Авторство
А.С. Боровова
Согласовано: 2011

Описание задачи

Решаемая задача

  1. Получить цифровую Фурье-голограмму изображения. Тип файла, содежащего изображение – произвольный. Допустима обработка черно-белого изображения.
  2. Восстановить голограмму по известному ключу.
  3. Сформировать стегосообщение, представляющее собою контейнер с занесенной цифровой Фурье-голограммой методом LSB.
  4. Восстановить стего.

Исходные и выходные данные

Исходные данные

В качестве примеров сообщений предлагаются изображения :

Поменять его можно в строке: Image := READBMP("sample1.bmp")

А в качестве вариантов контейнеров:

Изменить его можно в строке: Img2 := READRGB("input1.bmp")

Рекомендуется в качестве сообщения использовать черно-белые изображения не очень большого размера, а в качестве изображания-контейнера наоборот изображение большого размера.

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

Файл output.bmp – изображение, содержащие стегосообщение. Файлы output1.bmp, output2.bmp, output3.bmp - восстановленные из голограммы Фурье изображения из файлов sample1.bmp, sample2.bmp, sample3.bmp соответственно.

Рис.6 output.bmp

Файлы output1.bmp, output2.bmp, output3.bmp- восстановленные из голограммы Фурье изображения из файлов sample1.bmp, sample2.bmp, sample3.bmp соответственно.

Решение задачи

Получить цифровую Фурье-голограмму изображения

Тестовый объект, в данном случае - изображение, подсвечивается параллельным пучком виртуального монохроматического излучения. В задней фокальной плоскости виртуального Фурье-объектива располагается виртуальная регистрирующая среда, на которой записывается голограмма.

Загружаем исходное изображение из файла: Image := READBMP("sample1.bmp")

Определяем его высоту и ширину, и увеличиваем их в два раза, чтобы избежать наложения двух образов: Height := rows(Image) * 2 Width := cols(Image) * 2 В данном случае Height и Width равны 256.

Задаем счетчики: k := 0 .. Height-1 l := 0 .. Width-1

Задаем угол θ, кототрый будет являться ключом для восстановления голограммы: θ := 0.5

Выбираем фазу опорного пучка излучения: φ := 0.5

Дополняем изображение нулями справа и снизу, приводим яркость пикселей к значению в диапазоне от 0 до 1:

OiRS Chesnokov holo signal ij.png

Делаем преобразование Фурье для полученного сигнала: F := cfft(Signal)

Подсвечиваем тест-объект пучком когеретного излучения, избавляясь от эффекта близнецов:

OiRS Chesnokov holo F lighted ij.png

Интерфереционная картина, образуемая в плоскости регистрации голограммы, описывается выражением:

OiRS Chesnokov holo I ij.png
OiRS Borovova holo I.png

Квадратичный «фоторегистратор» записывает распределение контраста в виде:

OiRS Chesnokov holo Hologram ij.png
OiRS Borovova holo Hologram.png

Линии уровня (Contour Plot) для голограмы:

OiRS Borovova holo Hologram Contour Plot.png

На этом завершается получение Фурье-голограммы и первый этап.

Восстановить голограмму по известному ключу

На втором этапе нам необходимо сформировать стегосообщение. Для начала рассмотрим работу необходимых функций:

Получение бита:

OiRS Borovova holo GetBit.png

Запись бита:

OiRS Borovova holo SetBit.png

Разбиение байтов на биты: Эта функция разбивает массив байтов на массив битов (в 8 раз длинне), а так же добавляет в конец стоп-сигнал (байт 11111111).

OiRS Borovova holo Byte2Bit.png

Сбор битов в байт: Функиция, обратная к Byte2Bit, превращает набор из 8 битов в байт

OiRS Borovova holo Bit2Byte.png

Ключевой сдвиг стего

Функция кодирования (фактически реализует циклический сдвиг вправо):

OiRS Borovova holo Encode.png

Функции декодирования (фактически реализует циклический сдвиг влево):

OiRS Borovova holo Decode.png

Вставка стего:
Функция добавления стегосообщения к изображению. Имеет 4 параметра: Само изображение (в виде массива байтов), сообщение (в виде массива байтов), ключ стего (целое число), глубина стего (сколько бит в каждом байте будет отведено под скрытое сообщение).
Функция работает следующим образом: сначала сообщение превращается из набора байтов, в набор битов, к нему дописывается признак конца(255). Затем происходит циклический сдвиг внутри каждых 8 бит, а затем происходит запись стегоинформации в изображение.

OiRS Borovova holo InsertStego.png

Извлечение стего:
Функция извлечения стегосообщения из изображения. Имеет 3 параметра: Само изображение (в виде массива байтов), ключ стего (целое число), глубина стего (сколько байт каждого бита извлекать). Функция работает следующим образом: сначала во временную переменную извлекается 8 битов, затем они декодируются (сдвигаются) и затем из них формируется байт стегосообщения и пишется в выходной массив, так делается до тех пор, пока не будет встречен признак конца сообщения (255)

OiRS Borovova holo ExtractStego.png

Теперь введем необходимые параметры

Параметры записи/чтения: Ключ записи: key_w := 5 Ключ чтения: key_r := 5 Глубина чтения/записи: q := 2

Загружаем изображение, которое выступать в роли контейнера. Img2 := READRGB("input1.bmp")

Запомним параметры голограммы: rH := rows(Hologram) cH := cols(Hologram)

Приводим квадратную матрицу голограммы к виду матрицы-столбца, а ее значения к виду необходимому для обработки функциями вставки\извлечения стего:

OiRS Borovova holo data icolsHolo.png

Записываем голограмму в изображение:

OiRS Borovova holo Stego img.png

Запись полученного стего в файл: WRITERGB("output.bmp") := Stego_img

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

Сформировать стегосообщение

Извлекаем стего, для этого необходимо знать ключ: DataNew := ExtractStego(Stego_img, key_r, q)

Функция, возвращающая матрице и ее параметрам исходный вид:

OiRS Borovova holo Revert.png

Получаем исходную голограмму: HologramNew := Revert(DataNew, rH, cH)

Можем убедиться, что полученная голограмма соответствует исходной с небольшой погрешностью:

OiRS Borovova holo Hologram table.png
OiRS Borovova holo HologramNew table.png

Восстановление стего

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

Примем ключ для восстановления равным исходному ключу θ: θ1 := θ

Подсвечиваем голограмму пучком когерентного излучения и освещаем ее опорным пучком:

OiRS Borovova holo H lighted ij.png

Делаем обратное преобразование Фурье: BF := cfft(H_lighted)

Отражаем получившееся изображение по вертикали и горизонтали:

OiRS Chesnokov holo BFF ij.png

Делаем счетчики до половины изображения по высоте и ширине: k := 0 .. Height/2 l := 0 .. Width/2

Нормализуем выражение:

OiRS Chesnokov holo BFFn kl.png
OiRS Borovova holo BFFn.png

output := WRITEBMP("output1.bmp", BFFn)

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

В результате данной работы была получена Фурье-голограмма черно-белого изображения в формате BMP и произведено ее востановление и сохранение результата в формат BMP. Также было сформировано стегосообщение, представляющее собою контейнер с занесенной цифровой Фурье-голограммой методом LSB.

В данной работе активно использовались результаты исследований моих коллег Чеснокова В.О. и Трифонова А.А. с их согласия.

Изображения

Исходные изображения

Восстановленные голограммы