Скрыть сообщение в наименее значащем бите изображения в оттенках серого

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

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

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

Это для изображения в оттенках серого с использованием python 3.x.

from PIL import Image

import numpy as np
import bitget
import scipy.misc as smp

im = Image.open("catBlack.png") #Can be many different formats.
pix = im.load()
print (im.size )#Get the width and hight of the image for iterating over
print (pix[1,1]) #Get the RGBA Value of the a pixel of an image
#pix[x,y] = value # Set the RGBA Value of the image (tup


data = np.zeros( (im.size[0],im.size[1],2), dtype=np.uint8 )

for i in range (im.size[0]):
    for j in range (im.size[1]):
        print (i,j)
        data[i,j] = pix[i,j]

im = Image.fromarray(data)
im.save("GreyCat.png")

Кроме того, как бы я расшифровал это сообщение

Спасибо за помощь


person bpb101    schedule 09.12.2016    source источник
comment
Я голосую за закрытие как слишком широкое, потому что вы спрашиваете обо всем процессе стеганогафии. Если вы понимаете этапы кодирования, декодирование должно быть обратным. И кодирование можно разбить на более мелкие вопросы, которые вы задали. Однако они довольно тривиальны, 1 и 2.   -  person Reti43    schedule 09.12.2016
comment
Я спрашиваю тему в целом, так как я не знаю, с чего начать? Как это сделать? как мне сделать замену. вы получаете пиксель, конвертируете его в биты и помещаете значение бита asci вместо младшего разряда пикселя изображения. Каждый строковый символ занимает несколько бит. Как сигнализировать конец текста и начало текста   -  person bpb101    schedule 09.12.2016
comment
вы можете рассмотреть существующие steganography_tools   -  person Skycc    schedule 09.12.2016


Ответы (1)


После прочтения сообщения вы можете преобразовать его в код ascii (диапазон ascii существует между 0 и 127), т.е. вам потребуется макс. 7 бит для представления буквы

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

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

ascii код h - 73 двоичный код 73 - 1001001 ascii код i - 74 ascii код i -1001010

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

предположим, что значение цвета

1111111 для первого пикселя
0101010 для второго
1100110 для третьего
1111111 для четвертого
0001111 для пятого
1011111 для шестого
1100110 для седьмого
1110001 для восьмого
1111111 для девятого
1010101 для десятого

сначала мы должны передать h (01001001), поэтому мы изменим последние два бита 4 пикселей, новые значения цвета будут примерно такими

1111101 для первого пикселя
0101000 для второго
1100110 для третьего
1111101 для четвертого

теперь для i (01001010) значения будут такими, как

0001101 для пятой
1011100 для шестой
1100110 для седьмой
1110010 для восьмой

теперь мы изменим последние биты оставшихся пикселей на все нули
1111100 для девятого
1010100 для десятого

person Ash-Ishh..    schedule 09.12.2016
comment
Супер. действительно хорошо объяснил. Один вопрос: для остальных пикселей вы меняете последние 2 бита на 00 или оставите их как есть? - person bpb101; 09.12.2016
comment
вы должны изменить их на нули, которые помогут определить конец сообщения (во время декодирования значение ascii 0 равно нулю).. если вы не сделаете их нулями во время декодирования сообщения, оно попытается декодировать оставшиеся биты и вы получите нежелательное сообщение в конце.. - person Ash-Ishh..; 09.12.2016