Изображение стеганографического скрипта не дает правильных результатов - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь создать сценарий стеганографии изображений в python 3.7.2, используя библиотеку изображений в PIL.Мой сценарий скрытия одного изображения внутри другого не работает должным образом, после того, как сгенерированный файл hidden.png извлекается снова, он выводит либо полностью черные изображения, либо изображения с меньшей контрастностью и разными цветами в зависимости от количества выбранных битов.(Мой сценарий извлечения протестирован и работает.) Обычно я выбираю 4 бита, но он все еще не работает должным образом в 7.

Вот мой код для скрывающего сценария:

def hide(medium, secret_image, lsb):
    medimage = Image.open(medium).convert(mode="RGB") #open the medum
    secretimage = Image.open(secret_image).convert(mode="RGB") #open the secret image
    medimage = medimage.resize(secretimage.size) #resize the medium to be same size as secret
    acrossrow = 0 #start at first row
    downcol = 0 #start at first column
    secret = secretimage.load() #load pixels from secretimage
    med = medimage.load()
    while acrossrow < secretimage.height:
        downcol = 0 #stay first column until reach bottom row
        while downcol < secretimage.width:
            r, g, b, = secret[acrossrow,downcol] #r,g,b = the rgb of secret image pixel
            r = (r >> 8 - lsb) #shift amount of significant bits wanted to the end for hiding
            g = (g >> 8 - lsb)
            b = (b >> 8 - lsb)
            r1, g1, b1 = med[acrossrow,downcol] #more rgb values for medium
            r1 = r1 & (0b11111111 << lsb) #remove the last n amount of bits for replacing
            g1 = g1 & (0b11111111 << lsb)
            b1 = b1 & (0b11111111 << lsb)
            r1 = r1 | r #compare medium with secret, combining all 1s
            g1 = g1 | g
            b1 = b1 | g
            med[acrossrow,downcol] = (r1, g1, b1) #send new rgb values to medium
            downcol = downcol + 1 #go to next column
        acrossrow = acrossrow + 1 #go to next row
    medimage.save('hidden.png') #save modified image to new file
    medimage.show() #open and display new image

К вашему сведению: medium = путь к носителю, secret_image = путь к секрету, а lsb - количество бит, которые я хочу спрятать из секретного изображения в среду.

Я просмотрел свой код и не могучтобы увидеть проблему, если кто-то может мне помочь, это было бы здорово.Спасибо!

РЕДАКТИРОВАТЬ: Вот ссылка на полный скрипт, если вы хотите его протестировать или построить на нем. Вот ссылка на мой тест hidden.png Вот этотиспользует 2 lsb Вот ссылка на носитель. Вот ссылка на секретное изображение. Для связанного носителя и секретного изображения я использую 4 lsb.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

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

def hide(medium, secret_image, lsb):
    medimage = Image.open(medium).convert(mode="RGB")
    secretimage = Image.open(secret_image).convert(mode="RGB")
    medimage = medimage.resize(secretimage.size)
    acrossrow = 0
    downcol = 0
    secret = secretimage.load()
    med = medimage.load()
    result = Image.new("RGB", medimage.size)
    r_pixels = result.load()
    while acrossrow < secretimage.height:
        downcol = 0
        while downcol < secretimage.width:
            m_r, m_g, m_b = med[acrossrow, downcol]
            s_r, s_g, s_b = secret[acrossrow, downcol]
            r = (m_r >> lsb << lsb) | (s_r >> (8 - lsb))
            g = (m_g >> lsb << lsb) | (s_g >> (8 - lsb))
            b = (m_b >> lsb << lsb) | (s_b >> (8 - lsb))
            r_pixels[acrossrow, downcol] = r, g, b
            downcol = downcol + 1
        acrossrow = acrossrow + 1
    result.save('testhid.png')
    result.show()
    result.close() 
    medimage.close()
    secretimage.close()

Теперь он отлично работает на изображении, размещенном @martineau с желтым мозгомв обоих.Ссылка на мой обновленный код: здесь. Если кто-нибудь может объяснить, почему это работает, а мой оригинальный код не работает, это было бы здорово!Спасибо!

0 голосов
/ 13 февраля 2019

Что ж, после изучения добавленных вами изображений и выполнения моих собственных тестов, насколько я могу судить, ваш код работает правильно.Для моего собственного теста я применил вашу функцию hide() к файлу brain.png, используя sat.png в качестве "среднего" изображения, и проверил получившийся файл hidden.png, который ваша функция extract() генерирует из него в связанном коде (используя lsb значение 4).

Да, цвета в результате немного отличаются от оригинала, но этого следовало ожидать, потому что используемый процесс сокрытия эффективно уменьшает 24 бита на пиксель оригинала (3 x 8) до 12(3 * 4), поэтому такие вещи, как контраст, по понятным причинам пострадают.

Ниже приведены исходные (слева) и извлеченные версии изображения, показанные рядом в моем редакторе изображений, показывающие эти различия:

Я думаю, что проблема может быть просто в том, что вы нене совсем понимаю, как работает этот конкретный стеганографический метод.

side-by-side display of original and extracted images

...