将一张图像隐写在另一张图像中代码实现(Python)

第一部分:
Steganography.py
隐写方法代码块

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import click
from PIL import Image
import numpy as np
import cv2


def int_to_bin(rgb):
        r=rgb[0]
        g=rgb[1]
        b=rgb[2]

        return ('{0:08b}'.format(r),
                '{0:08b}'.format(g),
                '{0:08b}'.format(b))


def bin_to_int(rgb):
    #将字符串元组转换为整数元组
    r,g,b=rgb
    return [int(r, 2),
            int(g, 2),
            int(b, 2)]


def merge_rgb(rgb1, rgb2):
    #合并两个RGB元组
    r1, g1, b1 = rgb1
    r2, g2, b2 = rgb2
    rgb = (r1[:4] + r2[:4],
            g1[:4] + g2[:4],
            b1[:4] + b2[:4])
    return rgb


def merge(img1, img2):
        #合并2个图像
        #检查图像1>图像2?
        if img2.shape[0] > img1.shape[0] or img2.shape[1] > img1.shape[1]:
            raise ValueError('Image 2 should not be larger than Image 1!')


        #创建新的已合并图像
        new_image = np.zeros(img1.shape, np.uint8)

        for i in range(img1.shape[0]):
            for j in range(img1.shape[1]):
                rgb1 = int_to_bin(img1[i, j])

                #使用黑色像素0作为默认值
                rgb2 = int_to_bin([0,0,0])

                #检查像素贴图位置是否对img2有效 check if the pixel map position is valid for img2
                if i < img2.shape[0] and j < img2.shape[1]:
                    rgb2 = int_to_bin(img2[i, j])

                #合并两个像素并将其转换为整数元组 merge the two pixels and convert it to a integer tuple
                rgb =  merge_rgb(rgb1, rgb2)

                new_image[i, j] = bin_to_int(rgb)
        print("隐写图像成功!!!")
        return new_image




def unmerge(img):
        #create the new image
        new_image = np.zeros(img.shape, np.uint8)

        #list used to store the image original size
        original_size = img.shape[:2]

        for i in range(img.shape[0]):
            for j in range(img.shape[1]):
                #get RGB from the current pixel
                r, g, b = int_to_bin(img[i, j])

                #extract the last 4 bits 
                #concatenate 4 zero bits
                rgb = (r[4:] + '0000',
                       g[4:] + '0000',
                       b[4:] + '0000')

                #convert it to an integer array with r,g,b values
                new_image[i, j] = bin_to_int(rgb)

                #if valid store as the last valid position
                if new_image[i, j][0]!=0 and new_image[i, j][1]!=0 and new_image[i, j][2]!=0:
                    original_size = [i + 1, j + 1]

        #crop the image based on valid pixels

        crop_img = new_image[0: original_size[0], 0: + original_size[1]]
        print("Hidden image extracted successfully...")
        return crop_img

第二部分:
Encode.py
秘密图像隐写实现

from PIL import Image
import Steganography as st
import cv2


img1=cv2.imread('img1.jpg',1)
img2=cv2.imread('img2.jpg',1)
img1=cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2=cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

output_image=st.merge(img1,img2)
cv2.imwrite('result/merged_image1.png',output_image)

第三部分:
Decode.py
隐写图像获得秘密图像

from PIL import Image
import Steganography as st
import cv2

img=cv2.imread('result/merged_image1.png',1)
img=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
hid_image=st.unmerge(img)
cv2.imwrite('result/secret_image2.png',hid_image)

效果演示:
img1:
在这里插入图片描述
img2:
在这里插入图片描述
隐写结果:
在这里插入图片描述
觉得不错的话,点个赞呗!

猜你喜欢

转载自blog.csdn.net/qq_48951688/article/details/125312837
今日推荐